图像运算

一:图像加法运算

在灰度图像中,通常用1个字节来表示像素,像素值范围[0,255],在像素相加时,其值可能大于255,在不同的加法运算方式中,对超过255的数值有着不同的处理方式。

1、加号运算符

使用加号运算符“+”对图像a(像素值为a)与图像b(像素值为b)进行求和运算:
a+b=mod(a+b,256)
将a,b相加的直接结果对256取模(即小于256时得原结果,大于等于256时,得余数)

2、cv2.add()函数

计算结果=cv2.add(a,b),此处a,b既可以是单个像素,也可以是整张图像(大小及类型必须一致)
(1)当结果小于256时得到直接相加的运算结果。
(2)当结果大于等于256时得到饱和值255。

二:图像加权和

dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
(要求图像src1与src2的大小及类型必须相同)
实现的功能为:dst=src1alpha+src2beta+gamma,其中gamma可以为0,但不能省略(必选参数),两系数alpha与beta之和可以为1,也可以不为1,上式可以理解为:结果图像=图像1 * 系数1 + 图像2 * 系数2 + 亮度调节量

img1=cv2.imread("img/1.jpg")
img2=cv2.imread("img/2.jpg")
roi1=img1[50:150,200:400]
roi2=img2[100:200,50:250]
add=cv2.addWeighted(roi1,0.2,roi2,0.6,50)
img1[50:150,200:400]=add
cv2.imshow("img1",img1)
cv2.imshow("img2",img2)
cv2.imshow("result_img1",img1)
cv2.waitKey()

三:按位逻辑运算

按位运算指将数值转换为二进制后,对应位置上的运算
要求参与运算的图像具有相同的通道

dst=cv2.bitwise_and(src1,src2,mask) #按位与
dst=cv2.bitwise_xor(src1,src2,mask) #按位与或,(不带进位的二进制加法,
即相同为0,相异为1)
dst=cv2.bitwise_or(src1,src2,mask) #按位或
dst=cv2.bitwise_not(src1,src2,mask) #按位取反
mask为可选掩码,8位单通道array,操作只会在掩码值为非0的像素点上
执行,并将其他像素点置为0。**(自己测了一下,没有得到所说的结果)**

四:图像与数值的运算

	在上述的加法运算和按位运算中,参与运算的两个算子(参数)既可以
是两幅图像,也可以是一幅图像与一个数值,同样也可以是两个数值。如
果想要提升图像的整体亮度,可以给图像加上一个统一像素值的图像,也
可以加上一个固定值

五:位平面分解

将灰度图中处于同一比特位上的二进制像素进行组合,得到一幅二进制图像,该图像称为灰度图像的一个位平面,这个过程称为位平面分解。(如:将一幅灰度图像内所有的像素点上处于二进制位内最低位上的值进行组合,可构成“最低有效位”平面),8位二进制灰度图可以构成8个位平面,我们将其按照与原图的相似性从高到低(最高位权重最大,最相似)分为第7~0位平面。

1:构造提取矩阵
通过按位与操作将一个数值指定位上的数字提取出来,如:使用00000010提取8位二进制的倒数第二位(第1位平面)上的数值

2:阈值处理
通过计算得到的位平面是一个二值图像,但默认当前显示的图像为8位灰度图,当直接显示时,图像近乎全黑(像素值只有0和1),所以每次提取的位平面要能以黑白图像显示图来,就需要将大于0的像素值处理为255。

#下面直接以RGB单通道图像为例
import cv2
import numpy as np
img2=cv2.imread("img/3.jpg")
h,w,c=img2.shape
x=np.zeros((h,w,c,8),dtype=np.uint8)
#得到每个位面上的提取矩阵
for i in range(8):
    x[:,:,:,i]=2**i
r=np.zeros((h,w,c,8),dtype=np.uint8)
cv2.imshow("img2",img2)
for i in range(8):
    r[:,:,:,i]=cv2.bitwise_and(img2,x[:,:,:,i])
    mask=r[:,:,:,i]>0
    r[mask]=255
    cv2.imshow(str(i),r[:,:,:,i])
cv2.waitKey()

从左到右,由上至下,前8张图分为第0~7位平面,最后一张为原图。

六:图像的加码与解码

通过对原始图像与密钥图像进行按位异或可以实现加密,将加密后的图像与密钥图像再进行异或可以实现解密。

	import cv2
	import numpy as np
	img1=cv2.resize(cv2.imread("img/2.jpg"),(400,300))
	img2=cv2.resize(cv2.imread("img/1.jpg"),(400,300))
	#加密
	encode_image=cv2.bitwise_xor(img1,img2)
	#从新得到img1,实现解密
	decode_image=cv2.bitwise_xor(encode_image,img2)
	cv2.imshow("img1",img1)
	cv2.imshow("img2",img2)
	cv2.imshow("encode_image",encode_image)
	cv2.imshow("decode_image",decode_image)
	cv2.waitKey()

七:数字水印

将需要隐藏的二值图像信息嵌入载体图像的最低有效位(第0位面,对载体图片的影响最小,具有隐蔽性)。必要时直接将载体图像的最低位提取出来,即可得到嵌入其中的二值图像,达到提取秘密信息的目的。该种数字隐藏也被称为数字水印,如版权认证、身份认证等。

1、原理
(1) 嵌入过程:将载体图像的第0位平面替换为数字水印信息
(2) 提取过程:将载体图像的最低有效位所构成的第0位面提取出来,得到水印信息

注意:在实际使用时,可以在多个通道嵌入相同水印(提高鲁棒性,即使部分水印丢失,也能提取完整水印信息),也可以在不同通道嵌入不同水印(提高嵌入容量)。

import cv2
import numpy as np
#二值图像水印
import cv2
import numpy as np
img2=cv2.resize(cv2.imread("img/3.jpg"),(400,400))
#img1为二值图像,若不为二值图像,在下面经过二值化处理后与原图相差较大,不好比较结果
img1=cv2.resize(cv2.imread("img/4.jpg"),(400,400))

#嵌入过程
##二值化处理##
w=img1[:,:,:]>0
img1[w]=1
t254=np.ones([400,400,3],dtype=np.uint8)*254
img2H7=cv2.bitwise_and(t254,img2)#高七位不变,最低位替换为0
img1_img2_mark=cv2.bitwise_or(img2H7,img1)#将img1嵌入最低位

#提取过程
t1=np.ones([400,400,3],dtype=np.uint8)#高七位为0,最低位为1
dec_img1=cv2.bitwise_and(t1,img1_img2_mark)

#阈值处理,将1的像素值调整为255,便于显示
w1=dec_img1[:,:,:]>0
dec_img1[w1]=255

#显示图片
black=np.zeros((400*2,400*2,3),np.uint8)
black[0:400,0:400]=img2
black[400:800,0:400]=img1_img2_mark
#将0,1二值图调整为0,255以便显示
black[0:400,400:800]=img1*255
black[400:800,400:800]=dec_img1
cv2.imshow("black",black)
cv2.waitKey()

在这里插入图片描述
从图像上看,图1与图3几乎没有差别,因为它们只是最低位平面不一样(图3由图1将最低位平面替换为图2所得),图2是原始水印(二值图),图4是在图3的基础上解密得到的水印图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值