前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV-像素运算~算术运算

OpenCV-像素运算~算术运算

作者头像
触摸壹缕阳光
发布2019-11-13 19:47:05
1.6K0
发布2019-11-13 19:47:05
举报
文章被收录于专栏:AI机器学习与深度学习算法

将图片看成类型为uint8的像素矩阵,因此我们可以将两个像素矩阵进行加减乘除等一些列运算,这也被称为像素运算,像素运算包括两种:

  1. 算术运算,比如加减乘除运算。可以调节图像的亮度以及对比度;
  2. 逻辑运算,比如与或非。可以通过逻辑运算完成遮罩层的控制。

本小节主要介绍像素运算中的算术运算。

01

算术运算

算术运算至少需要两张图片,由于将图片看成了拥有三个通道的像素矩阵(还有单通道),因此两张图片的算术运算,很显然的推广到矩阵之间的运算。学过线性代数的应该知道,矩阵之间能够进行加法和减法运算的前提条件是两个矩阵必须形状一样,因此在对两张图片进行算术运算的时候,必须长宽一致才可以。还有一点需要注意,此时的加减很好理解,但是此时的乘除并不是矩阵之间的乘法或者除法(乘以逆矩阵),而是像素矩阵中对应元素之间的乘除,即逐位运算。

为了演示更好的效果,这里使用下面两张图片,文件名分别命名为"01.jpg"以及"02.jpg"。

02

像素运算~加法

处理图像的相加操作,实质上就是图像的像素矩阵相加。我们分别使用OpenCV提供的add函数以及直接使用图像的像素ndarray数组进行相加操作。

执行结果:

可以看出执行的结果并不是我们想的那样,两种方式得到的结果并不一致。下面通过一个简单的例子:

打印出相加后像素矩阵的结果:

代码语言:javascript
复制
[[ 40 255 255]
 [245 240 255]
 [255 255 255]]
********************
[[ 40  19   0]
 [245 240  19]
 [101 209 186]]

从上面的结果可以看出,其实执行结果不同,只是因为两种相加方式对于uint8类型数据超过255的不同处理而已,

  1. OpenCV中的add函数,当相加后的结果超过255(大于255),则将其超过的像素点设置为255;
  2. ndarray数组直接相加,相加后如果超过了255(大于255),则会用这个超过255的数值对256进行%执行取模运算,比如对于左下角的运算(102 + 255)% 256 = 101。

我们通常用到的就是OpenCV这种处理方式,对于原始的两张图来说,Linux图中大部分都是黑色,也就是为像素值为0的部分,因此加上windows图中的有颜色部分,相加得到的就是windows图像的颜色,而Linux图中的白色部分,本身已经是255了,在加上windows中非0的颜色像素,更会超过255,由于OpenCV中将其设置为255,因此还是白色。

03

像素运算~加法

像素的减法操作和前面的加法操作类似。

执行结果:

当然如果使用ndarray数组直接进行相减操作也是可以的,但是和相加一样,两种方式对负数的处理不同:

  1. OpenCV中当进行减法运算的时候遇到小于0的数,将其设置为0;
  2. ndarray数组中遇到小于0的数时候,比如(10 - 30) = -20的时候,用256 + (-20) = 236,感兴趣的可以,将加法操作中的对比换成减法操作。

Linux中黑色部分像素值为0,0减去windows中彩色部分变为负数,OpenCV中将其变为0,因此大部分都是黑色,但是在Linux中白色部分,像素值为255,而对应的windows部分值为0 - 255之间,因此相减会变成一个正的整数,因此可以看出做减法操作的时候,Linux图片文字的部分很炫,五颜六色。

04

像素运算~乘法

有了减法和加法的积累,乘法操作也是很简单的,这里只需要注意:

  1. 使用OpenCV进行像素运算:
    1. 超过255的像素点,设置为255;
    2. 小于0的像素点,设置为0;
  2. 使用ndarray数组进行像素运算:
    1. 超过255的像素点,将其对256做取余操作;
    2. 小于0的像素点,将其与256相加;

执行结果:

可以看出结果还是挺炫的,相乘操作,如果非零相乘的话会让结果变大,当然0乘上任何的数都为0,由于OpenCV对超过255会变为255(乘法很容易超过255),在OpenCV相乘的结果中白色和黑色的区域会相对多一些。此时看结果的Linux图周边会有锯齿的效果,这是因为Linux图中的Linux文字周围是有平滑模糊的,这些在Linux文字周边的值并不为0,因此并不为白色,所以就会产生这种锯齿的效果。

05

像素运算~除法

除法操作和上面类似,这里不再赘述。

执行结果:

由于相除让结果变的都比较小,所以实际使用中使用的很少。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档