python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值...

前几篇内容我们学习了使用OpenCV打开显示、保存图像的方法使用Python OpenCV处理图像之图像文件的打开、显示和保存操作,我们还使用OpenCV更改了微信头像一个Pythoner获取微信国旗头像的正确途径,请不要再@微信官方了。在此基础上了解了OpenCV处理鼠标键盘响应事件的基本方式使用Python OpenCV处理图像之详解使用OpenCV处理键盘鼠标事件。

今天,我们带大家了解下使用OpenCV获取并修改一幅图像的像素值。

python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值..._第1张图片准备好了吗?精彩内容马上开始

打开一幅图像并获取图像信息

import cv2

import numpy as np

img = cv2.imread('test.jpg')

我们可以获取该图像的属性:行,列,通道,图像数据类型,像素数目等,具体如下。

img.shape:获取图像的形状,返回值是一个包含行数,列数,通道数的元组

img.size:图像的像素数目,长乘以宽乘以通道数。

img.dtype:图像的数据类型

实例如下。

python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值..._第2张图片获取图像的属性信息

一幅图像如何表示具体像素值?

python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值..._第3张图片图像表示一幅图像的像素点

我们来看下图,它表示了具体图像的像素值描述方法,以BGR图像为例。图下所示。

python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值..._第4张图片图像的像素值数据结构表示

问题来了,对于一幅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中数组的结构。这种数据结构的优点是高效、精准。

python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值..._第5张图片有没有更好的解决方案呢?

对于OpenCV的图像数据结构,我们通常使用 array.item() 来获取某一范围的像素内容并使用array.itemset()设置该像素的信息,比较列表嵌套并使用for循环遍历,是非常高效的。而且,程序的可读性会更好。我们来看下面的例子。

importcv2importnumpy asnp

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高手养成。

你可能感兴趣的:(python导入opencv的语句_使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值...)