
OpenCV中為我們提供了四種按位運算,分別是按位與、按位或、按位非和按位異或。圖像的按位運算本質上就是對像素點值的按位運算,接觸過計算機知識的人應該知道,按位運算是針對二進制數而言的,也就是說只有0和1兩個值,因此,我們在對圖像進行按位運算時,需要將圖像轉化成灰度圖。
假設現在我們有一張五環圖像,我們要用它給其他圖像做水印,但是它的底色是純白色的,我們首先需要處理底色。

·閾值二值化
灰度圖共分256(0~255)階,從按位運算的角度出發,純黑色為0,不是純黑色為1。因此當碰到純白色或者純黑色的背景時,我們可以先將其轉為灰度圖,再利用閾值將非背景色的內容摳出來作為模板,再與原圖做位操作,進行樞圖
在OpenCV中,我們使用threshold(src,thresh,maxval,type,dst=None)函數來實現圖像的固定閾值二值化,即將圖像中閾值內的圖形摳出
import cv2 logo = cv2.imread("wuhuan.jpg",1) height,width =logo.shape[0], logo.shape[1] gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY) #將logo轉為灰度 cv2.imshow('gray', gray) ret, mask =cv2.threshold(gray,240,255, cv2.THRESH_BINARY) ''' 參數1 必選參數。表示輸入圖像,注意只能是灰度圖 參數2 必選參數。表示要設置的閾值,也是整個函數最關鍵的參數。 參數3 必選參數。當像素值超過閾值或小於閾值(具體根據type來決定)時所賦予的值。 參數4 必選參數。二值化操作的類型: THRESH_BINARY(超過閾值時的像素值為maxval(參數3),否則為0) THRESH_BINARY_INV(小於閾值的像素值為maxval(參數3),否則為0) 函數有兩個返回值,其中ret就是我們設置的閾值,mask為經過閾值二值化處理后的圖像 ''' cv2.imshow('dst', mask) cv2.waitKey()
效果圖:

按位非:
import cv2 logo = cv2.imread("wuhuan.jpg",1) height,width =logo.shape[0], logo.shape[1] gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY) ret, mask =cv2.threshold(gray,240,255, cv2.THRESH_BINARY) cv2.imshow('yuan', mask) mask_inv = cv2.bitwise_not(mask) #圖像按位非操作 #按位非操作其實就是對像素值取反,原來是1的變為0,原來是0的變為1。 cv2. imshow('dst', mask_inv) cv2.waitKey()
效果圖:

按位與:
import cv2 logo = cv2.imread("wuhuan.jpg",1) cv2.imshow('wuhuan', logo) height,width =logo.shape[0], logo.shape[1] gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY) ret, mask =cv2.threshold(gray,240,255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask) logo_bg=cv2.bitwise_and(logo,logo,mask=mask_inv) #按位與--帶掩碼 #mask起掩碼作用,當mask像素不為0時,做正常與操作,當mask像素為0時直接做0處理 #【mask為黑白圖像時:純白色部分進行正常的按位操作,mask為非純白色部分設置為0即黑色】 cv2. imshow('mask_inv', mask_inv) cv2.imshow('dsy', logo_bg) cv2.waitKey()
按位與運算法則如下(&為按位與運算符):1&1=1,1&0=0,0&1=0,0&0=0
效果圖:




