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

栏目: 编程工具 · 发布时间: 7年前

内容简介:小强学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图像(矩阵)加减运算

Added.png

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

Subtracted.png

参考

矩阵加减法


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Little MLer

The Little MLer

Matthias Felleisen、Daniel P. Friedman、Duane Bibby、Robin Milner / The MIT Press / 1998-2-19 / USD 34.00

The book, written in the style of The Little Schemer, introduces instructors, students, and practicioners to type-directed functional programming. It covers basic types, quickly moves into datatypes, ......一起来看看 《The Little MLer》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试