#|python opencv 图像像素处理基础


文章目录

  • 明确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)
#|python opencv 图像像素处理基础
文章图片

所以,我补充一下,我们返回的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)

打印的结果:第二行数据,说明该位置的像素颜色数据得到的修改
#|python opencv 图像像素处理基础
文章图片

读取和修改像素的展示 #|python opencv 图像像素处理基础
文章图片

实现代码
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息息相关!
#|python opencv 图像像素处理基础
文章图片

#|python opencv 图像像素处理基础
文章图片

对于单个像素的修改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值

打印结果:发现确实更改了指定位置的指定通道的值
#|python opencv 图像像素处理基础
文章图片

访问图像信息——访问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是否含有通道数——无的话,就是灰度图像了。
#|python opencv 图像像素处理基础
文章图片

总结 我们imread方法返回的数据是一个numpy的array数组,是多维度的——介于这个特性,我们可以对图像进行很多科学计算——以上的像素处理仅仅是基础应用,或者说熟悉如何去处理像素信息,像素是什么的认识。在后边,慢慢接触,可能会有更多的类似图像复制,拼接图像,检测特征等。
【#|python opencv 图像像素处理基础】总之,numpy的方法,对opencv都是适用的——
比如采用numpy.zeros()方法创建指定大小的黑色图片:img = np.zeros((512, 512, 3), np.uint8)
从这里,也可以看出,图像的基本数据类型是uint8,和彩色图片的数组形状——也就是行列,以及彩色图片必含的3个通道数(BGR)
这些都会在后边慢慢涉及,我也会尽可能分享自己的理解和学习方法。

    推荐阅读