youcans 的 OpenCV 学习课—4.图像的叠加与混合
youcans 的 OpenCV 學習課—4.圖像的疊加與混合
本系列面向 Python 小白,從零開始實戰解說 OpenCV 項目實戰。
本節介紹圖像的加法、疊加與混合,提供完整例程和運行結果:加法運算,加權加法,圖像混合、切換、遮罩、疊加,添加文字。詳細介紹綜合運用圖像閾值處理、圖像掩模、位操作和圖像加法的操作是基于掩模和位運算實現圖像疊加的方法。
歡迎關注 『youcans 的 OpenCV 學習課』 系列,持續更新
youcans 的 OpenCV 學習課—1.安裝與環境配置
youcans 的 OpenCV 學習課—2.圖像讀取與顯示
youcans 的 OpenCV 學習課—3.圖像的創建與修改
youcans 的 OpenCV 學習課—4.圖像的疊加與混合
youcans 的 OpenCV 學習課—5.圖像的幾何變換
youcans 的 OpenCV 學習課—6.灰度變換與直方圖處理
youcans 的 OpenCV 學習課—7.空間域圖像濾波
youcans 的 OpenCV 學習課—8.頻率域圖像濾波(上)
youcans 的 OpenCV 學習課—9.頻率域圖像濾波(下)
1. 圖像的加法運算
函數 cv2.add() 用于圖像的加法運算。
函數說明:
cv2.add(src1, src2 [, dst[, mask[, dtype]]) → dst函數 cv2.add() 對兩張相同大小和類型的圖像進行加法運算,或對一張圖像與一個標量進行加法運算。
兩張圖像相加時,將兩張圖像相同位置像素的各通道值或灰度值分別相加,可以理解為一種圖像疊加方式;對一張圖像與一個標量相加時,則將圖像所有像素的各通道值分別與標量的各通道值相加。
參數說明:
- scr1, scr2:進行加法運算的圖像,或一張圖像與一個 numpy array 標量
- dst:輸出的圖像,可選項,默認值為 None
- mask:掩模圖像,8位灰度格式;掩模圖像數值為 0 的像素,輸出圖像對應像素的各通道值也為 0。可選項,默認值為 None
- dtype:圖像數組的深度,即每個像素值的位數,可選項
- 返回值:dst,運算結果圖像,ndarray 多維數組
注意事項:
基本例程:1.22 圖像的加法
# 1.22 圖像的加法 (cv2.add)img1 = cv2.imread("../images/imgB1.jpg") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/imgB3.jpg") # 讀取彩色圖像(BGR)imgAddCV = cv2.add(img1, img2) # OpenCV 加法: 飽和運算imgAddNP = img1 + img2 # # Numpy 加法: 模運算plt.subplot(221), plt.title("1. img1"), plt.axis('off')plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)) # 顯示 img1(RGB)plt.subplot(222), plt.title("2. img2"), plt.axis('off')plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)) # 顯示 img2(RGB)plt.subplot(223), plt.title("3. cv2.add(img1, img2)"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddCV, cv2.COLOR_BGR2RGB)) # 顯示 imgAddCV(RGB)plt.subplot(224), plt.title("4. img1 + img2"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddNP, cv2.COLOR_BGR2RGB)) # 顯示 imgAddNP(RGB)plt.show()例程說明 1.22:
本例程運行結果如下圖所示。圖 3 是 cv2.add() 飽和加法的結果,圖 4 是 numpy 取模加法的結果。
- 飽和加法以 255 為上限,所有像素只會變的更白(大于原值);取模加法以 255 為模,會導致部分像素變黑 (小于原值)。
- 因此,一般情況下應使用 cv2.add 進行飽和加法操作,不宜使用 numpy 取模加法。
基本例程:1.23 圖像與標量相加
# 1.23 圖像的加法 (與標量相加)img1 = cv2.imread("../images/imgB1.jpg") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/imgB3.jpg") # 讀取彩色圖像(BGR)Value = 100 # 常數# Scalar = np.array([[50., 100., 150.]]) # 標量Scalar = np.ones((1, 3), dtype="float") * Value # 標量imgAddV = cv2.add(img1, Value) # OpenCV 加法: 圖像 + 常數imgAddS = cv2.add(img1, Scalar) # OpenCV 加法: 圖像 + 標量print("Shape of scalar", Scalar)for i in range(1, 6):x, y = i*10, i*10print("(x,y)={},{}, img1:{}, imgAddV:{}, imgAddS:{}".format(x,y,img1[x,y],imgAddV[x,y],imgAddS[x,y]))plt.subplot(131), plt.title("1. img1"), plt.axis('off')plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)) # 顯示 img1(RGB)plt.subplot(132), plt.title("2. img + constant"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddV, cv2.COLOR_BGR2RGB)) # 顯示 imgAddV(RGB)plt.subplot(133), plt.title("3. img + scalar"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddS, cv2.COLOR_BGR2RGB)) # 顯示 imgAddS(RGB)plt.show()例程說明 1.23:
本例程運行結果如下。
Shape of scalar [[150. 150. 150.]] (x,y)=10,10, img1:[ 9 9 69], imgAddV:[159 9 69], imgAddS:[159 159 219] (x,y)=20,20, img1:[ 3 252 255], imgAddV:[153 252 255], imgAddS:[153 255 255] (x,y)=30,30, img1:[ 1 255 254], imgAddV:[151 255 254], imgAddS:[151 255 255] (x,y)=40,40, img1:[ 1 255 254], imgAddV:[151 255 254], imgAddS:[151 255 255] (x,y)=50,50, img1:[ 1 255 255], imgAddV:[151 255 255], imgAddS:[151 255 255]- 注意 cv2.add() 對圖像與標量相加時,“常數” 與 “標量” 的區別:
- 將圖像與一個常數 value 相加,只是將 B 通道即藍色分量與常數相加,而 G、R 通道的數值不變,因此圖像發藍。
- 將圖像與一個標量 scalar 相加,“標量” 是指一個 1x3 的 numpy 數組,此時 B/G/R 通道分別與數組中對應的常數相加,因此圖像發白。
- 標量 numpy 數組的形式為:np.array([[c1, c2, c3]]),常數 c1,c2,c3 可以相同或不同。
2. 圖像的加權加法
函數 cv2.addWeight() 用于圖像的加權加法運算。
函數說明:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst函數 cv2.addWeighted() 對兩張相同大小和類型的圖像按權重相加,可以實現圖像的疊加和混合。加權加法的計算表達式為:
dst = src1 * alpha + src2 * beta + gamma
參數說明:
- scr1, scr2:ndarray 多維數組,表示一個灰度或彩色圖像
- alpha:第一張圖像 scr1 的權重,通常取為 0~1 之間的浮點數
- beta:第二張圖像 scr2 的權重,通常取為 0~1 之間的浮點數
- gamma: 灰度系數,圖像校正的偏移量,用于調節亮度
- dtype 輸出圖像的深度,即每個像素值的位數,可選項,默認等于 src1.depth()
- 返回值:dst,加權加法運算結果的圖像數組
注意事項:
基本例程:1.24 圖像的混合(加權加法)
# 1.24 圖像的混合(加權加法)img1 = cv2.imread("../images/imgGaia.tif") # 讀取圖像 imgGaiaimg2 = cv2.imread("../images/imgLena.tif") # 讀取圖像 imgLenaimgAddW1 = cv2.addWeighted(img1, 0.2, img2, 0.8, 0) # 加權相加, a=0.2, b=0.8imgAddW2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 0) # 加權相加, a=0.5, b=0.5imgAddW3 = cv2.addWeighted(img1, 0.8, img2, 0.2, 0) # 加權相加, a=0.8, b=0.2plt.subplot(131), plt.title("1. a=0.2, b=0.8"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddW1, cv2.COLOR_BGR2RGB)) # 顯示 img1(RGB)plt.subplot(132), plt.title("2. a=0.5, b=0.5"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddW2, cv2.COLOR_BGR2RGB)) # 顯示 imgAddV(RGB)plt.subplot(133), plt.title("3. a=0.8, b=0.2"), plt.axis('off')plt.imshow(cv2.cvtColor(imgAddW3, cv2.COLOR_BGR2RGB)) # 顯示 imgAddS(RGB)plt.show()本例程運行結果如下:
擴展例程:1.25 不同尺寸的圖像加法
# 1.25 不同尺寸的圖像加法imgL = cv2.imread("../images/imgB2.jpg") # 讀取大圖imgS = cv2.imread("../images/logoCV.png") # 讀取小圖 (LOGO)x,y = 300,50 # 疊放位置W1, H1 = imgL.shape[1::-1] # 大圖尺寸W2, H2 = imgS.shape[1::-1] # 小圖尺寸if (x + W2) > W1: x = W1 - W2 # 調整圖像疊放位置,避免溢出if (y + H2) > H1: y = H1 - H2imgCrop = imgL[y:y + H2, x:x + W2] # 裁剪大圖,與小圖 imgS 的大小相同imgAdd = cv2.add(imgCrop, imgS) # cv2 加法,裁剪圖與小圖疊加alpha, beta, gamma = 0.2, 0.8, 0.0 # 加法權值imgAddW = cv2.addWeighted(imgCrop, alpha, imgS, beta, gamma) # 加權加法,裁剪圖與小圖疊加imgAddM = np.array(imgL)imgAddM[y:y + H2, x:x + W2] = imgAddW # 用疊加小圖替換原圖 imgL 的疊放位置cv2.imshow("imgAdd", imgAdd)cv2.imshow("imgAddW", imgAddW)cv2.imshow("imgAddM", imgAddM)cv2.waitKey(0)需要說明的是,對不同尺寸的圖像疊加可以有不同的理解和處理。本例程是將小圖疊加到大圖的指定位置。
本例程運行結果如下圖所示。
擴展例程:1.26 兩張圖像的漸變切換 (改變加權疊加的權值)
# 1.26 兩張圖像的的漸變切換 (改變加權疊加的權值)img1 = cv2.imread("../images/imgLena.tif") # 讀取圖像 imgLenaimg2 = cv2.imread("../images/imgB3.jpg") # 讀取彩色圖像(BGR)wList = np.arange(0.0, 1.0, 0.05) # start, end, stepfor w in wList:imgAddW = cv2.addWeighted(img1, w, img2, (1 - w), 0)cv2.imshow("imgAddWeight", imgAddW)cv2.waitKey(100)3. 圖像的掩模加法
圖像掩模(image mask),也常被寫成 “圖像掩膜”,是用特定的圖像或函數對另一圖像進行覆蓋或遮蔽,以控制圖像處理的區域或圖像處理的過程。圖像掩模常用于提取感興趣區域(ROI)、提取結構特征,或制作特殊形狀的圖像。
用于遮蔽的圖像或函數,稱為掩模、掩像、模板或遮罩(mask)。對圖像進行處理時,被遮蔽的區域不參加處理,或不參加處理參數的計算;或者相反地,僅對被遮蔽的區域進行處理或統計。
函數 cv2.add() 用于圖像的加法運算,可以使用掩模圖像進行遮蔽。
cv2.add(src1, src2 [, dst[, mask[, dtype]]) → dst掩模圖像中的黑色區域(數值為 0),cv2.add 的輸出也為黑色(數值為 0);掩模圖像中的非黑色區域(非 0 值),cv2.add 的輸出為加法輸出。換句話說,函數 cv2.add 進行加法運算,對被掩模圖像遮蔽的黑色區域不進行處理,保持黑色。
注意事項:
基本例程:1.27 圖像的掩模加法
# 1.27 圖像的加法 (掩模 mask)img1 = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/imgB3.jpg") # 讀取彩色圖像(BGR)Mask = np.zeros((img1.shape[0], img1.shape[1]), dtype=np.uint8) # 返回與圖像 img1 尺寸相同的全零數組xmin, ymin, w, h = 180, 190, 200, 200 # 矩形裁剪區域 (ymin:ymin+h, xmin:xmin+w) 的位置參數Mask[ymin:ymin+h, xmin:xmin+w] = 255 # 掩模圖像,ROI 為白色,其它區域為黑色print(img1.shape, img2.shape, Mask.shape)imgAddMask1 = cv2.add(img1, img2, mask=Mask) # 帶有掩模 mask 的加法imgAddMask2 = cv2.add(img1, np.zeros(np.shape(img1), dtype=np.uint8), mask=Mask) # 提取 ROIcv2.imshow("MaskImage", Mask) # 顯示掩模圖像 Maskcv2.imshow("MaskAdd", imgAddMask1) # 顯示掩模加法結果 imgAddMask1cv2.imshow("MaskROI", imgAddMask2) # 顯示從 img1 提取的 ROIkey = cv2.waitKey(0) # 等待按鍵命令例程說明 1.27:
本例程運行結果如下。
imgAddMask1 是標準的掩模加法,在窗口區域將 img1 與 img2 進行飽和加法,其它區域為黑色遮蔽。imgAddMask2 中加法運算的第二圖像是全黑圖像(數值為 0),掩模加法的結果是從第一圖像中提取遮蔽窗口,該操作生成的圖像是從原圖中提取感興趣區域(ROI)、黑色遮蔽其它區域。
擴展例程:1.28 圓形和其它形狀的圖像遮罩
# 1.28 圖像的加法 (圓形和其它形狀的遮罩)img1 = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/imgB3.jpg") # 讀取彩色圖像(BGR)Mask1 = np.zeros((img1.shape[0], img1.shape[1]), dtype=np.uint8) # 返回與圖像 img1 尺寸相同的全零數組Mask2 = Mask1.copy()cv2.circle(Mask1, (285, 285), 110, (255, 255, 255), -1) # -1 表示實心cv2.ellipse(Mask2, (285, 285), (100, 150), 0, 0, 360, 255, -1) # -1 表示實心imgAddMask1 = cv2.add(img1, np.zeros(np.shape(img1), dtype=np.uint8), mask=Mask1) # 提取圓形 ROIimgAddMask2 = cv2.add(img1, np.zeros(np.shape(img1), dtype=np.uint8), mask=Mask2) # 提取橢圓 ROIcv2.imshow("circularMask", Mask1) # 顯示掩模圖像 Maskcv2.imshow("circularROI", imgAddMask1) # 顯示掩模加法結果 imgAddMask1cv2.imshow("ellipseROI", imgAddMask2) # 顯示掩模加法結果 imgAddMask2key = cv2.waitKey(0) # 等待按鍵命令本例程運行結果如下。
通過設計圓形、橢圓形或其它形狀的圖像遮罩,可以從一張圖像中提取不同形狀的區域。
4. 圖像的按位運算
函數 cv2.bitwise 提供了圖像的位運算,對圖像的像素點值按位操作,快速高效、方便靈活。
函數說明:
cv.bitwise_and(src1, src2[, dst[, mask]] → dst # 位操作: 與 cv.bitwise_or(src1, src2[, dst[, mask]] → dst # 位操作: 或 cv.bitwise_xor(src1, src2[, dst[, mask]] → dst # 位操作: 與或 cv.bitwise_not(src1, src2[, dst[, mask]] → dst # 位操作: 非(取反)-
位運算包括四種方法:按位與、按位或、按位非、按位異或,其計算方法是對圖像的像素點值的按位運算,運算效率高、速度快。
-
以按位與操作 “bitwise_and” 為例:
- 對圖像中的每一像素(矩陣中的每一元素),將數值轉換為二進制;
- 對 src1 和 src2 同一位置像素的數值進行按位操作 (按位與): 1&1=1, 1&0=0, 0&0=0;
- 將位操作的二進制結果轉換為十進制。
類似地,按位或、按位非、按位異或操作,先將像素值轉換為二進制,進行位操作后再將結果轉換回十進制。
參數說明:
- scr1, scr2:進行位運算的圖像,ndarray 多維數組
- mask:掩模圖像,8位灰度格式,與 scr1 大小相同,可選參數
- 返回值:dst,位運算結果圖像,ndarray 多維數組
注意事項:
- 進行位運算的圖像 scr1, scr2 的大小和類型(通道數)必須相同。
- 使用掩模圖像時,掩模圖像中的黑色區域(數值為 0),輸出也為黑色(數值為 0);掩模圖像中的非黑色區域(非 0 值),按位操作輸出。
基本例程:1.29 圖像的位操作
# 1.29 圖像的位操作img1 = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/imgB2.jpg") # 讀取彩色圖像(BGR)imgAnd = cv2.bitwise_and(img1, img2) # 按位 與(AND)imgOr = cv2.bitwise_or(img1, img2) # 按位 或(OR)imgNot = cv2.bitwise_not(img1) # 按位 非(NOT)imgXor = cv2.bitwise_xor(img1, img2) # 按位 異或(XOR)plt.figure(figsize=(9,6))titleList = ["img1", "img2", "and", "or", "not", "xor"]imageList = [img1, img2, imgAnd, imgOr, imgNot, imgXor]for i in range(6):plt.subplot(2,3,i+1), plt.title(titleList[i]), plt.axis('off')plt.imshow(cv2.cvtColor(imageList[i], cv2.COLOR_BGR2RGB), 'gray')plt.show()例程說明 1.29:
本例程運行結果如下圖所示。
圖中給出了兩張圖像進行位運算的結果,看起來有些莫名其妙,很難理解位操作究竟有什么意義。確實如此,其實位操作基本上不會用于兩張普通圖像的操作,通常是用于圖像的掩模操作,我們來看下一個例程。
5. 圖像的疊加
兩張圖像直接進行加法運算后圖像的顏色會改變,通過加權加法實現圖像混合后圖像的透明度會改變,都不能實現圖像的疊加。
實現圖像的疊加,需要綜合運用圖像閾值處理、圖像掩模、位操作和圖像加法的操作。
我們以 Lena 圖像疊加 CVlogo 為例,討論圖像疊加的思路和步驟:
基本例程:1.30 圖像的疊加
# 1.30 圖像的疊加img1 = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)img2 = cv2.imread("../images/logoCV.png") # 讀取 CV Logox, y = (0, 10) # 圖像疊加位置W1, H1 = img1.shape[1::-1]W2, H2 = img2.shape[1::-1]if (x + W2) > W1: x = W1 - W2if (y + H2) > H1: y = H1 - H2print(W1,H1,W2,H2,x,y)imgROI = img1[y:y+W2, x:x+H2] # 從背景圖像裁剪出疊加區域圖像img2Gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # img2: 轉換為灰度圖像ret, mask = cv2.threshold(img2Gray, 175, 255, cv2.THRESH_BINARY) # 轉換為二值圖像,生成遮罩,LOGO 區域黑色遮蓋maskInv = cv2.bitwise_not(mask) # 按位非(黑白轉置),生成逆遮罩,LOGO 區域白色開窗,LOGO 以外區域黑色# mask 黑色遮蓋區域輸出為黑色,mask 白色開窗區域與運算(原圖像素不變)img1Bg = cv2.bitwise_and(imgROI, imgROI, mask=mask) # 生成背景,imgROI 的遮罩區域輸出黑色img2Fg = cv2.bitwise_and(img2, img2, mask=maskInv) # 生成前景,LOGO 的逆遮罩區域輸出黑色# img1Bg = cv2.bitwise_or(imgROI, imgROI, mask=mask) # 生成背景,與 cv2.bitwise_and 效果相同# img2Fg = cv2.bitwise_or(img2, img2, mask=maskInv) # 生成前景,與 cv2.bitwise_and 效果相同# img1Bg = cv2.add(imgROI, np.zeros(np.shape(img2), dtype=np.uint8), mask=mask) # 生成背景,與 cv2.bitwise 效果相同# img2Fg = cv2.add(img2, np.zeros(np.shape(img2), dtype=np.uint8), mask=maskInv) # 生成背景,與 cv2.bitwise 效果相同imgROIAdd = cv2.add(img1Bg, img2Fg) # 前景與背景合成,得到裁剪部分的疊加圖像imgAdd = img1.copy()imgAdd[y:y+W2, x:x+H2] = imgROIAdd # 用疊加圖像替換背景圖像中的疊加位置,得到疊加 Logo 合成圖像plt.figure(figsize=(9,6))titleList = ["1. imgGray", "2. imgMask", "3. MaskInv", "4. img2FG", "5. img1BG", "6. imgROIAdd"]imageList = [img2Gray, mask, maskInv, img2Fg, img1Bg, imgROIAdd]for i in range(6):plt.subplot(2,3,i+1), plt.title(titleList[i]), plt.axis('off')if (imageList[i].ndim==3): # 彩色圖像 ndim=3plt.imshow(cv2.cvtColor(imageList[i], cv2.COLOR_BGR2RGB)) # 彩色圖像需要轉換為 RGB 格式else: # 灰度圖像 ndim=2plt.imshow(imageList[i], 'gray')plt.show()cv2.imshow("imgAdd", imgAdd) # 顯示疊加圖像 imgAddkey = cv2.waitKey(0) # 等待按鍵命令例程說明 1.30:
- 本例程實現圖像的疊加,中間過程圖像如上圖所示,最終的疊加圖像如下圖所示。
- 圖像疊加所涉及的操作步驟較多,建議將上文的步驟說明與程序、中間過程圖像相互對照進行閱讀。
- 使用位操作生成前景 img1Bg 時,使用掩模圖像 mask 對 imgROI 與 imgROI 進行 “與操作”,而不是直接對 mask 與 imgROI 進行操作,是因為 mask 為灰度圖像而 imgROI 為彩色圖像,不能直接進行加法或位操作。
- 使用位操作生成前景、背景圖像時,遮罩區域以外 imgROI 與 imgROI 進行 “自與操作”,如果用 “自或操作” (參見程序注釋語句)的效果也是相同的。此處甚至也可以用加法操作 cv2.add 實現(參見程序注釋語句),但位操作的運算速度更快。
- 函數 threshold() 將灰度圖像轉換為二值圖像(Binarization),只有黑白兩色。該方法通過固定閾值 thresh 處理圖像,將像素點的灰度值設為 0 或 255。
6. 圖像添加文字
函數 cv2.putText() 用于在圖像上繪制文本字符串,即添加文字。
函數說明:
cv2.putText(img, text, pos, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]]) → dst函數 cv2.putText() 用于在圖像上繪制文本字符串。
參數說明:
- img:添加文本字符串的圖像,ndarray 多維數組
- text:添加的文本字符串
- pos:文本字符串左下角坐標,如元組 (x=100, y=100)
- font:字體類型
- fontScale:字體縮放比例因子
- color:文本字符串的顏色,如元組 (255,0 ,0)
- thickness:線條粗細,單位為像素數
- lineType:線條類型
- bottomLeftOrigin:可選參數,默認值 True 表示數據原點位于左下角,False 表示位于左上角
- 返回值:dst,結果圖像,ndarray 多維數組
注意事項:
基本例程:1.31 圖像添加文字
# 1.31 圖像添加文字img1 = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)text = "OpenCV2021, youcans@xupt"fontList = [cv2.FONT_HERSHEY_SIMPLEX,cv2.FONT_HERSHEY_SIMPLEX,cv2.FONT_HERSHEY_PLAIN,cv2.FONT_HERSHEY_DUPLEX,cv2.FONT_HERSHEY_COMPLEX,cv2.FONT_HERSHEY_TRIPLEX,cv2.FONT_HERSHEY_COMPLEX_SMALL,cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,cv2.FONT_HERSHEY_SCRIPT_COMPLEX,cv2.FONT_ITALIC]fontScale = 1 # 字體縮放比例color = (255, 255, 255) # 字體顏色for i in range(10):pos = (10, 50*(i+1))imgPutText = cv2.putText(img1, text, pos, fontList[i], fontScale, color)cv2.imshow("imgPutText", imgPutText) # 顯示疊加圖像 imgAddkey = cv2.waitKey(0) # 等待按鍵命令擴展例程:1.32 圖像中添加中文文字
# 1.32 圖像中添加中文文字imgBGR = cv2.imread("../images/imgLena.tif") # 讀取彩色圖像(BGR)from PIL import Image, ImageDraw, ImageFontif (isinstance(imgBGR, np.ndarray)): # 判斷是否 OpenCV 圖片類型imgPIL = Image.fromarray(cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB))text = "OpenCV2021, 中文字體"pos = (50, 20) # (left, top),字符串左上角坐標color = (255, 255, 255) # 字體顏色textSize = 40drawPIL = ImageDraw.Draw(imgPIL)fontText = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")drawPIL.text(pos, text, color, font=fontText)imgPutText = cv2.cvtColor(np.asarray(imgPIL), cv2.COLOR_RGB2BGR)cv2.imshow("imgPutText", imgPutText) # 顯示疊加圖像 imgAddkey = cv2.waitKey(0) # 等待按鍵命令【本節完】
版權聲明:
youcans 的 OpenCV 學習課 @ youcans 原創作品
轉載必須標注原文鏈接:https://blog.csdn.net/youcans/article/details/121136047
Copyright 2021 youcans, XUPT
Crated:2021-11-08
歡迎關注 『youcans 的 OpenCV 學習課』 系列,持續更新
youcans 的 OpenCV 學習課—1.安裝與環境配置
youcans 的 OpenCV 學習課—2.圖像讀取與顯示
youcans 的 OpenCV 學習課—3.圖像的創建與修改
youcans 的 OpenCV 學習課—4.圖像的疊加與混合
youcans 的 OpenCV 學習課—5.圖像的幾何變換
youcans 的 OpenCV 學習課—6.灰度變換與直方圖處理
youcans 的 OpenCV 學習課—7.空間域圖像濾波
youcans 的 OpenCV 學習課—8.頻率域圖像濾波(上)
youcans 的 OpenCV 學習課—9.頻率域圖像濾波(下)
總結
以上是生活随笔為你收集整理的youcans 的 OpenCV 学习课—4.图像的叠加与混合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV 例程200篇】69. 连
- 下一篇: MXNet的Model API