前文传送门:

「Python 图像处理 OpenCV (1):入门」

「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」

「Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理」

图像加法

图像加法有两种方式,一种是通过 Numpy 直接对两个图像进行相加,另一种是通过 OpenCV 的 add() 函数进行相加。

不管使用哪种方法,相加的两个图像必须具有相同的深度和类型,简单理解就是图像的大小和类型必须一致。

Numpy 加法

Numpy 的运算方法是: img = img1 + img2 ,然后再对最终的运算结果取模。

  1. 当最终的像素值 <= 255 时,则运算结果直接为 img1 + img2
  2. 当最终的像素值 > 255 时,则运算的结果需对 255 进行取模运算。

OpenCV 加法

OpenCV 的运算方式是直接调用 add() 函数进行的,这时的运算方式是饱和运算。

  1. 当最终的像素值 <= 255 时,则运算结果直接为 img1 + img2
  2. 当最终的像素值 > 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

这里的 alphabeta 都是系数,而 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 (4):图像算数运算以及修改颜色空间的更多相关文章

  1. Python 图像处理 OpenCV (5):图像的几何变换

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  2. Python 图像处理 OpenCV (6):图像的阈值处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  3. Python 图像处理 OpenCV (9):图像处理形态学开运算、闭运算以及梯度运算

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  4. Python 图像处理 OpenCV (10):图像处理形态学之顶帽运算与黑帽运算

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  5. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  6. Python 图像处理 OpenCV (15):图像轮廓

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. Python 图像处理 OpenCV (16):图像直方图

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  8. Python 图像处理 OpenCV (7):图像平滑(滤波)处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

随机推荐

  1. Linux hostname主机名查看和设置

    查询主机名: uname -n hostname [root@oldboy ~]# uname -n oldboy [root@oldboy ~]# hostname oldboy Linux操作系统 ...

  2. 【Linux常见命令】wc命令

    wc - print newline, word, and byte counts for each file wc命令用于计算字数. 利用wc指令我们可以计算文件的Byte数.字数.或是列数,若不指 ...

  3. 地表最简单安装MySQL及配置的方法,没有之一

    第一步下载我的压缩包 链接:https://pan.baidu.com/s/1EE40dU0j2U1d-bAfj7TeVA 提取码:n25c 复制这段内容后打开百度网盘手机App,操作更方便哦 第二步 ...

  4. 数学--数论--Miller_Rabin判断一个大数是不是素数(随机算法)

    前提知识 1,费马定理:ap−1=1(mod p)a^{p-1}=1(mod\ p)ap−1=1(mod p)

  5. IO与反射机制总结

    IO与反射机制全面总结 一.file类:属于java.io包中kkb 作用:操作文件或目录 file既可以表示文件,也可以表示目录,也可以表示盘符.利用他可以用来对文件进行操作. file中常用的构造 ...

  6. Redis 6.0 新特性-多线程连环13问!

    Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...

  7. libevent(三)event_base

    libevent能够处理三种事件: I/O.定时器.信号. event_base 统一管理所有事件. struct event_base { const struct eventop *evsel; ...

  8. 使用python实现模拟掷骰子数据分析

    Data:2020/4/8 主题:模拟实现掷骰子数据分析 编译环境:pycharm 库:pygal 说明: code 1:创建一个掷骰子类对象,类方法获得掷骰子随机数1-6,默认6个面,模拟20次将结 ...

  9. flink系列-10、flink保证数据的一致性

    本文摘自书籍<Flink基础教程> 一.一致性的三种级别 当在分布式系统中引入状态时,自然也引入了一致性问题.一致性实际上是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结果 ...

  10. LRU 的C# 实现

    首先 先写点儿感悟吧: 本来计划是 晚上回家写的  后来发现还是没坚持的了  上午花了一个多小时  做了一下这个题目  应该还有提高的空间 的,这个题目是在力扣里面看到的  为什么看到这个题目 是因为 ...