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

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

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

9358d109b3de9c82542366759949030f1bd843d0.jpeg?token=7f2f0bc7eb3c8af47882ceeb65607c05&s=C02315728B9570C8187801CD030030A0准备好了吗?精彩内容马上开始

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

import cv2

import numpy as np

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

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

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

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

img.dtype:图像的数据类型

实例如下。

30adcbef76094b368f0afa835804ffdc8c109d16.jpeg?token=f5549fb303ec011e029edce38f3b532a&s=46C0FD1A07484D491EF825D0000050B2获取图像的属性信息

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

d1160924ab18972b86e820331005f88c9c510a42.jpeg?token=e3472fa6abd3638fe4b2bf87cc9ef154&s=E000F51441D5DDEB0C6C785A0300D0B0图像表示一幅图像的像素点

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

c8ea15ce36d3d539bd26ef8fcd4f6a55342ab0b5.jpeg?token=c8a3b546151039b5b4d0adb907101bbf&s=A9831B7A13F6C46F0CAFA5ED0200703A图像的像素值数据结构表示

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

6a600c338744ebf8e8cfb1402f31542f6159a766.jpeg?token=89d5e122024da644933fb2b7d4ebcaf8&s=CA7189540BD07CD8DAF919CC0300F0B0有没有更好的解决方案呢?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值