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
效果图: