内容简介:小强学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)
执行脚本
没错,是一幅灰度图像。我们可以继续尝试,加入如下代码。
# 构造一幅(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)
执行脚本。
这和我们的单通道灰度图像是一致的。也就是说, 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)
执行脚本。
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)
执行脚本
Added.png
Subtracted.png
参考
矩阵加减法
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Spark 中如何使用矩阵运算间接实现 i2i
- 机器学习 | SVD矩阵分解算法,对矩阵做拆分,然后呢?
- golang 算法-矩阵
- 彻底理解矩阵乘法
- [开源项目]矩阵数据的意义
- iphone – :CGAffineTransformInvert:奇异矩阵
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
豆瓣,流行的秘密
黄修源 / 机械工业出版社 / 2009-9 / 29.00
380万人为何会齐聚豆瓣? HIN1和SARS是如何传播扩散开的? 贾君鹏何以快速窜红网络? 通过创新扩散的理论的分析和说明,给出了所有这些问题的答案! 这本书从豆瓣的流行现象说开来,应用了创新扩散等传播学道理来解释了豆瓣如何流行起来,同时作者还同时用创新扩散的理论解释了为何会出现世界变平的现象,长尾理论,SARS病毒的高速传播等。 作者以前任豆瓣设计师的身份以自己亲......一起来看看 《豆瓣,流行的秘密》 这本书的介绍吧!