[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用
一、學(xué)習(xí)目標(biāo)
目錄
[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 一、opencv的helloworld
[【python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld
[[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 三、numpy與圖像編輯] 一、opencv的helloworld
[[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 四、了解色彩空間及其詳解] 一、opencv的helloworld
[[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 五、對(duì)象追蹤] 一、opencv的helloworld
[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 六、圖像運(yùn)算
如有錯(cuò)誤歡迎指出~
二、了解OpenCV中圖像運(yùn)算的運(yùn)用
2.1 了解and邏輯運(yùn)算
在上一節(jié)中,我們了解了基本的圖像運(yùn)算,這一節(jié)將了解在opencv將兩張圖片進(jìn)行邏輯運(yùn)算。邏輯運(yùn)算在編程中較為常見(jiàn)的一種基本運(yùn)算,在此不在進(jìn)行贅述。我們首先了解一下opencv中的邏輯與運(yùn)算,opencv中邏輯與運(yùn)算與我們基本的邏輯與運(yùn)算一致,也就是1 and 1為1,1 and 0 為0。我們可以通過(guò)一個(gè)小示例來(lái)直觀的感受opencv的and運(yùn)算方式。
在opencv中,對(duì)兩個(gè)圖片進(jìn)行邏輯與運(yùn)算需要使用bitwise_and方法。bitwise_and方法接收2個(gè)圖片數(shù)組為參數(shù)。首先我們讀取2個(gè)圖片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方法對(duì)兩張圖片進(jìn)行運(yùn)算:
以上代碼中關(guān)鍵代碼為and_img=cv2.bitwise_and(img3,img1),在這一串代碼中對(duì)img3與img1進(jìn)行了邏輯與運(yùn)算。由于img1圖片只有“我是1_bit”文字為白色,其他區(qū)域?yàn)楹谏?#xff0c;我們可以當(dāng)成“我偶是1_bit”這個(gè)內(nèi)容區(qū)域的值為1,然后黑色區(qū)域位置為0。這時(shí)黑色區(qū)域與img3圖片的通道區(qū)域值進(jìn)行計(jì)算,那就是0與一個(gè)內(nèi)容值進(jìn)行邏輯與計(jì)算,那么結(jié)果為0,img1的文字部分值為1,與img3圖片相同的位置進(jìn)行邏輯與計(jì)算,那么保留結(jié)果。這時(shí),運(yùn)算后的圖片則應(yīng)該是生成一張帶有“我是1_bit”字樣的圖片,并且在字樣區(qū)域內(nèi)帶有img3圖片內(nèi)容。結(jié)果如下:
那將圖片img1改成如下情況呢:
這時(shí)“我是1_bit”’字樣區(qū)域的內(nèi)容將會(huì)與另一張圖片計(jì)算后排出,這時(shí)結(jié)果將會(huì)產(chǎn)生一個(gè)0值的空缺部分,由于空白部分的值為1,邏輯運(yùn)算后將會(huì)保留白色區(qū)域的另外一張圖片內(nèi)容。
結(jié)果如下:
2.2 了解or邏輯運(yùn)算
在opencv中既然存在and邏輯與,那么邏輯或大幾率存在是可能的。在opencv中,邏輯或運(yùn)算與邏輯與運(yùn)算相反,使用bitwise_or方法,傳入?yún)?shù)也是兩張用于邏輯計(jì)算的圖片。使用示例如下:
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()結(jié)果如下:
以上使用的圖片與2.1示例中圖片一致。邏輯或運(yùn)算,只要不都為0則是1。圖片img1中,字體為白,其它部分為0,但由于進(jìn)行邏輯運(yùn)算時(shí),黑色部分進(jìn)行計(jì)算的區(qū)域?qū)?yīng)img3是有內(nèi)容的,也就是說(shuō)img3中該部分的內(nèi)容非0。那么,結(jié)果就是img3中的圖片內(nèi)容,最終將會(huì)得到如上結(jié)果。
2.3 了解取反運(yùn)算
取反運(yùn)算非常簡(jiǎn)單,就是黑的邊白,白的變黑;當(dāng)然這樣說(shuō)不嚴(yán)謹(jǐn),但是卻很好反應(yīng)了取反這個(gè)操作的結(jié)果;例如0取反則是1,1取反則是0。取反使用bitwise_not方法,bitwise_not方法接收一個(gè)圖片參數(shù)。以下方法依舊使用名為1bit的圖片。圖片為了方便查看在代碼中顯示了原圖內(nèi)容。
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()結(jié)果如下:
2.4 邏輯運(yùn)算有什么用呢?
我們?cè)谇皟晒?jié)中的值,可以通過(guò)inRange方法提取圖片中的指定顏色內(nèi)容,但是提取出來(lái)后將會(huì)得到一個(gè)黑白圖片,那么如何對(duì)改圖片進(jìn)行顏色的還原呢?想必有些同學(xué)學(xué)完邏輯運(yùn)算后覺(jué)得應(yīng)該是找到了方法。是的,我們可以通過(guò)邏輯運(yùn)算對(duì)圖片進(jìn)行顏色上的還原。因?yàn)槲覀兲崛〕鰜?lái)的圖片是黑白圖片,提取出來(lái)指定顏色內(nèi)容的區(qū)域?yàn)榘咨?#xff0c;那么只需要將圖片與原圖進(jìn)行and運(yùn)算,那么重合的部分就會(huì)顯示出來(lái),這個(gè)時(shí)候就可以還原提取后圖片的顏色。但是,我們是哪個(gè)顏色提取出來(lái)的圖片是單通道的灰度圖片,怎么辦呢?不急,首先我們把之前的代碼貼上,方便查看:
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()以上代碼已經(jīng)在前兩節(jié)“對(duì)象跟蹤”小節(jié)講解,那么現(xiàn)在只需要對(duì)提取到的圖片與原圖進(jìn)行一個(gè)and邏輯運(yùn)算即可,添加以下代碼:
cflag=cv2.bitwise_and(img,img,mask=flag)以上代碼bitwise_and添加了兩個(gè)相同的img參數(shù),為什么添加呢?不急,下一節(jié)將會(huì)告訴大家。我們現(xiàn)在著重查看mask參數(shù),mask參數(shù)賦值為提取到的flag目標(biāo)區(qū)域的圖片,表示遮罩。將會(huì)在之前傳入的img中剔除不要的區(qū)域,只保留白色的區(qū)域,傳入的類(lèi)型是8位單通道的灰度圖像。這時(shí)我們就可以將flag值賦值給mask,bitwise_and將會(huì)從img圖片中做邏輯運(yùn)算去除我們不需要的黑色區(qū)域的圖片內(nèi)容,這時(shí)將會(huì)得到一個(gè)顏色比較正常的海綿寶寶。完整代碼如下:
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()結(jié)果如下:
邏輯運(yùn)算的更多內(nèi)容下一節(jié)將會(huì)講解。
該系列文章首發(fā)于ebaina
三、總結(jié)
總結(jié)
以上是生活随笔為你收集整理的[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [python opencv 计算机视觉
- 下一篇: [python opencv 计算机视觉