【1】引言
前序學習了使用numpy創建單通道的灰色圖像,并對灰色圖像的局部進行了顏色更改,相關鏈接為:
python學opencv|讀取圖像(九)用numpy創建黑白相間灰度圖_numpy生成全黑圖片-CSDN博客
之后又學習了使用numpy創建三通道的彩色圖像,并對彩色圖像按照不同通道進行了顏色更改,相關鏈接為:
python學opencv|讀取圖像(十)用numpy創建彩色圖像_python新建一張caise的圖片-CSDN博客
實際上還會有一些需求,只需要改變三通道彩色圖像的局部顏色,也就是獲得掩模效果,這就是今天文章的目標。
【2】可行性分析
根據上述文章,修改彩色圖像的顏色是通過修改各個通道的BGR值實現的,修改灰度圖像的顏色是通過修改各個像素點的BGR(本質上由于只有一個通道,所以本質上也是通過修改通道的BGR值實現 )實現。
import numpy as np # 引入numpy模塊
import cv2 as cv # 引入cv模塊canvas = np.ones((580, 580, 3), np.uint8) # 繪制一個580*580大小的畫布,3代表有3個通道,unit8為圖像存儲格式
那如果對彩色圖像直接修改像素點的BGR,應該也會有顏色變化。
【3】代碼測試
在上述分析的基礎上,直接嘗試修改像素點的BGR值。
首先是引入相關模塊,繪制出畫布,此時的畫布為純黑色:
import numpy as np # 引入numpy模塊
import cv2 as cv # 引入cv模塊canvas = np.ones((580, 580, 3), np.uint8) # 繪制一個580*580大小的畫布,3代表有3個通道,unit8為圖像存儲格式
然后在純黑色的畫布上,先把第50到300行,第20到280列改為純白色像素,然后顯示完整的畫布:
canvas[50:300,20:280,:]=255 #第50到300行,第20到280列為純白色像素cv.imshow('yanmo', canvas) # 在屏幕展示掩模的效果
cv.imwrite('yanmo.png', canvas) # 保存圖像
之后把畫布改為純白色,相應的把區域第50到300行,第20到280列改為純黑色像素,然后顯示完整的畫布:
canvas[:,:,:]=255 #畫布改為純白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列為純黑色像素
cv.imshow('yanmo1', canvas) # 在屏幕展示掩模的效果cv.imwrite('yanmo1.png', canvas) # 保存圖像
cv.waitKey() # 圖像不會自動關閉
cv.destroyAllWindows() # 釋放所有窗口
代碼運行后,獲得的掩模效果為:
圖1 黑色畫布白色掩模
圖2 白色畫布黑色掩模?
?由圖1和 圖2可見,三通道彩色圖像,通過改像素點值的做法,也能實現修改圖像區域顏色的目標,也就是實現掩模效果。
此時的完整代碼為:
import numpy as np # 引入numpy模塊
import cv2 as cv # 引入cv模塊canvas = np.ones((580, 580, 3), np.uint8) # 繪制一個580*580大小的畫布,3代表有3個通道,unit8為圖像存儲格式canvas[50:300,20:280,:]=255 #第50到300行,第20到280列為純白色像素cv.imshow('yanmo', canvas) # 在屏幕展示掩模的效果
cv.imwrite('yanmo.png', canvas) # 保存圖像canvas[:,:,:]=255 #畫布改為純白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列為純黑色像素
cv.imshow('yanmo1', canvas) # 在屏幕展示掩模的效果cv.imwrite('yanmo1.png', canvas) # 保存圖像
cv.waitKey() # 圖像不會自動關閉
cv.destroyAllWindows() # 釋放所有窗口
【4】細節說明
在彩色圖像的掩模效果實現中,未單獨設置BGR通道值。
嘗試修改第二通道值,只需要增加代碼:
canvas[:,:,:]=255 #畫布改為純白色像素
canvas[50:300,20:280,:]=0 #第50到300行,第20到280列為純黑色像素
canvas[:,:,1]=0 #第二個通道值
cv.imshow('yanmo2', canvas) # 在屏幕展示掩模的效果
cv.imwrite('yanmo2.png', canvas) # 保存圖像
此時新獲得的圖像為:
圖3 白色畫布黑色掩模 + 所有二通道值=0
圖3出現了預料之外的結果,為探清緣由,在所有的掩模操作下增加代碼,讀取掩模區域中的像素點BGR值:
print("黑色畫布白色掩模像素數為[100,100]位置處的BGR=", canvas[100, 100]) # 獲取像素數為[100,100]位置處的BGR
這時候獲得的BGR輸出值為:
圖4? BGR值
可見,由于畫布顏色強制為白色,所有的BGR值本來是統一為255,但把第二通道的值改為0后,畫布的BGR組成就變為[255 0 255],這時候畫布就變成粉紅色。
為證明上述分析,新增一段代碼來做驗證:
canvas[:,:,:]=255 #畫布改為純白色像素
canvas[:,:,1]=0 #第二個通道值
cv.imshow('yanmo3', canvas) # 在屏幕展示掩模的效果
cv.imwrite('yanmo3.png', canvas) # 保存圖像
print("白色畫布+所有二通道BGR=0像素數為[100,100]位置處的BGR=", canvas[100, 100]) # 獲取像素數為[100,100]位置處的BGR
print("白色畫布+所有二通道BGR=0像素數為[500,500]位置處的BGR=", canvas[100, 100]) # 獲取像素數為[500,500]位置處的BGR
此時,先規劃白色畫布,然后直接強制第二通道值為0。
代碼運行后,獲得的圖像為:
圖5 白色畫布+所有二通道值=0
此時輸出的圖像為粉紅色,讀取的像素點BGR為:
圖6 白色畫布+所有二通道值像素BGR值
由圖6可見,各個像素點的BGR值都是[255 0 255],和圖3所示的粉紅色圖像相應像素點的BGR值讀取效果一致。
【5】總結
掌握了python+opencv三通道彩色圖像掩模效果的實現技巧。
?