Python OpenCV 繪製文字 putText

本篇將介紹如何使用 OpenCV 與 Python 來繪製文字 putText,在寫 Python 影像處理程式時常會用到 OpenCV cv2.putText() 繪製文字的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來進行繪製文字 putText。

使用範例

以下示範 cv2.putText() 的用法,一開始建立 640*480 大小的影像,並填充128灰階值的背景顏色
接著使用 cv2.putText() 將 Hello, World! 這個字串繪製在 (100, 50) 的影像座標上,
並指定顏色為黃色 (0, 255, 255),最後 imshow 顯示出來就是結果啦!
詳細程式碼如下:

opencv-putText.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

text = 'Hello, World!'
cv2.putText(image, text, (100, 50), cv2.FONT_HERSHEY_SIMPLEX,
1, (0, 255, 255), 1, cv2.LINE_AA)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

cv2.putText 參數為

1
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

圖片影像/繪製的文字/左上角坐標/字體/字體大小/顏色/字體粗細/字體線條種類
img – 要繪製文字的影像
text – 要繪製的文字
org – 文字左下角在影像中的座標位置
fontFace – 文字字體, 選項有 FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, or FONT_HERSHEY_SCRIPT_COMPLEX
fontScale – 文字縮放比例
color – 文字顏色
thickness – 文字線條粗細度
lineType – 文字線條樣式
bottomLeftOrigin – When true, the image data origin is at the bottom-left corner. Otherwise, it is at the top-left corner.

cv2.putText() 參數最少填六個,第六個為顏色,
例如這樣,

1
cv2.putText(img, text, org, fontFace, fontScale, color)

有近一步需求再帶入其它參數,
cv2.putText 參數的詳細細節請參考這裡

範例. 用 putText 繪製顯示系統當前時間

這範例要將系統時間繪製顯示在影像上,例如:10:30:59 PM
之前有介紹詳細過Python 取得系統當前時間的使用方法可以回去看看
這邊我們用 putText 將 系統時間繪製在影像上。

opencv-putText2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

localtime = time.localtime()
text = time.strftime("%Y-%m-%d %I:%M:%S %p", localtime)
cv2.putText(image, text, (100, 50), cv2.FONT_HERSHEY_SIMPLEX,
1, (0, 255, 255), 1, cv2.LINE_AA)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

範例. 用 putText 繪製數字另存圖片檔

這邊示範用 putText 繪製數字 7 並另存圖片檔,

