Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间
前文传送门:
「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」
「Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理」
图像加法
图像加法有两种方式,一种是通过 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」进行获取。
参考
https://blog.csdn.net/Eastmount/article/details/82347501
http://woshicver.com/
- Python 图像处理 OpenCV (9):图像处理形态学开运算、闭运算以及梯度运算
- 【opencv+python】图像处理之一、颜色空间RGB,Gray与HSV
- Python之OpenCV学习Day01--图像(加载、展示、写入)、像素运算(算数运算、逻辑运算)、常见色彩空间模式
- 利用cvtColor完成颜色空间转化得到灰度图,利用threshold完成阈值化处理得到黑白图像,学习OpenCV
- Python-OpenCV 处理图像(二)(三):滤镜和图像运算 图像像素点操作
- opencv-python 读取图像并转换颜色空间实例
- Python3与OpenCV3.3 图像处理(四)--色彩空间
- Python 图像处理 OpenCV (10):图像处理形态学之顶帽运算与黑帽运算
- python for OpenCV图像处理之模板匹配以及分水岭算法
- Python3与OpenCV图像处理(三)——色彩空间
- 【图像处理】Ubuntu安装OpenCV 3.0以及Python接口
- python+opencv图像处理(提取矩形方框 提取颜色 滤波 轮廓检测 直线检测)
- Python-OpenCV 处理图像(二):滤镜和图像运算
- 【图像处理】Ubuntu安装OpenCV 3.0以及Python接口
- openCV—Python(7)—— 彩色图像R、G、B分量的提取与合并及其相关颜色空间的转化
- Python OpenCV处理图像之滤镜和图像运算
- opencv-python 读取图像并转换颜色空间
- 数字图像处理-空间域增强(三)(图像的算数与逻辑运算)
- 【OpenCV】颜色空间(RGB,HSV与Gray)及图像处理中的颜色识别
- Python-OpenCV 处理图像(二):滤镜和图像运算