opencv图像运算 图像加密

图像加权和

可以用cv2.addWeighted()表示加权和
一个注意点:
cv2.addWeighted(a,0.5,b,0.5,0)中两个图像的尺寸和通道数要相同,不然会报错。
示例:

a = cv2.imread("p7.jpg")
b = cv2.imread("me1.jpg")
face1 = a[0:300,100:400]
face2 = b[150:450,100:400]
result= cv2.addWeighted(face1,0.5,face2,1,0)
cv2.imshow("re",result)

# cv2.imshow("i3",img)
cv2.waitKey()

在这里插入图片描述

按位逻辑运算

cv2.bitwise_and() 按位与
cv2.bitwise_or()按位或
cv2.bitwise_xor()异或
cv2.bitwise_nor()取反
数值200与255进行按位与,保持200不变
示例:

a = cv2.imread("p7.jpg",0)
b = np.zeros(a.shape,np.uint8)
cv2.imshow("re",b)
b[100:300,100:400] = 255
c = cv2.bitwise_and(a,b)
cv2.imshow("reu",c)

# cv2.imshow("i3",img)
cv2.waitKey()

在这里插入图片描述
由于按位与操作要求参与运算的数据有相同的通道,所以无法直接将彩色图像与单通道掩膜图像进行按位与操作
将函数改为按位或:
在这里插入图片描述
opencv很多函数都指定一个掩膜作为参数,使用掩膜参数时,操作只会在掩膜非空的像素点上执行,并将其他像素置为0

cv2.threshold()
这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
• cv2.THRESH_BINARY(黑白二值)
• cv2.THRESH_BINARY_INV(黑白二值反转)
• cv2.THRESH_TRUNC (得到的图像为多像素值)
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV
该函数有两个返回值,第一个retVal(得到的阈值值(在后面一个方法中会用到)),第二个就是阈值化后的图像。

图像加密:

a = cv2.imread("p7.jpg",0)
# a = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
h,w = a.shape
mask = np.zeros((h,w),dtype=np.uint8)
mask[100:300,200:400] = 1
key = np.random.randint(0,256,size=[h,w],dtype=np.uint8)
after = np.bitwise_and(a,mask*255)

afterxor = cv2.bitwise_xor(key,a)
cv2.imshow("afterxor",afterxor) #图片加密
cv2.imshow("a",after)
encypt = cv2.bitwise_and(afterxor,mask*255)
cv2.imshow("encypt",encypt) 
noface1 = cv2.bitwise_and(a,(1-mask)*255)
cv2.imshow("noface",noface1)
noface2 = cv2.bitwise_and(a,afterxor)
maskface = encypt+noface1 #图像打码
cv2.imshow("maskface",maskface)
cv2.imshow("noface2",noface2)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:
在这里插入图片描述

颜色空间的转化用到了如下约定:

8位图像值的范围是[0,255] 16位图像值的范围是[0,65535] 浮点数图像值的范围是[0,1]
np.random.randint
np.random.randint(5, size=(3,2, 4))
生成0-5的范围内(不包括5)的三个矩阵,每个矩阵为2行4列
在这里插入图片描述
进行试验:

img = np.random.randint(0,256,size=[200,70,4],dtype=np.uint8)
cv2.imshow("img",img)

结果:
在这里插入图片描述
size=[200,70,4]中随着第二个参数的增大,横向区域不断变大。且第二个和第三个参数的大小不能超过第一个,不然报错
第一个参数增大后纵向距离变大
其中第三个参数为4时程序可以正常,但是为5和2时就会报错,猜测应该是小于4通道数
在这里插入图片描述
第三个参数为1时也可以正常运行:
在这里插入图片描述
不加第三个参数时,显示的也是如上的灰度图
当图像从GRAY色彩空间转化到RGB/BGR色彩空间时,最终所有的通道的值都是相同的
在RGB和BGR模式之间发生转化时,R和B通道的位置发生了交换。
模式转化之后:

img = cv2.imread("p7.jpg")
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow("img",img)
cv2.imshow("img2",img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41358574/article/details/114072276