小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

作者:神秘网友 发布时间:2020-09-14 01:02:47

小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

    • 引入
    • 加法
    • 减法
    • 例子
    • 参考

引入

问题引入,考虑以下几个问题:
Q1. 一个3通道像素p的BGR分量(8bit表示)值均相同,那么这个像素是什么颜色的?
Q2. 该像素p加上自己,即,像素p的各个通道值翻倍,那么这个像素的颜色会变成什么样?

加法

假设p的BGR值均为100,即p(100, 100, 100)。那么,我们生成一幅100*100大小的3通道图像,其中每个像素均与p相同。

# 导入库
import numpy as np
import cv2

# 构造图像,shape为(100, 100, 3) ,每个像素值均为(100, 100, 100)
gray = np.ones((100, 100, 3), dtype=np.uint8) * 100

# 显示图像
cv2.imshow("Gray", gray)

cv2.waitKey(0)

执行脚本
小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算
没错,是一幅灰度图像。
我们可以继续尝试,加入如下代码。

# 构造一幅(50, 256, 3) 灰度条
# 灰度条第一列像素
bar = np.ones((50,1,3), dtype=np.uint8) * 0

# 迭代生成其它列
for i in np.arange(1, 256 ):
    col = np.ones((50, 1, 3), dtype=np.uint8) * i
    # 数组连接,沿轴1方向(沿高度方向?)
    bar = np.concatenate((bar, col), axis = 1)

cv2.imshow("Bar", bar)

执行脚本。
小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算
这和我们的单通道灰度图像是一致的。
也就是说,A1. 三通道图像的每个通道值(强度)相同时,合成的是灰度图像。

那么,如果将上面的图像gray的每个像素值加上(100, 100, 100)会怎样呢?

# 构造图像,shape为(100, 100, 3) ,每个像素值均为(100, 100, 100)
M = np.ones((100, 100, 3), dtype=np.uint8) * 100

# 第一次,对每个像素加上(100, 100, 100)
gray = gray + M

# 显示图像
cv2.imshow("Gray1", gray)

# 第二次,对每个像素加上(100, 100, 100)
gray = gray + M

# 显示图像
cv2.imshow("Gray2", gray)

cv2.waitKey(0)

执行脚本。
小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算
Gray1在Gray的基础上强度增强了,这是可以理解的,因为,每个像素的强度都增加了(100,100,100)。
那么,为什么Gray2怎么会比其它两幅都要暗(强度低)呢?

这是因为:A2. numpy在做加法运算时,会根据dtype对数据进行“取模”运算。也就是说会产生数据的翻转现象。

而OpenCV在做加法时,会根据数据类型的范围进行限制。比如这里的图像通道数据类型是uint8类型的。那么OpenCV限制通道值最大为255,最小为0.而不会像numpy产生200+100=44的现象。

减法

numpy同加法。OpenCV限制通道值下限为0.

例子

# 导入库
import numpy as np
import argparse
import cv2

# 构造参数解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# 加载图像并显示
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# 构造与原图形状相同,各通道值为100的图像
M = np.ones(image.shape, dtype = "uint8") * 100

# 与原图像相加并显示
added = cv2.add(image, M)
cv2.imshow("Added", added)

# 构造与原图形状相同,各通道值为50的图像
M = np.ones(image.shape, dtype = "uint8") * 50

# 在原图基础上减去该图像,并显示
subtracted = cv2.subtract(image, M)
cv2.imshow("Subtracted", subtracted)
cv2.waitKey(0)

执行脚本
小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算
小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

参考

矩阵加减法

小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算相关教程

  1. python+opencv-14 图像金字塔
  2. 小强学Python+OpenCV之-1.1图像加载、显示、保存
  3. 用树莓派3B+和Python+OpenCV实现实时的人脸检测
  4. 小强学Python+OpenCV之-1.4.1平移旋转缩放翻转-之理论
  5. 《小强升职记》 读书笔记 含思维导图
  6. 小强学Python+OpenCV之-1.4.2裁剪
  7. Python+Opencv框出图像二维码
  8. 题目 1115: DNA