像素邏輯運算,一般用來進行遮罩層控制。
假如我們有一個遮罩層圖像,只想要遮罩圖的白色區域顯示原圖,就可以用到與運算(AND);因為這時候白色區域的像素運算結果取決於原圖,而黑色區域的運算結果一定是黑色。
或運算(OR)能夠得到一個區域上互補性地更加接近上邊界值的圖像,也即局部亮度提升。
非運算(NOT)和被減數是最大像素值時的減法算術運算結果相同,比如NOT 100(十進制,對應的二進制是01100100) = 155(十進制,對應的二進制是 10011011),也就是說100的非值就等於255-100。
非運算(NOT)就是反相操作,白的變成黑的,黑的變成白的。
異或運算(XOR)一般用來判斷兩個圖像是否相同,如果相同最後生成純黑色圖像,如果不同就會有白色塊,並且使用sum()函數把所有元素加起來會發現不為0。
各個運算的API
- cv2.bitwise_and(src1, src2)
- cv2.bitwise_or(src1, src2)
- cv2.bitwise_not(src1, src2)
- cv2.bitwise_nor(src1, src2)
遮罩層控制指用上面提到的與運算API(bitwise_and),設置參數mask,實現只顯示遮罩圖像的透光(白色)區域。
cv.bitwise_and(src, src, mask)
像素算術運算,可以改變圖像的亮度(暗度)。
各個運算的API
- cv2.add(src1, src2, dst, mask, dtype)
- cv2.subtract(src1, src2, dst, mask, dtype)
- cv2.multiply(src1, src2, dst, mask, dtype)
- cv2.divide(src1, src2, dst, mask, dtype)
src1和src2既可以都是單個數值,也可以都是圖像數組,也可以是一個圖像數組搭配一個單個數值,總之只要能滿足Broadcast機制,就允許。
dst在Python語言中,可以省略不寫,因為函數返回值就是dst
mask代表改變的范圍。
注意上面四大API,都是飽和運算;也即如果實際結果數值小於下邊界,就等於下邊界,如果大於上邊界,就等於上邊界。典型的容器類型是CV_8U,下邊界是0,上邊界是255,如果計算結果小於0就返回0,如果計算結果大於255就返回255。
圖像融合屬於圖像加法運算的特例,圖像加法運算是兩個圖像的權值都為1,而圖像融合是兩圖權值和為1。
add()和addweighted()都是飽和運算。
語法格式如下
cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) ->dst
alpha是src1的權重
beta是src2的權重
gamma是結果偏移值