opencv-putText3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 128x128 black image
image = np.zeros((128, 128, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (30, 30, 30)

fontFace = cv2.FONT_HERSHEY_COMPLEX
fontScale = 3
thickness = 2
text = '7'
testSize = cv2.getTextSize(text, fontFace, fontScale, thickness)
#print(testSize)
bottomLeftX = 64-int(testSize[0][0]/2)
bottomLeftY = 64+int(testSize[0][1]/2)
cv2.putText(image, text, (bottomLeftX, bottomLeftY), fontFace,
fontScale, (0, 255, 255), thickness, cv2.LINE_AA)

cv2.imshow('Result', image)
cv2.imwrite('7.jpg', image)
cv2.waitKey(0)

結果如下圖所示:

範例. 用 putText 繪製物件偵測的標籤

用 OpenCV 作物件偵測時,需要將物件標示出來,並且顯示該物件的標籤名稱,這在物件偵測中還蠻實用且常用到的功能,

opencv-drawBoundingBox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

def drawBoundingBox(img, bboxs):
for box in bboxs:
x1,y1,x2,y2 = (box['x1'], box['y1'], box['x2'], box['y2'])
label = box['label']
cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 6)
fontFace = cv2.FONT_HERSHEY_COMPLEX
fontScale = 0.5
thickness = 1
labelSize = cv2.getTextSize(label, fontFace, fontScale, thickness)
_x1 = x1 # bottomleft x of text
_y1 = y1 # bottomleft y of text
_x2 = x1+labelSize[0][0] # topright x of text
_y2 = y1-labelSize[0][1] # topright y of text
cv2.rectangle(img, (_x1,_y1), (_x2,_y2), (0,255,0), cv2.FILLED) # text background
cv2.putText(img, label, (x1,y1), fontFace, fontScale, (0,0,0), thickness)
return img

# Create a blank 640x640 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

bboxs = []
box = {}
box['label'] = 'object 1'
box['x1'] = 40
box['y1'] = 40
box['x2'] = 180
box['y2'] = 180
bboxs.append(box)
box2 = {'label': 'object 2', 'x1': 300, 'y1': 200, 'x2': 600, 'y2': 440}
bboxs.append(box2)
drawBoundingBox(image, bboxs)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

其它相關文章推薦
Python OpenCV 畫矩形 rectangle
Python OpenCV 畫多邊形 polylines
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 灰階轉彩色(Gray to RGB/BGR)
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 影像平滑模糊化 blur
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV resize 圖片縮放

Python OpenCV 填充多邊形 fillPoly

本篇將介紹如何使用 OpenCV 與 Python 來填充多邊形 fillPoly,在寫 Python 影像處理程式時常會用到 OpenCV cv2.fillPoly 填充多邊形的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來填充多邊形 fillPoly。

使用範例

詳細程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

points = np.array([[200, 200], [300, 100], [400, 200], [400, 400], [200, 400]])
red_color = (0, 0, 255) # BGR
cv2.fillPoly(image, [points], red_color)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

cv2.fillPoly 參數的詳細細節請參考這裡

其它相關文章推薦
Python OpenCV 畫線條 line
Python OpenCV 畫圓 circle
Python OpenCV 畫橢圓 ellipse
Python OpenCV 畫矩形 rectangle
Python OpenCV 繪製文字 putText

Python OpenCV 畫多邊形 polylines

本篇將介紹如何使用 OpenCV 與 Python 來畫多邊形 polylines,在寫 Python 影像處理程式時常會用到 OpenCV cv2.polylines 畫多邊形的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來畫多邊形 polylines。

使用範例

詳細程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

points = np.array([[200, 200], [300, 100], [400, 200], [400, 400], [200, 400]], np.int32)
red_color = (0, 0, 255) # BGR
cv2.polylines(image, pts=[points], isClosed=True, color=red_color, thickness=3)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

cv2.polylines 參數的詳細細節請參考這裡

其它相關文章推薦
Python OpenCV 畫線條 line
Python OpenCV 畫圓 circle
Python OpenCV 畫橢圓 ellipse
Python OpenCV 畫矩形 rectangle
Python OpenCV 繪製文字 putText

Python OpenCV 畫矩形 rectangle

本篇將介紹如何使用 OpenCV 與 Python 來畫矩形 rectangle,在寫 Python 影像處理程式時常會用到 OpenCV cv2.rectangle 畫矩形的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來畫矩形 rectangle。

使用範例

詳細程式碼如下:

opencv-rectangle.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

red_color = (0, 0, 255) # BGR
cv2.rectangle(image, (100, 100), (400, 200), red_color, 3, cv2.LINE_AA)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

函式用法與參數解釋:
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img – Image.
pt1 – Vertex of the rectangle.
pt2 – Vertex of the rectangle opposite to pt1 .
rec – Alternative specification of the drawn rectangle.
color – Rectangle color or brightness (grayscale image).
thickness – Thickness of lines that make up the rectangle. Negative values, like CV_FILLED , mean that the function has to draw a filled rectangle.
lineType – Type of the line. See the line() description.
shift – Number of fractional bits in the point coordinates.

cv2.rectangle 參數的詳細細節請參考這裡

範例. 用 rectangle 繪製物件偵測的範圍

用 OpenCV 作物件偵測時,需要將物件框選標示出來,並且顯示該物件的範圍與標籤名稱,這在物件偵測中還蠻實用且常用到的功能,

opencv-drawBoundingBox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

def drawBoundingBox(img, bboxs):
for box in bboxs:
x1,y1,x2,y2 = (box['x1'], box['y1'], box['x2'], box['y2'])
label = box['label']
cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 6)
fontFace = cv2.FONT_HERSHEY_COMPLEX
fontScale = 0.5
thickness = 1
labelSize = cv2.getTextSize(label, fontFace, fontScale, thickness)
_x1 = x1 # bottomleft x of text
_y1 = y1 # bottomleft y of text
_x2 = x1+labelSize[0][0] # topright x of text
_y2 = y1-labelSize[0][1] # topright y of text
cv2.rectangle(img, (_x1,_y1), (_x2,_y2), (0,255,0), cv2.FILLED) # text background
cv2.putText(img, label, (x1,y1), fontFace, fontScale, (0,0,0), thickness)
return img

