OpenCV中为我们提供了四种按位运算,分别是按位与、按位或、按位非和按位异或。图像的按位运算本质上就是对像素点值的按位运算,接触过计算机知识的人应该知道,按位运算是针对二进制数而言的,也就是说只有0和1两个值,因此,我们在对图像进行按位运算时,需要将图像转化成灰度图。
假设现在我们有一张五环图像,我们要用它给其他图像做水印,但是它的底色是纯白色的,我们首先需要处理底色。
·阈值二值化
灰度图共分256(0~255)阶,从按位运算的角度出发,纯黑色为0,不是纯黑色为1。因此当碰到纯白色或者纯黑色的背景时,我们可以先将其转为灰度图,再利用阈值将非背景色的内容抠出来作为模板,再与原图做位操作,进行枢图
在OpenCV中,我们使用threshold(src,thresh,maxval,type,dst=None)函数来实现图像的固定阈值二值化,即将图像中阈值内的图形抠出
importcv2
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()
效果图:
按位非:
importcv2
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()
效果图:
按位与:
importcv2
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
效果图: