在图像处理过程中,经常需要对图像进行加法运算。可以通过加号运算符“+”对图像进行加法运算,也可以通过cv2.add()函数对图像进行加法运算。
import cv2 import numpy as np img1=cv2.imread("LinuxLogo.jpg") img2=cv2.imread("WindowsLogo.jpg") img3=img1+img2 cv2.imshow("add",img3) cv2.waitKey() cv2.destroyAllWindows()
函数cv2.add()可以计算图像像素值相加的和
逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,简称位运算。在OpenCV内,常见的位运算函数有:
函数名 基本含义 cv2.bitwise_and() 按位与 cv2.bitwise_or() 按位或 cv2.bitwise_xor() 按位异或 cv2.bitwise_not() 按位取反相对应函数使用代码如下(示例):
按位与 按位或
def logic_demo(m1, m2): dst1 = cv2.bitwise_and(m1, m2) dst2 = cv2.bitwise_or(m1, m2) cv2.imshow("logic_demo_and", dst1) cv2.imshow("logic_demo_or",dst2)
按位非运算 按位异或
def logic_demo2(m1,m2): dst1=cv2.bitwise_not(m1,m2) dst2=cv2.bitwise_xor(m1,m2) cv2.imshow("logic_demo_not", dst1) cv2.imshow("logic_demo_xor",dst2)
实现
img1=cv2.imread("LinuxLogo.jpg") img2=cv2.imread("WindowsLogo.jpg") cv2.imshow("image1", img1) cv2.imshow("image2", img2) logic_demo(img1,img2) #logic_demo2(img2,img1) cv2.waitKey(0) cv2.destroyAllWindows()
通过图像按位异或实现加密和解密的过程代码如下(示例):
import cv2 import numpy as np demo = cv2.imread("shenmi.jpg", 0) r, c = demo.shape key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8) # 生成随机的密钥图像 cv2.imshow("shenmi", demo) # 显示原始图像 cv2.imshow("key", key) # 显示密钥图像 encryption = cv2.bitwise_xor(demo, key) # 加密 decryption = cv2.bitwise_xor(encryption, key) # 解密 cv2.imshow("jiami", encryption) # 显示密文图像 cv2.imshow("jiemi", decryption) # 显示解密后的图像 cv2.waitKey(-1) cv2.destroyAllWindows()
将图片进行面部打码代码如下(示例):
import cv2 import numpy as np img = cv2.imread("shenmi.jpg",0) height,width=img.shape mask=np.zeros((height,width),dtype=np.uint8) mask[31:124,63:111]=1 key=np.random.randint(0,256,size=(height,width),dtype=np.uint8) shenmi=cv2.bitwise_xor(img,key) face=cv2.bitwise_and(shenmi,mask*255) noface = cv2.bitwise_and(img,(1-mask)*255) final=face+noface mask[45:130,125:191]=1 key=np.random.randint(0,256,size=(height,width),dtype=np.uint8) shenmi=cv2.bitwise_xor(img,key) face=cv2.bitwise_and(shenmi,mask*255) noface2 = cv2.bitwise_and(img,(1-mask)*255) cv2.imshow("img",img) cv2.imshow("noface ",noface ) cv2.imshow("noface2 ",noface2 ) cv2.waitKey() cv2.destroyAllWindows()
效果如下(示例):
图片进行数字水印代码如下(示例):
import cv2 import numpy as np lena=cv2.imread("lena.bmp",0) watermark=cv2.imread("watermark.bmp",0) w=watermark[:,:]>0 watermark[w]=1 r,c=lena.shape #============嵌入过程============ t254=np.ones((r,c),dtype=np.uint8)*254 lenaH7=cv2.bitwise_and(lena,t254) e=cv2.bitwise_or(lenaH7,watermark) #============提取过程============ t1=np.ones((r,c),dtype=np.uint8) wm=cv2.bitwise_and(e,t1) print(wm) w=wm[:,:]>0 wm[w]=255 #============显示============ cv2.imshow("lena",lena) cv2.imshow("watermark",watermark*255) cv2.imshow("e",e) cv2.imshow("wm",wm) cv2.waitKey() cv2.destroyAllWindows()