# Create a blank 640x640 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

bboxs = []
box = {}
box['label'] = 'object 1'
box['x1'] = 40
box['y1'] = 40
box['x2'] = 180
box['y2'] = 180
bboxs.append(box)
box2 = {'label': 'object 2', 'x1': 300, 'y1': 200, 'x2': 600, 'y2': 440}
bboxs.append(box2)
drawBoundingBox(image, bboxs)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

其它相關文章推薦
Python OpenCV 畫線條 line
Python OpenCV 畫圓 circle
Python OpenCV 畫橢圓 ellipse
Python OpenCV 畫多邊形 polylines
Python OpenCV 繪製文字 putText

Python OpenCV 畫橢圓 ellipse

本篇將介紹如何使用 OpenCV 與 Python 來畫橢圓 ellipse,在寫 Python 影像處理程式時常會用到 OpenCV cv2.ellipse 畫橢圓的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來畫橢圓 ellipse。

使用範例

詳細程式碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

center = (300, 300)
axes = (100, 50)
angle = 45
startAngle = 0
endAngle = 270
thickness = -1
color = (0, 0, 255) # BGR red
cv2.ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness)
#cv2.ellipse(image, (300, 300), (100, 50), 45, 0, 270, (0, 0, 255), -1)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

cv2.ellipse 參數的詳細細節請參考這裡

其它相關文章推薦
Python OpenCV 畫線條 line
Python OpenCV 畫圓 circle
Python OpenCV 畫矩形 rectangle
Python OpenCV 畫多邊形 polylines
Python OpenCV 繪製文字 putText

Python OpenCV 畫圓 circle

本篇介紹如何使用 OpenCV 與 Python 來畫圓 circle,在寫 Python 影像處理程式時常會用到 OpenCV cv2.circle 畫圓的功能,接下來介紹怎麼使用 Python 搭配 OpenCV cv2.circle 來畫圓與用法。

使用範例

以下範例為 cv2.circle 的用法,一開始先建立 640*480 大小的影像,
再來將這張影像填充為 128 灰階值,
接著用 cv2.circle 在 (300, 300) 座標位置上畫圓,並且指定圓的顏色為紅色,
最後再用 imshow 顯示結果。
詳細程式碼如下:

opencv-circle.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

red_color = (0, 0, 255) # BGR
cv2.circle(image, (300, 200), 50, red_color, -1)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

函式用法與參數解釋:
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
img – Image where the circle is drawn.
center – Center of the circle.
radius – Radius of the circle.
color – Circle color.
thickness – Thickness of the circle outline, if positive. Negative thickness means that a filled circle is to be drawn.
lineType – Type of the circle boundary. See the line() description.
shift – Number of fractional bits in the coordinates of the center and in the radius value.

cv2.circle 參數的詳細細節請參考這裡

其它相關文章推薦
Python OpenCV 畫線條 line
Python OpenCV 畫橢圓 ellipse
Python OpenCV 畫矩形 rectangle
Python OpenCV 畫多邊形 polylines
Python OpenCV 繪製文字 putText

Python OpenCV 畫線條 line

本篇將介紹如何使用 OpenCV 與 Python 來畫線條 line,在寫 Python 影像處理程式時常會用到 OpenCV cv2.line 畫線條的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來進行畫線條 line。

使用範例

詳細程式碼如下:

opencv-line.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create a blank 640x480 black image
image = np.zeros((480, 640, 3), np.uint8)
# Fill image with gray color(set each pixel to gray)
image[:] = (128, 128, 128)

red_color = (0, 0, 255) # BGR
cv2.line(image, (100, 100), (300, 300), red_color, 3)

cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

函式用法與參數解釋:
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
img – 來源影像.
pt1 – 線條開始點.
pt2 – 線條結束點.
color – 線條顏色.
thickness – 線條粗細.
lineType – 線條類型:
8 (or omitted) - 8-connected line.
4 - 4-connected line.
CV_AA - antialiased line.
shift – Number of fractional bits in the point coordinates.

cv2.line 參數的詳細細節請參考這裡

其它相關文章推薦
Python OpenCV 畫圓 circle
Python OpenCV 畫橢圓 ellipse
Python OpenCV 畫矩形 rectangle
Python OpenCV 畫多邊形 polylines
Python OpenCV 繪製文字 putText

Python 取出目錄的路徑 dirname

本篇 ShengYu 介紹 Python 取出目錄的路徑 os.path.dirname() 的用法與範例,並示範在 linux、macOS、windows 各平台下的差異。
以下範例是在 Python 3 環境下測試過。

取出目錄的路徑

os.path.dirname() 為去除檔案名稱,回傳目錄的路徑,
使用 os.path.dirname() 時,需先 import os
由於 linux 與 windows 目錄字元不同,linux 與 macOS 一樣是使用 \ 斜線,windows 是使用 / 反斜線,
以下示範同樣的程式碼在 linux 與 windows 兩平台的執行結果差異,

詳細程式碼如下,

python3-os-path-dirname.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

print('dirname: ' + os.path.dirname('/home/user/aaa.txt'))
print('dirname: ' + os.path.dirname('C:\\User\\Desktop\\aaa.txt'))

linux 與 macOS 平台輸出結果如下,

1
2
dirname: /home/user
dirname:

windows 平台輸出結果如下:

1
2
dirname: 
dirname: C:\User\Desktop

下一篇介紹 取出檔案名稱 basename

其他參考
python中的os.path模块用法(一)_Python_ziyuzhao123的专栏-CSDN博客
https://blog.csdn.net/ziyuzhao123/article/details/8811496
Python os.path() 模块 | 菜鸟教程
https://www.runoob.com/python/python-os-path.html

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 取出檔案名稱 basename
Python 字串分割 split
Python 連接字串 join
Python 去除空白與去除特殊字元 strip
Python 取代字元或取代字串 replace

Python 取出檔案名稱 basename

本篇 ShengYu 介紹 Python 取出路徑中的檔案名稱 os.path.basename() 的用法與範例,並示範在 linux、macOS、windows 各平台下的差異。
以下範例是在 Python 3 環境下測試過。

取出路徑中的檔案名稱

os.path.basename() 為去除目錄的路徑,回傳檔案名稱(包含附檔名),
使用 os.path.basename() 時,需先 import os
由於 linux 與 windows 目錄字元不同,linux 與 macOS 一樣是使用 \ 斜線,windows 是使用 / 反斜線,
以下示範同樣的程式碼在 linux 與 windows 兩平台的執行結果差異,

程式碼如下,

python3-os-path-basename.py
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

print('basename: ' + os.path.basename('/home/user/aaa.txt'))
print('basename: ' + os.path.basename('C:\\User\\Desktop\\aaa.txt'))

linux 與 macOS 平台輸出結果如下,

1
2
basename: aaa.txt
basename: C:\User\Desktop\aaa.txt

windows 平台輸出結果如下,

1
2
basename: /home/user/aaa.txt
basename: aaa.txt

不包含附檔名的檔案名稱

如果取出的檔案名稱不想要包含附檔名的話可以使用 split 切割字串來去除副檔名,關於 split 的詳細用法可以參考這篇,這邊範例就只示範 linux/macOS 的路徑,windows 路徑在 windows 下一樣適用,

python3-os-path-basename2.py
1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

unix_path = '/home/user/aaa.txt'
basename = os.path.basename(unix_path).split('.')[0]
print('basename: ' + basename)

輸出結果為

1
basename: aaa

你也可以使用 os.path.splitext() 來達成同樣的效果,

python3-os-path-basename3.py
1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os

