OpenCV入门——图像运算

一.图像加法
通常情况下,在灰度图像中像素使用8特位来表示。像素值的范围是零到255,两个像素值在进行加法运算时,求得的和可能会超过255。加号运算符和add函数对待超过255的数值的处理方式是不同的。
(1)加号运算符“+”
加号运算符的公式可以写为a+b=mod(a+b,256) 它对于加和超过255的数值会自动取模举一个下面的例子。在进行运算时完全符合线性代数矩阵的加法–对应位置的元素相加img1和img2中间位置的两个元素227+154=381;381%256=125
Eg:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Code:

import numpy as np
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
print("img1+img2=\n",img1+img2)

(2)add函数
函数对于大于255的值将会处理成饱和值255。​但需要注意的是,如果处理两个图像相加时参与运算的图像大小和类型必须保持一致。需要注意的是,单一数值与图像相加就是图像上的每一个像素点都加上对应的值。整体提高亮度。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Code:

import numpy as np
import cv2
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)

两种方法的比较:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一幅图是灰度原图,第二幅和第三幅都是原图两次叠加后的结果。第二幅采用的是“+”,第三幅使用的是add函数。从结果上来看,add函数是将整体图像变亮了。
Code:

import cv2
a=cv2.imread("lena.bmp",0)
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("original",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()

二.加权和
图像加权和就是在计算两幅图像的像素值之和时,需要将每幅图像的权重都考虑进来。具体的表达式应该是
dst = cv2.addWeighted(src1,alpha,src2,beta,gamma)
第一个参数是求加权和的第一幅图像。第二个参数是,这幅图像所对应的比例。第三个参数是第二幅图像。第四个参数是第二幅图像所占的比例。第五个参数是调节的亮度,也可以把它理解成偏移量。
同样需要注意求加权和的两幅图像大小。类型必须相同。但对具体是什么类型并没有限制,可以是任意的数据类型。可以是灰度图,也可以是彩色图,也可以是有任意数量的通道,只要两者相同即可。加权法适合进行融合。
效果:
在这里插入图片描述

Code:
import cv2
a=cv2.imread("boat.bmp")
b=cv2.imread("lena.bmp")
result=cv2.addWeighted(a,0.6,b,0.4,0)
cv2.imshow("boat",a)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()

三.按位逻辑运算
常见的位运算函数有按位与,按位或,按位异或,按位取反。
1.按位与
两个逻辑值都为真时才为真,其余均为假。对于两个数值按位与运算来说,需要将十进制转换为二进制。其语法格式是dst = cv2.bitwise_and(src1,src2[,mask])
其中mask掩膜参数是可选的。
2.按位或
两个逻辑之中有一个为真时,结果就为真,只有均为假时,结果才为假。语法格式为dst = cv2.bitwise_or(src1,src2[,mask])

3.按位异或
只有两个运算数不相同时才为真。语法格式为dst = cv2.bitwise_xor(src1,src2[,mask])

4.按位取反
运算数为真时,结果为假。运算数为假时结果为真。语法格式为 dst = cv2.bitwise_not(src1[,mask])
四.掩膜
在add函数中第三个参数就是掩膜。操作就是将相加的和再与掩膜进行按位与。来达到只显示感兴趣的部分的目的。掩膜是用选定的图形、图像或物体,对处理的图像(全部或局部)进行遮挡,已到达控制图像处理区域和控制图像处理过程的目的。
掩膜的主要用途:
1 提取感兴趣的区域;2 屏蔽作用;3 结构特征提取;4 特殊形状图像的制作
可以通过一步按位与操作即可完成。

Code:

import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
mask=np.zeros((4,4),dtype=np.uint8)
mask[2:4,2:4]=1
img3=np.ones((4,4),dtype=np.uint8)*66
print("img1=\n",img1)
print("img2=\n",img2)
print("mask=\n",mask)
print("初始值img3=\n",img3)
img3=cv2.add(img1,img2,mask=mask)
print("求和后img3=\n",img3)

五、图像的加密解密(两步按位异或)

对于二进制的图像某一位置取值只有0和1两个选项。

图像的加密、解密过程就非常容易表达了。

src代表原图,key代表密钥,第一步异或操作如下

src 0 0 1 1

key 0 1 0 1

val 0 1 1 0

再将val与密钥key再进行一次异或操作

val 0 1 1 0

key 0 1 0 1

rst 0 0 1 1

得到rst与原图相同。因此只需要掌握密钥即可达到加密的效果。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据原图生成一个大小相同的随机矩阵作为密钥,可以看到加密后的图像是充满马赛克的,完全看不出原图的信息,但通过用密钥解密仍能得到原图。

code:

key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)
encryption=cv2.bitwise_xor(lena,key)
decryption=cv2.bitwise_xor(encryption,key)

如果有什么疑问,欢迎在评论区或私信讨论呦(_)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值