今天在學(xué)習(xí)opencv時,把OpenCV 的標(biāo)志放到另一幅圖像上。這時要用到cv2.bitwise_and函數(shù),加下來從原理和效果講一下這個函數(shù)。
目標(biāo):將下面這個logo加到螞蟻圖像的左上角并且背景無遮擋(logo圖片白的部分不遮擋螞蟻圖片藍(lán)的地方)。
效果:
下面直接上代碼,根據(jù)代碼講解原理:
import cv2
img1 = cv2.imread(r'D:\Pycharm\learn_opencv\pic\ants_image\0013035.jpg')
img2 = cv2.imread('D:\Pycharm\learn_opencv\pic\logo.jfif')
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('sasa',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
?首先下面這兩行的代碼作用是將我們的螞蟻圖像中的對應(yīng)logo圖像的區(qū)域找出來記為roi
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
我們將這個roi圖像顯示出來,與我們預(yù)想的一致,正是螞蟻圖像的左上角對應(yīng)logo圖像的區(qū)域:
?下面三行代碼是生成一個mask掩碼矩陣和mask_inv逆掩碼矩陣方便我們后面cv2.bitwise_and函數(shù)的使用,我們稍微講一下參數(shù)和原理,后面再看效果。
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
第一行是將我們的logo圖像變成灰度圖像,第二行cv2.threshold函數(shù)的參數(shù):第一個參數(shù)為原圖像,第二個參數(shù)為進(jìn)行分類的閾值,第三個參數(shù)為高于(低于)閾值時賦予的新值,第四個方法選擇參數(shù),常用的有:
? cv2.THRESH_BINARY(黑白二值)
? cv2.THRESH_BINARY_INV(黑白二值反轉(zhuǎn))
? cv2.THRESH_TRUNC (得到的圖像為多像素值)
? cv2.THRESH_TOZERO
? cv2.THRESH_TOZERO_INV
返回值為:第一個retVal(得到的閾值值),第二個就是閾值化后的掩碼圖像
根據(jù)我們選擇的模式為cv2.THRESH_BINARY,以及第二三個參數(shù)為200、255,表示:高于200的像素設(shè)置為255,否則像素值置零。其他模式見文章:(13條消息) 圖像閾值處理cv2.threshold()函數(shù)(python)_肥宅_Sean的博客-CSDN博客_cv2threshold
于是我們的mask圖像便是對于img2gray圖像的高于200的像素值置255(白),否則置0(黑),我們來驗證一下:?
img2gray圖像:
mask掩碼矩陣圖像:
?
可以看見img2gray中黑的和灰的像素值較低被置為黑色,背景白色仍置為白色。
得到mask掩碼矩陣圖像后我們接著往下看:
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.bitwise_and函數(shù)的作用取與運算,第一個參數(shù)為輸入圖像,第二個參數(shù)為輸出圖像,第三個參數(shù)mask:圖像掩膜,可選參數(shù),為8位單通道的灰度圖像,用于指定要更改的輸出圖像數(shù)組的元素,即輸出圖像像素只有mask對應(yīng)位置元素不為0的部分才輸出,否則該位置像素的所有通道分量都設(shè)置為0。
roi圖像和mask圖像上面已給出,下面我們給出img1_bg的圖像:
與聲明的一致,同理img2_fg圖像只是將參數(shù)mask換成了其反矩陣,并且作用對象變成了我們的logo圖像。我們看看效果:
img2_fn圖像:
?也即在原來mask矩陣圖像為白的時候輸出原圖logo圖像,反之置黑。文章來源:http://www.zghlxwxcb.cn/news/detail-444949.html
最后,我們將上面兩張圖加起來就達(dá)到了我們想要的左上角部分,再把原圖螞蟻圖像的左上角替換成我們加起來后的左上角部分即得到結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-444949.html
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
到了這里,關(guān)于位運算bitwise_and函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!