unix_path = '/home/user/aaa.txt'
basename = os.path.splitext(os.path.basename(unix_path))[0]
print('basename: ' + basename)

下一篇介紹 取出目錄的路徑 dirname

其他參考
python中的os.path模块用法(一)_Python_ziyuzhao123的专栏-CSDN博客
https://blog.csdn.net/ziyuzhao123/article/details/8811496
Python os.path() 模块 | 菜鸟教程
https://www.runoob.com/python/python-os-path.html

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python 新手入門教學懶人包
Python 取出目錄的路徑 dirname
Python 字串分割 split
Python 連接字串 join
Python 去除空白與去除特殊字元 strip
Python 取代字元或取代字串 replace

Python OpenCV 灰階轉彩色(Gray to RGB/BGR)

本篇將介紹如何使用 OpenCV 與 Python 來灰階轉彩色(Gray to RGB 或 Gray to BGR),在寫 Python 影像處理程式時常會用到 OpenCV cvtColor 作顏色空間轉換的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來進行 Gray to RGB/BGR 灰階轉彩色。

什麼情況會用到灰階轉彩色 COLOR_GRAY2RGB?
當你的原圖是灰階單一channel,但又想在上面畫有色彩的東西時,這時就可以將原本的灰階單一channel轉成三個channel,再去作處理。

範例. 灰階轉彩色

灰階單個channel 轉RGB三個channel

使用 cv2.cvtColor 轉換顏色空間時,第二個參數與灰階轉彩色相關的有:
COLOR_GRAY2RGB
COLOR_GRAY2BGR

opencv-gray-to-rgb.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# (1 channel)
print(gray.shape)
print(gray.ndim)

gray_three_channel = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
# (3 channel)
print(gray_three_channel.shape)
print(gray_three_channel.ndim)

# Fill a contour on both the single channel and three channel image
# (left up, right up, right down, left down)
contour = np.array([[200, 200], [400, 200], [400, 400], [200, 400]], np.int32)
yellow_color = [0, 255, 255] # BGR
cv2.polylines(gray, pts=[contour], isClosed=True, color=yellow_color, thickness=3)
cv2.polylines(gray_three_channel, pts=[contour], isClosed=True, color=yellow_color, thickness=3)

cv2.imshow('Input', gray)
cv2.imshow('Result', gray_three_channel)
cv2.waitKey(0)

輸出

1
2
3
4
(512, 512)
2
(512, 512, 3)
3

結果如下圖所示:

cv2.cvtColor 參數的詳細細節請參考這裡

範例2. 在單channel與三channel填色的差異

使用 cv2.cvtColor 將單個 channel 轉換成三個channel,
或者使用 cv2.merge 將單個 channel 合併成三個channel,

opencv-gray-to-rgb2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

# Create random color image
image = (np.random.standard_normal([200, 200, 3]) * 255).astype(np.uint8)

# Convert to grayscale (1 channel)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray_three_channel = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
# Merge channels to create color image (3 channels)
#gray_three_channel = cv2.merge([gray,gray,gray])

# Fill a contour on both the single channel and three channel image
contour = np.array([[10, 10], [110, 10], [110, 110], [10, 110]])
yellow_color = [0, 255, 255] # BGR
cv2.fillPoly(gray, [contour], yellow_color)
cv2.fillPoly(gray_three_channel, [contour], yellow_color)

cv2.imshow('Input', image)
cv2.imshow('Gray', gray)
cv2.imshow('Gray 3 channel', gray_three_channel)
cv2.waitKey()

結果如下圖所示:

參考
How does one convert a grayscale image to RGB in OpenCV (Python) for visualizing contours after processing an image in binary? - Stack Overflow
https://stackoverflow.com/questions/21596281/how-does-one-convert-a-grayscale-image-to-rgb-in-opencv-python-for-visualizing cv2.COLOR_GRAY2RGB Python Example
https://www.programcreek.com/python/example/81595/cv2.COLOR_GRAY2RGB

其它相關文章推薦
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 影像平滑模糊化 blur
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV resize 圖片縮放
小專案 Python OpenCV 圖片轉字元圖畫