前文传送门:
「Python 图像处理 OpenCV (1): 入门」 https://www.geekdigging.com/2020/05/17/5513454552/
「Python 图像处理 OpenCV (2): 像素处理与 Numpy 操作以及 Matplotlib 显示图像」 https://www.geekdigging.com/2020/05/18/4936041986/
「Python 图像处理 OpenCV (3): 图像属性, 图像感兴趣 ROI 区域及通道处理」 https://www.geekdigging.com/2020/05/19/1227329671/
图像加法
图像加法有两种方式, 一种是通过 Numpy 直接对两个图像进行相加, 另一种是通过 OpenCV 的 add() 函数进行相加.
不管使用哪种方法, 相加的两个图像必须具有相同的深度和类型, 简单理解就是图像的大小和类型必须一致.
Numpy 加法
Numpy 的运算方法是: img = img1 + img2 , 然后再对最终的运算结果取模.
当最终的像素值 <= 255 时, 则运算结果直接为 img1 + img2 .
当最终的像素值 > 255 时, 则运算的结果需对 255 进行取模运算.
OpenCV 加法
OpenCV 的运算方式是直接调用 add() 函数进行的, 这时的运算方式是饱和运算.
当最终的像素值 <= 255 时, 则运算结果直接为 img1 + img2 .
当最终的像素值 > 255 时, 这时则是饱和运算, 结果固定为 255 .
两种加法方式对应的示例如下:
- import cv2 as cv
- # 读取图像
- img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
- test = img
- # Numpy 加法
- result1 = img + test
- # OpenCV 加法
- result2 = cv.add(img, test)
- # 显示图像
- cv.imshow("img", img)
- cv.imshow("result1", result1)
- cv.imshow("result2", result2)
- # 等待显示
- cv.waitKey()
- cv.destroyAllWindows()
结果如下:
可以看到, 使用 Numpy 取模加法的图片整体更偏绿色, 而使用 OpenCV 饱和运算的加法, 整体颜色更偏白色.
图像融合
图像融合其实也是一种图像加法, 但是它和图像加法不同的是对图像赋予不同的权重, 可以使图像具有融合或者透明的感觉.
图像加法: img = img1 + img2
图像融合: img = img1 * alpha + img2 * beta + gamma
图像融合用到的函数为 addWeighted() 具体如下:
- dst = cv.addWeighter(img1, alpha, img2, beta, gamma)
- dst = img1 * alpha + img2 * beta + gamma
这里的 alpha 和 beta 都是系数, 而 gamma 则是一个亮度调节量, 不可省略.
下面这个示例中, 我又找了一张下雨的图片, 用这张图片和马里奥做一个图像融合的案例:
- import cv2 as cv
- # 读取图像
- img1 = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
- img2 = cv.imread("rain.jpg", cv.IMREAD_UNCHANGED)
- # 图像融合
- img = cv.addWeighted(img1, 0.4, img2, 0.6, 10)
- # 显示图像
- cv.imshow("img1", img1)
- cv.imshow("img2", img2)
- cv.imshow("img", img)
- # 等待显示
- cv.waitKey()
- cv.destroyAllWindows()
结果如下:
图像融合时需要注意的和上面一致, 需要图像大小是相等的, 上面的示例这两张图片都是像素为 560 * 310 且都为 RGB 的图片.
改变颜色空间
OpenCV 中有超过 150 种颜色空间转换方法. 我们先介绍两种最常用的: BGR <-> 灰度 和 BGR <-> HSV .
对于改变颜色空间, 我们使用 cvtColor(input_image, flag) 函数, 其中的 flag 为转换的类型.
一些常见的 flag 值:
- # BGR 转 灰度
- cv.COLOR_BGR2GRAY
- # BGR 转 HSV
- cv.COLOR_BGR2HSV
- # BGR 转 RGB
- cv.COLOR_BGR2RGB
- # 灰度 转 BGR
- cv.COLOR_GRAY2BGR
可以很清楚的看到, flag 的命名非常的通俗易懂, 如果想要获取其他所有的标记, 可以使用下面这段代码:
- import cv2 as cv
- flags = [i for i in dir(cv) if i.startswith('COLOR_')]
- print(flags)
结果就不贴了, 挺长的.
注意: HSV 的色相范围为 [0,179] , 饱和度范围为 [0,255] , 值范围为 [0,255] . 不同的软件使用不同的范围. 因此, 如果需要将 OpenCV 值和它们比较, 则需要将这些范围标准化.
我们使用 cvtColor() 这个函数将马里奥转化成灰度图像, 示例如下:
- import cv2 as cv
- # 读取图像
- img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
- # 图像类型转换
- result = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
- # 图像展示
- cv.imshow("img", img)
- cv.imshow("result", result)
- # 等待显示
- cv.waitKey()
- cv.destroyAllWindows()
结果如下:
示例代码
如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取.
参考
http://woshicver.com/
来源: https://www.cnblogs.com/babycomeon/p/12941054.html