图像与数值的计算
以前都是两个图像之间的计算,现在看看图像和数值,就像为了增加图像的整体亮度,可以给每个像素值加上一个特定的值。cv2.add(img,6)
感觉就是变紫了。。。
位平面分解
将灰度图中处于同一个比特位上的二进制像素值进行组合,得到一副二进制值图像,该图像称为灰度图的一个位平面。这个过程为平面分解。例如将一副灰度图内所有像素点位与二进制位内最低位上的值进行组合,可以构成最低有效位 位平面。。。
就是说,每个像数使用8位二进制值表示,范围再0-255,这个值可以使用(二进制转十进制的权重相加嘛)
这个式子表示,其中ai 的值是 1 或 0 ,可以看出a7 的权重最高,对图像的影响最大,a0对图像的影响最小。将灰度图每个像数点的每一位分别组合,可以获得多个位平面。比如8位的灰度图,就可以分解位8个位平面。
a7构成的位平面与原图相关性最高,a0构成的位平面最低。
h 图是由a7 构成,第七位平面,也是最高有效位 位平面。下面介绍位平面分解步骤:
- 图像预处理:读取原图像O,获取宽度M 高度 N
- 构造提取矩阵:使用按位与。哪位为1,就可以提取出那位。Mat 为提取矩阵
- 提取位平面:将灰度图与齐取矩阵进行按位与运算,获得各个位平面。
- 阈值处理:以上获得的位平面是一个二值图像。为了更加清楚要将大于零的数处理成 255(白色)。
mask=RD[:,:]>0 # 得到布尔数组
RD[mask]=255
- 显示图像
lena=cv2.imread("5.jpg",0)
cv2.imshow("lena",lena)
r,c=lena.shape
x=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):
x[:,:,i]=2**i # 构建8个位平面
r=np.zeros((r,c,8),dtype=np.uint8)
for i in range(8):
r[:,:,i]=cv2.bitwise_and(lena,x[:,:,i])
mask=r[:,:,i]>0
r[mask]=255
cv2.imshow(str(i),r[:,:,i])
cv2.waitKey()
cv2.destroyAllWindows()
我看着第6个位平面跟原图最接近啊。。。。
图像加密和解密
通过按位异或可以实现对图像的加密和解密。原图和密匙图进行按位异或实现加密。异或就是不一样的就是1.
xor(a,b)=c , xor(c,b)=a , xor(c,a)=b 。
- a明文,原始数据。b密匙,c密文,通过xor(a,b) 实现
- 加密,明文与密匙进行按位与,获得密文。解密:密文与密匙异或获得明文。
利用位运算可以实现对像素点的加密。例如:某个像素点的值位216,密匙为178(加密者自定)bit_xor(216,178)=106 加密 bit_xor(106,178)=216 解密。在使用opencv中,运算函数都是十进制的,可以直接对十进制参数进行按位异或。
lena=cv2.imread("5.jpg",0)
r,c=lena.shape
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8) # 随机一个密匙
encryption=cv2.bitwise_xor(lena,key) # 加密
decryption=cv2.bitwise_xor(encryption,key) # 解密
cv2.imshow("lena",lena)
cv2.imshow("key",key)
cv2.imshow("encryption",encryption)
cv2.imshow("decryption",decryption)
cv2.waitKey()
cv2.destroyAllWindows()
啊,,,这,可以ghs,不被管理员踢了。。。
数字水印
最低有效位(LSB)指的是第零个位平面,最低有效位信息隐藏指的是,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,就是将载体图像的最低有效位层替换为当前需要隐藏的二值图像,从而将二值图像隐藏的目的。最低有效位对图像的影响非常不明显,有较高的隐蔽性。。。啊,,这,,,
这种信息隐藏也被称为数字水印,可以实现信息隐藏,版权认证,身份认证。数字水印信息可以是文本,视频,音频等多种形式,这里仅讨论二值图的情况,,,以后我一定要全搞明白(狗头)
这里以原始图像为灰度,水印图像为二值图为例子。实际中,原始图像,水印图像都可以为彩色图像,这时需要将他们进行通道分解,图层分解,在多个通道内嵌入相同的水印(即使部分水印丢失,也可以提取出完整水印信息),或在各个不同的通道内嵌入不同的水印(提高嵌入容量)。后续方法与灰度图像内嵌入二值水印图像的处理方法相同。
- 嵌入过程
保留载体图像的高七位,将最低位置0. 数值与254进行按位与 可以实现。 然后进行水印图像处理。就是将二值图,转换成0 和 1。
然后将水印图和修改后的原图进行按位或运算就行了。
- 提取过程
建立提取矩阵(就是元素全为1的),将含水印的图像与提取矩阵按位与运算,提取水印信息。可以进行阈值处理,将提取出来的1调为255以便显示。
我找的黑白图不纯,,根据实际来做吧。。。添加了水印的还真看不出来啊。。
脸部打码及解码
lena=cv2.imread("5.jpg",0)
r,c=lena.shape
mask=np.zeros((r,c),dtype=np.uint8)
mask[20:150,150:230]=1
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8) # 获取密匙
lenaXorKey=cv2.bitwise_xor(lena,key) # 对原图像加密
encryptFace=cv2.bitwise_and(lenaXorKey,mask*255) # 获取加密图的脸部信息
noFace1=cv2.bitwise_and(lena,(1-mask)*255) # 将原图的脸部位置置0
maskFace=encryptFace+noFace1 # 得到打码的原图
# 解码
extractOriginal=cv2.bitwise_xor(maskFace,key) # 得到脸部的原始信息
extractFace=cv2.bitwise_and(extractOriginal,mask*255) # 提取脸部信息
noFace2=cv2.bitwise_and(maskFace,(1-mask)*255) # 从打码的原图内提取没有脸的原图
extractLena=noFace2+extractFace # 得到解码的原图
# 显示图像
cv2.imshow("lena",lena)
cv2.imshow("mask",mask*255) # 图太多了,不贴了,,,,,
cv2.imshow("1-mask",(1-mask)*255)
cv2.imshow("key",key)
cv2.imshow("lenaXorKey",lenaXorKey)
cv2.imshow("encryptFace",encryptFace)
cv2.imshow("noFace1",noFace1)
cv2.imshow("maskFace",maskFace)
cv2.imshow("extractOriginal",extractOriginal)
cv2.imshow("extractFace",extractFace)
cv2.imshow("noFace2",noFace2)
cv2.imshow("extractLena",extractLena)
cv2.waitKey()
cv2.destroyAllWindows()
今天的文章opencv获取轮廓内所有像素_opencv获取轮廓内所有像素分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83474.html