opencv图像处理算法,opencv处理图像
操作图像添加可以通过加号运算符“”或cv2.add()函数来执行。的总和很可能超过255。以上两种不同的加法,对于超过255的值有不同的处理方式。加号运算符
“mod(a b,256)”的意思是计算“a b之和除以256得到余数”
通过将数组的数值类型定义为dtype=np.uint8,可以保证数组值的范围在[0,255]之间。
cv2.add
计算结果=cv2.add(图像1,图像2),两个参数都是图像。此时,参与计算的图像的大小和类型必须一致。计算结果=cv2.add(数值,图像),第一个参数是数值,第二个参数是图像。此时,超过图像饱和度值的数值将被视为饱和度值(最大值)。计算结果=cv2.add(图像,数值),第一个参数是图像,第二个参数是数值。此时,超过图像的饱和度值的数值被视为饱和度值(最大值)。图像加权和当计算两幅图像的像素值之和时,会考虑每幅图像的权重。
dst=饱和(src1 src2 )
Saturate()表示饱和值(最大值)
在计算图像的加权和时,要求src1和src2的大小和类型必须相同,但对具体的类型和通道没有特别的限制。
OpenCV中提供了函数cv2.addWeighted()来实现图像的加权求和(混合和融合)。
Dst=cv2.addweighted (src1,alpha,src2,beta,gamma)参数alpha和beta是src1和src2对应的系数,它们的和可以等于也可以不等于1。这个函数的作用是dst=src1alpha src2beta gamma。公式中参数gamma的值可以为0,但该参数是必需的,不能省略。
上面的公式可以理解为“结果图像=图像的亮度级数量1系数1图像2系数2”。
位逻辑运算的常用位运算函数
逐位逐位运算是指将数值转换成二进制值后,在相应位置进行的与运算。
使用cv2.bitwise_and()函数实现按位and运算。
DST=cv2.bitwise _ and (src1,src2 [,mask]) DST表示数组输出值src1表示第一个数组或标量输入值src2表示第二个数组或标量输入值mask表示可选操作mask,8位单通道数组使用mask提取BGR模式彩色图像的指定部分。
由于按位运算涉及的数据与运算所需的通道相同,所以无法直接将彩色图像与单一通道的蒙版图像进行按位and运算。通常,可以通过在BGR模式下将掩模图像转换成彩色图像来实现掩模操作,使得彩色图像和掩模图像可以被逐位and操作。
形状获取图像a的尺寸数据
根据bit或dst=cv2.bitwise _ or (src1,src2 [,mask]) dst,指示与输入值大小相同的数组输出值。1 src1表示第一个数组或标量类型的输入值。2 src2表示第二个数组或标量类型的输入值。表示mask可选操作掩码,8位单通道数组值。逐位非逐位非逐位运算是指将一个数值转换为二进制值,然后在相应的位置进行非逐位运算。
DST=CV2。Bitwise _ Not (src [,mask]) DST表示与输入值大小相同的数组输出值。表示src数组类型的输入值。表示mask可选操作掩码,8位单通道数组值。按位异或运算也叫半加运算,其运算原理类似于不带进位的二进制加法。
转换成二进制值后,在相应的位置进行异或运算。
DST=CV2。Bitwise _ XOR (src1,src2 [,mask]) DST表示与输入值大小相同的数组输出值。1 src1表示第一个数组或标量类型的输入值。2 src2表示第二个数组或标量类型的输入值。表示mask可选操作掩码,8位单通道数组值。例如,面具:
计算结果=cv2.add(参数1,参数2,掩码)
当使用mask参数时,将仅对mask值不为空的像素执行操作,其他像素的值将被设置为0。
函数中使用的遮罩参数可以是8位单通道图像。因此,掩码图像可以用作逐位与函数cv2 (src1,src2 [,mask]]中参数mask的值,以完成掩码操作
此时,让待处理的彩色图像同时作为函数cv2.bitwise _ and (src1,src2 [,mask]]的参数src1和src2,用掩膜图像作为掩膜参数完成按位and运算,就可以得到掩膜控制的彩色图像。
使用的遮罩参数控制目标图像中哪些区域的值为彩色图像,哪些区域的值为0。
除了图像值的加法运算和位运算,运算中涉及的两个运算符(参数)可以是两个图像,也可以是一个图像一个值。
Img=cv2.add (img 1,6)位平面分解将灰度图像中同一位的二值像素值进行组合,得到二值图像,称为灰度图像的位平面,这个过程称为位平面分解。
例如,可以通过组合灰度图像中所有像素的二进制位中最低位的值来形成“最低有效位”位平面。
由图像中所有像素值的ai值组成的位平面被称为第I个位平面(第I层)
在一幅8位灰度图像中,可以形成8幅二值图像,即原始图像可以分解成8个位平面。
ai在像素值中的权重不同。
A7的权重最高,其位平面与原始图像的相关性最高,通常看起来与原始图像最相似。A0的权重最低,A0形成的位平面与原图像的相关性最低,通常看起来比较混乱。对于RGB图像,如果对应于R通道、G通道和B通道中的每一个的位平面被合并,则可以形成新的RGB彩色图像。例如,对于一幅RGB图像,将R通道的第三位平面、G通道的第三位平面和B通道的第三位平面组合起来,可以形成一幅新的RGB彩色图像,我们称之为原图像的第三位平面。
位分解的具体步骤
图像预处理
读取原图像O,得到原图像O的宽度m和高度n。构造矩阵
使用按位AND运算可以很容易地提取出某个数值的指定位上的数字。
建立一个具有2n个值的Mat作为提取矩阵(数组),用于与原图像进行按位AND运算,提取第n个位平面。
提取位平面
对灰度图像和提取矩阵进行逐位运算,得到每个位平面。
通过与值为2n的像素值进行按位AND,可以保持像素值的第n位不变,其余位全部置零。因此,通过像素值和特定值的按位AND运算,可以提取像素值的指定二进制位的值。同样,图像的指定位平面可以通过按位AND运算提取。
提取的位平面也可以通过将二进制像素值向右移动指定的位,移动到最低位,然后取模2来获得。例如,要提取第n个位平面,可以将像素向右移动n位,然后取模2,得到第n个位平面。(注意缺少此时获得的相应系数。2)阈值处理如果认为不同位平面的权重不同,则阈值处理是不必要的。
计算出的位平面是二值图像,如果直接显示位平面,会得到近乎黑色的图像。
也就是说,每次提取位平面后,如果二进制位平面可以黑白显示,那么得到的二进制位平面就要进行阈值处理,大于零的值按255处理。
例如,对获得的位平面RD进行阈值处理,并将大于0的位平面RD调整为255。具体说法是:#借助numpy。
mask=RD[:i] 0
RD[mask]=255首先用mask=RD[:i] 0处理RD:
将RD中大于0的值视为逻辑值True。将RD中小于或等于0的值视为逻辑值False。使用RD[mask]=255,将RD中“mask中的逻辑值为真”对应位置的值替换为255。显示图像示例:矩阵X的八个通道分别用于提取灰度图像的八个位平面。例如,x[:0]用于提取灰度图像的第0个位平面。
第7个位平面是最接近原始图像的二进制图像。
导入cv2
将numpy作为np导入
Lena=cv2.imread (img/Lena.jpg ,0) #将参数设置为0,即以灰色模式读取。
cv2.imshow(lena ,lena)
r,c=lena.shape
x=np.zeros((r,c,8),dtype=np.uint8)
对于范围(8)中的I:
x[:i]=2**i
x[:i]=cv2.bitwise_and(lena,x[:i])
# mask=x[:i] 0
# x[掩码]=255
cv2.imshow(str(i),x[:i])
cv2.waitKey()
2.cv2.destroyAllWindows()的图像加密解密可以通过按位异或运算实现图像加密解密。
#使用掩码和位运算对面部进行编码和解码。
导入cv2
将numpy作为np导入
#阅读原始载体图像
lena=cv2.imread(img/lena.jpg ,0)
#读取原始载体图像的形状值
r,c=lena.shape
mask=np.zeros((r,c),dtype=np.uint8)
mask[220:400,250:350]=1
#获取一个密钥,用于编码和解码的密钥。
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)
#========获取码面==========
#用密钥key加密原始图像lena
lenaXorKey=cv2 . bitwise _ xor(Lena,Key)
#获取加密图像encryptFace的人脸信息
encrypt face=cv2 . bitwise _ and(lenaXorKey,mask*255)
#设置图像lena中的面值为0,得到noFace1。
noFace1=cv2.bitwise_and(lena,(单掩码)*255)
#获取编码的lena图像
maskFace=encryptFace noFace1
#=========会解码码面=========
# XOR lena,其人脸被编码,用key key得到人脸的原始信息。
extract original=cv2 . bitwise _ xor(mask face,key)
#提取解码后的人脸信息extractOriginal,得到extractFace
extract face=cv2 . bitwise _ and(extract original,mask*255)
#从带人脸编码的lena中提取无人脸信息的lena图像,得到noFace2。
noFace2=cv2.bitwise_and(掩码面,(1-掩码)*255)
#获取解码后的lena图像
extractLena=noFace2 extractFace
#========显示图像==========
cv2.imshow(lena ,lena)
cv2.imshow(mask ,mask*255)
cv2.imshow(单掩码,(单掩码)*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()
2.cv2.destroyAllWindows()的数字水印最低有效位(LSB)是指二进制数中的第0位(即最低位)。
最低有效位信息隐藏是指将一幅需要隐藏的二值图像信息嵌入到载体图像的最低有效位,即用当前需要隐藏的二值图像替换载体图像的最低有效位层,从而实现隐藏二值图像的目的。
由于二值图像位于载体图像的最低有效位上,对载体图像的影响不明显,具有较高的隐蔽性。
必要时,可以直接提取载体图像的最低有效位层,从而得到嵌入该位的二值图像,达到提取秘密信息的目的。
这种信息隐藏也称为数字水印,可以实现信息隐藏、版权认证、身份认证等功能。
在灰度二值图像中,像素值只有0和255两种,分别用来表示黑色和白色。
由于最低有效位信息对值的影响有限,载体图像的像素值在用水印信息代替载体图像的最低有效位值后变化不大,人眼看不出区别,水印具有很高的隐蔽性。
要保留图像的高七位,还有一种实现方法,就是像素先右移一位,再左移一位。
像素值的最低有效位可以通过模2获得。因此,通过对水印载体图像对2取模可以得到图像的“最低有效位”位平面,提取的位平面就是水印信息。
导入cv2
将numpy作为np导入
#阅读原始载体图像
lena=cv2.imread(img/lena.jpg ,0)
#读取水印图像
watermark=cv2 . im read( img/watermark . jpg ,0)
#将水印图像中的值255处理为1,以便于嵌入。
#后续章节将介绍阈值处理的使用。
w=水印[:] 0
水印[w]=1
#读取原始载体图像的形状值
r,c=lena.shape
#========嵌入过程==========
#生成一个元素值都是254的数组
t254=np.ones((r,c),dtype=np.uint8)*254
#获取lena图像的高七位
lenaH7=cv2.bitwise_and(lena,t254)
#在lenaH7中嵌入水印
e=cv2.bitwise_or(lenaH7,水印)
#========提取过程==========
#生成一个元素值都为1的数组
t1=np.ones((r,c),dtype=np.uint8)
#从载体图像中提取水印图像
wm=cv2.bitwise_and(e,t1)
打印(wm)
#将水印图像中的值1处理为255,以便于显示。
#后续章节将介绍使用threshold的实现。
w=wm[:] 0
wm[w]=255
#========显示==========
cv2.imshow(lena ,lena)
2.imshow (watermark ,watermark * 255) #当前水印中的最大值是1
cv2.imshow(e ,e)
cv2.imshow(wm ,wm)
cv2.waitKey()
cv2.destroyAllWindows()
风暴中的白杨
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。