写点什么

Python OpenCV 之像素的加减法,取经之旅第 15 天

发布于: 2021 年 03 月 31 日
Python OpenCV 之像素的加减法,取经之旅第 15 天

今天的学习的内容是:通过 Python OpenCV 对图片的像素进行加减乘除操作。


OpenCV 加法操作


在 opencv 中,使用 cv2.add() 将两个图像相加,核心操作是 numpy 中的矩阵加法。


在 opencv 中加法是饱和操作,也就是有上限值。


相加的两个图片,需要有相同的大小和通道


语法格式如下:


cv2.add(src1, src2, dst=None, mask=None, dtype=None)
复制代码


参数说明:


  • src1:图片对象 1;

  • src2:图片对象 2;

  • dst:可选参数,输出结果保存的变量,默认为 None,如果为其它值,那该 dst 为结合之后的图像,大小和通道数与 src 一致;

  • mask:可选参数,默认为 None (图像掩膜,一般用灰度图做掩膜,src1src2 相加后和掩膜与运算,从而达到掩盖部分区域的目的);

  • dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数。


返回值:相加之后的图像。


其中 src1src2 需要大小和通道数相等或者一副图像和一个标量(标量就是单个数字)


代码示例如下:


import cv2 as cv
def img_add(src1, src2): res = cv.add(src1, src2) cv.imshow("add", res)
if __name__ == "__main__": src1 = cv.imread("./src1.jpg") src2 = cv.imread("./src2.jpg") img_add(src1=src1, src2=src2) cv.waitKey(0)
复制代码


注意选择图片的时候,两个图片的尺寸一定要一致,并尽量选择一个黑色多的,一个白色多的。


为什么,因为像素点值越大,颜色越亮,0 代表黑色,255 代表白色


上文中还提及了 add 函数相加之后的上限值,含义如下:


cv2.add(x,y) # 250+10 = 260 => 255 相加,opencv 超过 255 的截取为 255
复制代码


掩膜是啥?


查看这部分资料的时候,发现掩膜相关的内容还真不少,可以单独写一篇文章了。


本着每天只学习 1 小时原则,今天只学习一些简单的,难的后面在来。


Mask(掩膜),很多函数都使用到它,本阶段咱们理解成在图片中裁剪部分即可。


寻找一张图片,只展示中间头像。



具体代码如下,重点内容已经进行标记。


import cv2 as cvimport numpy as np

def mask_demo(src1, src2): # cv.imshow("mask_demo", src) # 1. 建立与原图一样大小的 mask 图像,并将所有像素初始化为 0,因此全图成了一张全黑色图。 # 2. 将 mask 图中的目标区域的所有像素值设置为255,此时目标区域变成了白色。 mask = np.zeros([375, 600], dtype=np.uint8) # cv.imshow("mask",mask) # mask[高度截取,宽度截取] mask[100:300, 200:400] = 255 cv.imshow("mask", mask) img_add_mask = cv.add(src1, src2, mask=mask) cv.imshow("img_add_mask",img_add_mask)
if __name__ == "__main__": src1 = cv.imread("./yuanshen.jpeg") src2 = cv.imread("./mask.png") mask_demo(src1, src2) cv.waitKey(0)
复制代码


代码运行完毕,效果如图。当然,第二副图片,我自己制作了一个黑色的圆圈,如下图所示。


两张图片相加,并且添加 Mask(掩膜)之后的效果,如下图所示。

对比运行结果就可以发现掩膜的基本使用方法,先声明一个 8 位单通道的灰度图像,一般使用 np.zeros 即可生成。


让后将想要展示的目标区域设置为纯白色,即 255。


图片相加之后,就可对最终的结果进行区域截图展示了。


在网上还找到一句话解释掩膜:两幅图像之间进行的各种位运算操作。


例如:1 & 1 = 1;1 & 0 = 0;


OpenCV 减法操作


在 Python OpenCV 中同样提供了两张图像的减法操作。


函数是 subtract ,原型如下:


cv2.subtract(src1, src2, dst=None, mask=None, dtype=None)
复制代码


参数说明:


  • src1:图像矩阵 1

  • src1:图像矩阵 2

  • dst:可选参数

  • mask:可选参数

  • dtype:可选参数


返回值:

相减的结果图像


该函数的用法与图像像素的加法函数基本一致,具体代码如下:


import cv2 as cvimport numpy as np
# cv2.subtract(src1, src2, dst=None, mask=None, dtype=None)def subtract_demo(src1, src2): ret = cv.subtract(src2, src1) cv.imshow("subtract_demo", ret)
if __name__ == "__main__": src1 = cv.imread("1.jpg") src2 = cv.imread("3.jpg") subtract_demo(src1, src2) cv.waitKey(0)
复制代码


注意两张图片的大小(尺寸)和通道数要一致。


为了检测效果,我重新自己绘制了两个图片。


有颜色的图:


没有颜色的图如下所示。

运行之后的效果,只显示黑色圆圈部分。


图像相减代码如下所示,注意在使用 cv.subtract 函数时候,两张图片的先后顺序问题。


import cv2 as cvimport numpy as np
# cv2.subtract(src1, src2, dst=None, mask=None, dtype=None)def subtract_demo(src1, src2): # 表示用 src1 中的像素减去 src2 中的像素 ret = cv.subtract(src1, src2) cv.imshow("subtract_demo", ret)
if __name__ == "__main__": src1 = cv.imread("1.jpg") # 由于第二个图是黑白图片 # 任意像素颜色减去白色(255) == 0 # 任意像素颜色减去黑色(0) == 原值 src2 = cv.imread("white_black.jpg") subtract_demo(src1, src2) cv.waitKey(0)
复制代码


OpenCV 尾声


1 个小时又过去了,对 Python OpenCV 相关的知识点,你掌握了吗?


空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。




今天是持续写作的第 <font color="red">52</font> / 100 天。

如果你有想要交流的想法、技术,欢迎在评论区留言。




如果你想跟博主建立亲密关系,可以关注同名公众号 <font color="red">梦想橡皮擦</font>,近距离接触一个逗趣的互联网高级网虫。

博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。


**想学 Python 爬虫,可以订阅橡皮擦专栏哦~** 🈲🈲🈲🈲 点击发现惊喜 🈲🈲🈲🈲


发布于: 2021 年 03 月 31 日阅读数: 7
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
Python OpenCV 之像素的加减法,取经之旅第 15 天