将图片看成类型为uint8的像素矩阵,因此我们可以将两个像素矩阵进行加减乘除等一些列运算,这也被称为像素运算,像素运算包括两种:
本小节主要介绍像素运算中的算术运算。
01
算术运算
算术运算至少需要两张图片,由于将图片看成了拥有三个通道的像素矩阵(还有单通道),因此两张图片的算术运算,很显然的推广到矩阵之间的运算。学过线性代数的应该知道,矩阵之间能够进行加法和减法运算的前提条件是两个矩阵必须形状一样,因此在对两张图片进行算术运算的时候,必须长宽一致才可以。还有一点需要注意,此时的加减很好理解,但是此时的乘除并不是矩阵之间的乘法或者除法(乘以逆矩阵),而是像素矩阵中对应元素之间的乘除,即逐位运算。
为了演示更好的效果,这里使用下面两张图片,文件名分别命名为"01.jpg"以及"02.jpg"。
02
像素运算~加法
处理图像的相加操作,实质上就是图像的像素矩阵相加。我们分别使用OpenCV提供的add函数以及直接使用图像的像素ndarray数组进行相加操作。
执行结果:
可以看出执行的结果并不是我们想的那样,两种方式得到的结果并不一致。下面通过一个简单的例子:
打印出相加后像素矩阵的结果:
[[ 40 255 255]
[245 240 255]
[255 255 255]]
********************
[[ 40 19 0]
[245 240 19]
[101 209 186]]
从上面的结果可以看出,其实执行结果不同,只是因为两种相加方式对于uint8类型数据超过255的不同处理而已,
我们通常用到的就是OpenCV这种处理方式,对于原始的两张图来说,Linux图中大部分都是黑色,也就是为像素值为0的部分,因此加上windows图中的有颜色部分,相加得到的就是windows图像的颜色,而Linux图中的白色部分,本身已经是255了,在加上windows中非0的颜色像素,更会超过255,由于OpenCV中将其设置为255,因此还是白色。
03
像素运算~加法
像素的减法操作和前面的加法操作类似。
执行结果:
当然如果使用ndarray数组直接进行相减操作也是可以的,但是和相加一样,两种方式对负数的处理不同:
Linux中黑色部分像素值为0,0减去windows中彩色部分变为负数,OpenCV中将其变为0,因此大部分都是黑色,但是在Linux中白色部分,像素值为255,而对应的windows部分值为0 - 255之间,因此相减会变成一个正的整数,因此可以看出做减法操作的时候,Linux图片文字的部分很炫,五颜六色。
04
像素运算~乘法
有了减法和加法的积累,乘法操作也是很简单的,这里只需要注意:
执行结果:
可以看出结果还是挺炫的,相乘操作,如果非零相乘的话会让结果变大,当然0乘上任何的数都为0,由于OpenCV对超过255会变为255(乘法很容易超过255),在OpenCV相乘的结果中白色和黑色的区域会相对多一些。此时看结果的Linux图周边会有锯齿的效果,这是因为Linux图中的Linux文字周围是有平滑模糊的,这些在Linux文字周边的值并不为0,因此并不为白色,所以就会产生这种锯齿的效果。
05
像素运算~除法
除法操作和上面类似,这里不再赘述。
执行结果:
由于相除让结果变的都比较小,所以实际使用中使用的很少。
本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!