2022年7月7日 星期四

titanic_0005:文字轉圖形(OpenCV)

titanic_0005:文字轉圖形(OpenCV)

2022/07/07

說明:

本文示範如何如何用 OpenCV 將 Python 的文字輸出從螢幕轉向到圖形檔。

-----

https://pixabay.com/zh/photos/umbrella-only-sad-depression-2603980/

-----

Q1:如何得到常用圖片檔的大小與文字檔的行數?

A1:參考代碼一 [1] - [3]。


1. 以常用的尺寸,先產生一張圖片。

2. 以 OpenCV 讀取 [1], [2]。

3. 將 info() 另存文字檔。

4. 讀檔後計算行數 [3]。


「cv2.IMREAD_COLOR:此為預設值,這種格式會讀取 RGB 三個 channels 的彩色圖片,而忽略透明度的 channel。cv2.IMREAD_UNCHANGED:讀取圖片中所有的 channels,包含透明度的 channel。」[1]。

以上是第一次閱讀參考文獻時,容易忽略的地方。在 channel 數為 4 ,也就是 RGBA 的格式時,疑問就產生了 [2]。


代碼一

# 代碼一
# 得到常用的圖片大小(1152, 1152)與 info() 行數(19)

import cv2
import matplotlib.pyplot as plt
import pandas as pd
import sys

# read train.csv
f_p = '/content/drive/My Drive/colab/data/titanic/' # file path
df = pd.read_csv(f_p+'train.csv')


# create t0005_1.png
df.plot(figsize = (16, 16), fontsize = 40)
plt.legend(fontsize = 30)
plt.savefig(f_p+'t0005_1.png')

img = cv2.imread(f_p+'t0005_1.png', cv2.IMREAD_COLOR)
print('Image Dimension: ', img.shape) # (1152, 1152, 3)


# create t0005_1.txt
old_stdout = sys.stdout
sys.stdout = open(f_p+'t0005_1.txt', 'w')
df.info()
sys.stdout.close()
sys.stdout = old_stdout

with open(f_p+'t0005_1.txt') as my_file:
    total_lines = sum(1 for line in my_file)
print('Total Lines: ', total_lines) # 19

-----

Q2:如何得到 OpenCV 所有字型的大小?

A2:參考代碼二 [4], [5]。


1. 查閱 OpenCV 有哪些字型 [4]。

2. 計算各種字型的大小 [5]。


代碼二

# 代碼二
# 得到字型大小(本例最大字型不超過 50)

import cv2

for t in range(1, 3): # thickness
    for fS in range(1, 3): # fontScale
        for fF in range(8): # fontFace
            textSize = cv2.getTextSize(
                text = 'c', fontFace = fF, fontScale = fS, thickness = t)
            print(textSize)
        print("\n")

-----

Q3:如何顯示 OpenCV 各個字型?

A3:參考代碼三 [6] - [8]。


代碼三

# 代碼三
# 輸出 cv2 字型到圖檔 t0005_2.png

import cv2
import numpy as np

from google.colab.patches import cv2_imshow

# 先設定圖片諸元
img = np.zeros((1152, 1152, 3), np.uint8)
x = 100
y = 100
position = (x, y)
# fontFace = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
fontScale = 2
fontColor = (255, 255, 0)
# thickness = 1

# 列印不同字體的句子到圖片的暫存區
str1 = 'April is the cruellest month.'
for fF in range(8): # fontFace
  for t in range(1, 3): # tnickness
    y = y + 50 # 換行
    position = (x, y)
    cv2.putText(img, str1, position, fF, fontScale, fontColor, t)

cv2_imshow(img)

# 存檔
f_p = '/content/drive/My Drive/colab/data/titanic/' # file path
cv2.imwrite(f_p+'t0005_2.png', img)

-----


Fig. 1. OpenCV 的八種字型與兩種線條粗度。

圖一

本例選了兩倍的字型大小。

-----

Q4:如何將 dataframe 的 info() 文字檔轉成圖形輸出?

A4:參考代碼四 [9], [10]。

重點在消除換行字元 [9], [10]。


代碼四

# 代碼四
# 輸出 info() 到圖檔 t0005_3.png

import cv2
import numpy as np

from google.colab.patches import cv2_imshow

img = np.zeros((1152, 1152, 3), np.uint8)
x = 100
y = 100
position = (x, y)
fontFace = cv2.FONT_HERSHEY_COMPLEX
fontScale = 1
fontColor = (255, 255, 0)

f_p = '/content/drive/My Drive/colab/data/titanic/' # file path
f = open(f_p+'t0005_1.txt')

for i in range(19):
    y = y + 50 # 換行
    position = (x, y)
    str1 = f.readline()
    newstr = str1.strip() # 去掉行末的換行字元避免產生問號
    cv2.putText(img, newstr, position, fontFace, fontScale, fontColor)

f.close()

cv2_imshow(img)
cv2.imwrite(f_p+'t0005_3.png', img)

-----


Fig. 2. 鐵達尼號訓練集的主要資訊。

圖二

通過代碼一到代碼三的練習後,代碼四主要將原來換行字元產生的問號消除。

-----

References


# OpenCV 存取圖片

[1] Python 與 OpenCV 基本讀取、顯示與儲存圖片教學 - G. T. Wang

https://blog.gtwang.org/programming/opencv-basic-image-read-and-write-tutorial/


# OpenCV 讀取圖片大小

[2] OpenCV Python - Get Image Size

https://www.tutorialkart.com/opencv/python/opencv-python-get-image-size/


# 得到檔案的行數

[3] 在 Python 中獲取檔案的行數 | D棧 - Delft Stack

https://www.delftstack.com/zh-tw/howto/python/python-get-number-of-lines-in-file/


# 所有 OpenCV 的字型

[4] Using all OpenCV text fonts - Mastering OpenCV 4 with Python [Book]

https://www.oreilly.com/library/view/mastering-opencv-4/9781789344912/16b55e96-1027-4765-85d8-ced8fa071473.xhtml


# 得到 OpenCV 字型的大小

[5] python - cv::HersheyFonts 的 OpenCV 字體基本大小是多少? - 堆棧溢出

https://stackoverflow.com/questions/46266776/what-is-the-opencv-font-base-size-for-cvhersheyfonts


# OpenCV 的 putText()

[6] OpenCV 將文字放置在影象上 | D棧 - Delft Stack

https://www.delftstack.com/zh-tw/howto/python/opencv-puttext/


# OpenCV 的 putText()

[7] Python OpenCV | cv2.putText() method - GeeksforGeeks

https://www.geeksforgeeks.org/python-opencv-cv2-puttext-method/


# OpenCV 顯示圖片

[8] cv2.imshow(img) is crashing the kernel · Issue #3935 · jupyter/notebook · GitHub

https://github.com/jupyter/notebook/issues/3935


# \n

[9] 在 Python 中讀取檔案的第一行 | D棧 - Delft Stack

https://www.delftstack.com/zh-tw/howto/python/read-first-line-in-python/


# 刪除換行字元

[10] 在 Python 中從字串中刪除換行符 | D棧 - Delft Stack

https://www.delftstack.com/zh-tw/howto/python/python-remove-newline-from-string/

-----

鐵達尼號 Python 實作(目錄)

https://mandhistory.blogspot.com/2022/06/titanic.html

-----

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。