前几篇内容我们学习了使用OpenCV打开显示、保存图像的方法使用Python OpenCV处理图像之图像文件的打开、显示和保存操作,我们还使用OpenCV更改了微信头像一个Pythoner获取微信国旗头像的正确途径,请不要再@微信官方了。在此基础上了解了OpenCV处理鼠标键盘响应事件的基本方式使用Python OpenCV处理图像之详解使用OpenCV处理键盘鼠标事件。
今天,我们带大家了解下使用OpenCV获取并修改一幅图像的像素值。
准备好了吗?精彩内容马上开始 打开一幅图像并获取图像信息
import cv2
import numpy as np
img = cv2.imread('test.jpg')
我们可以获取该图像的属性:行,列,通道,图像数据类型,像素数目等,具体如下。
img.shape:获取图像的形状,返回值是一个包含行数,列数,通道数的元组
img.size:图像的像素数目,长乘以宽乘以通道数。
img.dtype:图像的数据类型
实例如下。
获取图像的属性信息 一幅图像如何表示具体像素值?
图像表示一幅图像的像素点 我们来看下图,它表示了具体图像的像素值描述方法,以BGR图像为例。图下所示。
图像的像素值数据结构表示 问题来了,对于一幅BGR图像,如何表示某一点的像素值呢?
比如:img[xp, yp] = [B, G. R],应该是这种形式了,想要更改该像素值,直接给该坐标上面赋值BGR通道的值即可,当然,也可以分开赋值。如下:
img[xp, yp, 0] = B
img[xp, yp, 1] = G
img[xp, yp, 2] = R
分别赋予BGR通道的值即可。灰度图片使用类似,不再赘述,只是图像属性参数不一样。怎么样?是不是很简单?
有没有更好的解决方案?
我们知道,今天来讲,一幅图片的像素值是很高的,动辄几百万的像素值,通常我们需要修改某一范围内的像素值,但是,获取这一范围的像素值我们使用Python中的列表这一数据结构,并使用for循环语句查找某一像素范围内的数据是非常低效的。因此,OpenCV提供的一幅图像的表示方法是以类似numpy中数组的结构。这种数据结构的优点是高效、精准。
有没有更好的解决方案呢? 对于OpenCV的图像数据结构,我们通常使用 array.item() 来获取某一范围的像素内容并使用array.itemset()设置该像素的信息,比较列表嵌套并使用for循环遍历,是非常高效的。而且,程序的可读性会更好。我们来看下面的例子。
import cv2import numpy as np
img=cv2.imread('test.jpg')
# 打印像素点(10,10)的R通道值
print(img.item(10,10,2))
# 设置像素点(10,10)的R通道为110
img.itemset((10,10,2),110)
# 打印像素点(10,10)的R通道值
print(img.item(10,10,2))
上述代码可以准确获取某一像素点的颜色数据。
好了,今天的内容就到这里了,我们主要是学习了利用OpenCV获取和设置一幅图像的某一个像素点的颜色数据,甚至可以区分通道来设置。我们知道某一像素点的设置对于动辄几百万甚至上亿(小米MIX Alpha,据说能拍出这种图片)像素的图片的设置来讲,是毫无意义的。因此,在使用中我们需要的是能够设置某一区域的像素点。我们下一篇内容具体来讨论。欢迎大家留言讨论。
转载请注明出处,百家号:Python高手养成。