一、學習目標
了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~
目錄
「python opencv 計算機視覺零基礎實戰」 第一節
「python opencv視覺入門到實戰」二、格式與攝像頭
「python opencv 視覺入門到實戰」 三、圖像編輯
「python opencv視覺入門到實戰」 第四節色彩空間
「python opencv視覺入門到實戰」 五、對象追蹤
「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 cv2import 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: break hsv_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: breakcv2.destroyAllWindows()以上代碼已經在前兩節「對象跟蹤」小節講解,那麼現在只需要對提取到的圖片與原圖進行一個and邏輯運算即可,添加以下代碼:
cflag=cv2.bitwise_and(img,img,mask=flag)以上代碼bitwise_and添加了兩個相同的img參數,為什麼添加呢?不急,下一節將會告訴大家。我們現在著重查看mask參數,mask參數賦值為提取到的flag目標區域的圖片,表示遮罩。將會在之前傳入的img中剔除不要的區域,只保留白色的區域,傳入的類型是8位單通道的灰度圖像。這時我們就可以將flag值賦值給mask,bitwise_and將會從img圖片中做邏輯運算去除我們不需要的黑色區域的圖片內容,這時將會得到一個顏色比較正常的海綿寶寶。完整代碼如下:
import cv2import 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: break hsv_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: breakcv2.destroyAllWindows()結果如下:
文章首發於ebaina邏輯運算的更多內容下一節將會講解。
三、總結
了解了opencv中對圖像進行邏輯與運算使用bitwise_and方法了解了opencv中對圖像進行邏輯或運算使用bitwise_or方法了解了opencv中對圖像進行取反運算使用bitwise_not方法了解了and方法的其他用途,用於mask遮罩剔除不需要的內容