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]
# 得到 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
-----
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。