一、學習目標
- 了解opencv中圖像的邏輯運算
- 了解opencv中邏輯運算的應用
目錄
[python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld
[【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld
[[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯] 一、opencv的helloworld
[[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解] 一、opencv的helloworld
[[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤] 一、opencv的helloworld
[python opencv 計算機視覺零基礎到實戰] 六、圖像運算
如有錯誤歡迎指出~
二、了解OpenCV中圖像運算的運用
2.1 了解and邏輯運算
在上一節中,我們了解了基本的圖像運算,這一節將了解在opencv將兩張圖片進行邏輯運算。邏輯運算在編程中較為常見的一種基本運算,在此不在進行贅述。我們首先了解一下opencv中的邏輯與運算,opencv中邏輯與運算與我們基本的邏輯與運算一致,也就是1 and 1為1,1 and 0 為0。我們可以通過一個小示例來直觀的感受opencv的and運算方式。
在opencv中,對兩個圖片進行邏輯與運算需要使用bitwise_and方法。bitwise_and方法接收2個圖片數組為參數。首先我們讀取2個圖片1bit與1bit3。
import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')cv2.imshow("img1", img1)
cv2.imshow("img3", img3)cv2.waitKey (0)
cv2.destroyAllWindows()
得到兩張圖片如下:
隨后使用bitwise_and方法對兩張圖片進行運算:
import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')
and_img=cv2.bitwise_and(img3,img1)
cv2.namedWindow("and_img",cv2.WINDOW_NORMAL)cv2.imshow("img1", img1)
cv2.imshow("img3", img3)
cv2.imshow("and_img", and_img)cv2.waitKey (0)
cv2.destroyAllWindows()
以上代碼中關鍵代碼為and_img=cv2.bitwise_and(img3,img1)
,在這一串代碼中對img3與img1進行了邏輯與運算。由于img1圖片只有“我是1_bit”文字為白色,其他區域為黑色,我們可以當成“我偶是1_bit”這個內容區域的值為1,然后黑色區域位置為0。這時黑色區域與img3圖片的通道區域值進行計算,那就是0與一個內容值進行邏輯與計算,那么結果為0,img1的文字部分值為1,與img3圖片相同的位置進行邏輯與計算,那么保留結果。這時,運算后的圖片則應該是生成一張帶有“我是1_bit”字樣的圖片,并且在字樣區域內帶有img3圖片內容。結果如下:
那將圖片img1改成如下情況呢:
這時“我是1_bit”’字樣區域的內容將會與另一張圖片計算后排出,這時結果將會產生一個0值的空缺部分,由于空白部分的值為1,邏輯運算后將會保留白色區域的另外一張圖片內容。
結果如下:
2.2 了解or邏輯運算
在opencv中既然存在and邏輯與,那么邏輯或大幾率存在是可能的。在opencv中,邏輯或運算與邏輯與運算相反,使用bitwise_or方法,傳入參數也是兩張用于邏輯計算的圖片。使用示例如下:
import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
img3 = cv2.imread(r'C:\Users\mx\Desktop\1bit3.jpg')
and_img=cv2.bitwise_or(img3,img1)
cv2.namedWindow("and_img",cv2.WINDOW_NORMAL)cv2.imshow("img1", img1)
cv2.imshow("img3", img3)
cv2.imshow("and_img", and_img)cv2.waitKey (0)
cv2.destroyAllWindows()
結果如下:
以上使用的圖片與2.1示例中圖片一致。邏輯或運算,只要不都為0則是1。圖片img1中,字體為白,其它部分為0,但由于進行邏輯運算時,黑色部分進行計算的區域對應img3是有內容的,也就是說img3中該部分的內容非0。那么,結果就是img3中的圖片內容,最終將會得到如上結果。
2.3 了解取反運算
取反運算非常簡單,就是黑的邊白,白的變黑;當然這樣說不嚴謹,但是卻很好反應了取反這個操作的結果;例如0取反則是1,1取反則是0。取反使用bitwise_not方法,bitwise_not方法接收一個圖片參數。以下方法依舊使用名為1bit的圖片。圖片為了方便查看在代碼中顯示了原圖內容。
import cv2img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
not_img=cv2.bitwise_not(img1)
cv2.imshow("img1 ", img1 )
cv2.imshow("not_img", not_img)
cv2.waitKey (0)
cv2.destroyAllWindows()
結果如下:
2.4 邏輯運算有什么用呢?
我們在前兩節中的值,可以通過inRange方法提取圖片中的指定顏色內容,但是提取出來后將會得到一個黑白圖片,那么如何對改圖片進行顏色的還原呢?想必有些同學學完邏輯運算后覺得應該是找到了方法。是的,我們可以通過邏輯運算對圖片進行顏色上的還原。因為我們提取出來的圖片是黑白圖片,提取出來指定顏色內容的區域為白色,那么只需要將圖片與原圖進行and運算,那么重合的部分就會顯示出來,這個時候就可以還原提取后圖片的顏色。但是,我們是哪個顏色提取出來的圖片是單通道的灰度圖片,怎么辦呢?不急,首先我們把之前的代碼貼上,方便查看:
import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()
以上代碼已經在前兩節“對象跟蹤”小節講解,那么現在只需要對提取到的圖片與原圖進行一個and邏輯運算即可,添加以下代碼:
cflag=cv2.bitwise_and(img,img,mask=flag)
以上代碼bitwise_and添加了兩個相同的img參數,為什么添加呢?不急,下一節將會告訴大家。我們現在著重查看mask參數,mask參數賦值為提取到的flag目標區域的圖片,表示遮罩。將會在之前傳入的img中剔除不要的區域,只保留白色的區域,傳入的類型是8位單通道的灰度圖像。這時我們就可以將flag值賦值給mask,bitwise_and將會從img圖片中做邏輯運算去除我們不需要的黑色區域的圖片內容,這時將會得到一個顏色比較正常的海綿寶寶。完整代碼如下:
import cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')
img1 = cv2.imread(r'C:\Users\mx\Desktop\1bit.jpg')
min=np.array([26,43,46])
max=np.array([34,255,255])
while True:r,img=capture.read()if r==False:breakhsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cflag=cv2.bitwise_and(img,img,mask=flag)cv2.imshow("flag", flag)cv2.imshow("hmbb", img)cv2.imshow("cflag", cflag)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()
結果如下:
邏輯運算的更多內容下一節將會講解。
該系列文章首發于ebaina
三、總結
- 了解了opencv中對圖像進行邏輯與運算使用bitwise_and方法
- 了解了opencv中對圖像進行邏輯或運算使用bitwise_or方法
- 了解了opencv中對圖像進行取反運算使用bitwise_not方法
- 了解了and方法的其他用途,用于mask遮罩剔除不需要的內容