文章目录
- 明确opencv的彩色图片读取返回的数据主要包含什么(是一个numpy数组)
- 如何访问像素
- 修改像素信息(包含图像数据类型的查看——.dtype)
- 读取和修改像素的展示
-
- 实现代码
- 关于图片读取后的像素信息读取的其他方法
-
- 对于单个像素的访问——item
- 对于单个像素的修改itemset
- 访问图像信息——访问img的数组信息(shape)
- 总结
-
-
-
- 这些都会在后边慢慢涉及,我也会尽可能分享自己的理解和学习方法。
-
-
QQ:3020889729小蔡
明确opencv的彩色图片读取返回的数据主要包含什么(是一个numpy数组)
import cv2
img = cv2.imread(r"./imag_in_save/open_class.png")# 读取彩色图片
在读取返回的img中主要是像素信息,包含BGR颜色数据,以及行列参数和当前通道数。
我们可以通过行列区访问某一像素的信息等操作。
除了彩色图片以外,我们有时读取灰度图像时候——除了行列参数外,返回的是相应的强度。
import cv2
img = cv2.imread(r"./imag_in_save/open_class.png", 0)# 读取灰度图片
如何访问像素 我们可以从读取返回的img中得到像素的颜色(BGR)信息
color_t = img[200, 120]
直接通过对img的行列搜索得到该点的像素颜色——这里是彩色照片
打印的结果:print(color_t, color_t.dtype)
文章图片
所以,我补充一下,我们返回的img实际上是具有数据类型属性的——并且图片的像素信息,一般为uint8——这也是,为什么我们创建黑色背景图片时采用numpy的array产生一个指定形状(shape)的数据类型为numpy.uint8的多维数组的原因!!!
修改像素信息(包含图像数据类型的查看——.dtype) 我们既然可以得到,同样的也可以通过对行列索引的img实现赋值来修改像素颜色信息等~
import cv2 as cv
import numpy as npimg = cv.imread('./imag_in_save/open_class.png')
color_t = img[200, 120]# 原始数据
print(color_t, color_t.dtype)
# 修改该位置像素信息
img[200, 120] = [255, 0, 255]# 它会在赋值时自动转为uint8
color_t = img[200, 120]
print(color_t, color_t.dtype)
打印的结果:第二行数据,说明该位置的像素颜色数据得到的修改
文章图片
读取和修改像素的展示
文章图片
实现代码
import cv2 as cv
import numpy as npif __name__ == "__main__":
img = cv.imread('./imag_in_save/open_class.png')# 修改成自己的图片就好
color_t = img[200, 120]# 图片修改后,位置可能需要调整下——因为如果刚好读取到颜色不明显的地方,显示就不形象了
b, g, r = color_t
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 500, 500)
cv.putText(img, f'{color_t}', (20, 40), cv.FONT_HERSHEY_COMPLEX_SMALL, 2, (int(b), int(g), int(r)), 2, cv.LINE_AA)# 在图像上绘字
img[200, 120] = [255, 0, 255]# 修改像素颜色——它会在赋值时自动转为uint8
color_t = img[200, 120]
b, g, r = color_t
cv.putText(img, f'{color_t}', (20, 140), cv.FONT_HERSHEY_COMPLEX_SMALL, 2, (int(b), int(g), int(r)), 2, cv.LINE_AA)cv.imshow('imag', img)
cv.waitKey(0)
cv.destroyAllWindows()
关于图片读取后的像素信息读取的其他方法 对于单个像素的访问——item array.item()——作为numpy数组的方法,在opencv中imread返回的img也是适用的——因为返回的就是一个numpy数组哦(再次加深影响)——不过呢,item方法返回的是某一个通道的值(所以要获取一个像素的全部颜色信息需要对BGR分别采用该方法3次)
item()参数:
- 参数形式——是既包含行列,又包含通道数的——(x, y, n):n对于彩色图片而言有:0->B色值,1->G色值,2->R色值!!!
import cv2 as cv
import numpy as npimg = cv.imread('./imag_in_save/open_class.png')
print(img.item(200, 120, 0))# [200, 120]位置的B值
print(img.item(200, 120, 1))# [200, 120]位置的G值
print(img.item(200, 120, 2))# [200, 120]位置的R值
打印结果:与之前相同位置的颜色信息比较,发现完全一致——所以这就告诉我们,opencv的使用,必然会与numpy息息相关!
文章图片
文章图片
对于单个像素的修改itemset array.itemset()实现对某个像素的某一个通道值进行设置——同样的,完整修改一个像素点全部信息,需要三次不同的通道调用!!!
array.itemset()参数:
- 参数形式为——位置通道元组+修改值: 如((200, 120, 0), 100)
import cv2 as cv
import numpy as npimg = cv.imread('./imag_in_save/open_class.png')
print("原始[200, 120]位置的B值: "+str(img.item(200, 120, 0)))# 打印原始[200, 120]位置的B值set_value = https://www.it610.com/article/100
print("设置的[200, 120]位置的B值: "+str(set_value))
img.itemset((200, 120, 0), 100)# 设置[200, 120]位置的B值为100
print("现在[200, 120]位置的B值: "+str(img.item(200, 120, 0)))# 打印现在[200, 120]位置的B值
打印结果:发现确实更改了指定位置的指定通道的值
文章图片
访问图像信息——访问img的数组信息(shape) 直接上代码:
import cv2 as cv
import numpy as npif __name__ == "__main__":
img = cv.imread('./imag_in_save/open_class.png')
print(img.shape)
打印结果:(返回的是该array数组的形状——表示行列和通道数——这是对于彩色图片的)
针对这个特性——可以推出,灰度图片判别的方式之一是,shape是否含有通道数——无的话,就是灰度图像了。
文章图片
总结 我们imread方法返回的数据是一个numpy的array数组,是多维度的——介于这个特性,我们可以对图像进行很多科学计算——以上的像素处理仅仅是基础应用,或者说熟悉如何去处理像素信息,像素是什么的认识。在后边,慢慢接触,可能会有更多的类似图像复制,拼接图像,检测特征等。
【#|python opencv 图像像素处理基础】总之,numpy的方法,对opencv都是适用的——
比如采用numpy.zeros()方法创建指定大小的黑色图片:img = np.zeros((512, 512, 3), np.uint8)
从这里,也可以看出,图像的基本数据类型是uint8,和彩色图片的数组形状——也就是行列,以及彩色图片必含的3个通道数(BGR)
这些都会在后边慢慢涉及,我也会尽可能分享自己的理解和学习方法。
推荐阅读
- 备战蓝桥杯|【蓝桥python冲刺31天】——如何轻松拿捏必考数论题((第一弹))
- 目标检测|基于ZYNQ的帧差法多运动目标检测(开源)
- 神经网络|【论文导读】浅谈胶囊网络与动态路由算法
- Python科学计算和数据分析|Seaborn系列(五)(回归(Regression)及矩阵(Matrix)绘图)
- 10行代码实现一个值班提醒应用
- 用Markdown写邮件,用Python发邮件
- ffmpeg|bilibili缓存视频批量转换成mp4格式,方便学习
- Python|每天弄个小爬取之Python爬取批量爬取B站小视频!
- python|python 神经网络工具_python神经网络工具箱