常見(jiàn)的按位邏輯運(yùn)算
在OpenCV內(nèi)琳疏,常見(jiàn)的按位運(yùn)算函數(shù)如下表所示:
函數(shù)名 | 含義 |
---|---|
bitwise_and() | 按位與 |
bitwise_or() | 按位或 |
bitwise_xor() | 按位異或 |
bitwise_not() | 按位取反 |
按位與運(yùn)算
數(shù)學(xué)中按位與運(yùn)算晰洒,簡(jiǎn)單概括就是只有對(duì)應(yīng)的兩個(gè)二進(jìn)位都為1時(shí)欺缘,結(jié)果位才為1。在python中,通過(guò)“&”符號(hào)進(jìn)行按位與運(yùn)算,具體運(yùn)算結(jié)果如下標(biāo):
算1 | 算2 | 結(jié)果 | 對(duì)應(yīng)python代碼 |
---|---|---|---|
0 | 0 | 0 | 0&0 |
0 | 1 | 0 | 0&1 |
1 | 0 | 0 | 1&0 |
1 | 1 | 1 | 1&1 |
按位與運(yùn)算是將數(shù)值轉(zhuǎn)換為二進(jìn)制后钻哩,對(duì)應(yīng)位置進(jìn)行運(yùn)算。例如博主這里隨便取兩個(gè)數(shù)據(jù)肛冶,計(jì)算結(jié)果如下表:
|數(shù)值|十進(jìn)制 |二進(jìn)制結(jié)果 |
|--|--|--|--|
| 數(shù)值1| 165 | 10100101 |
| 數(shù)值2| 122| 01111010 |
| 結(jié)果 |32 | 00100000 |
掩模圖像
要獲取掩模圖像街氢,我們需要先介紹OpenCV中的按位與函數(shù):cv2.bitwise_and()。其具體的語(yǔ)法為:
dst=cv2.bitwise_and(src1,src2[,mask])
dst:表示輸入值具有同樣大小的array輸出值睦袖。
src1:表示第一個(gè)array或scalar類(lèi)型的輸入值
src2:表示第二個(gè)array或scalar類(lèi)型的輸入值
mask:表示可選操作掩碼珊肃,8位單通道array
通過(guò)上面的按位與計(jì)算,我們知道馅笙,任何圖像只要不是黑色近范,都不是0。所以延蟹,我們將黑色0與任何數(shù)字按位與計(jì)算都會(huì)得到1。這樣叶堆,我們可以將不想顯示的部分去掉阱飘。
首先,我們需要構(gòu)建一個(gè)掩模圖像虱颗,具體代碼如下:
a = cv2.imread("2_2.png", 1)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
這里的b就是掩模圖像沥匈,白色顯示的部分就是我們需要截取的圖像部分。這里[100:400,200:400]忘渔,你可以把圖像想象成一個(gè)坐標(biāo)系高帖,左上角(100,200)畦粮,右下角(200散址,400)乖阵。
運(yùn)行之后,掩模圖像b與原圖a如下所示:
通過(guò)掩模圖像预麸,保留需要的圖像
既然我們已經(jīng)獲取了掩模圖像瞪浸,下面我們可以直接通過(guò)OpenCV提供的函數(shù)進(jìn)行運(yùn)算得到,具體代碼如下所示:
import cv2
import numpy as np
a = cv2.imread("2_2.png", 1)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
c=cv2.bitwise_and(a,b)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c", c)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行之后吏祸,顯示效果如下所示: