文章目录

  • 明确opencv的彩色图片读取返回的数据主要包含什么(是一个numpy数组)
  • 如何访问像素
  • 修改像素信息(包含图像数据类型的查看——.dtype)
  • 读取和修改像素的展示
  • 实现代码
  • 关于图片读取后的像素信息读取的其他方法
  • 对于单个像素的访问——item
  • 对于单个像素的修改itemset
  • 访问图像信息——访问img的数组信息(shape)
  • 总结

明确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各点像素值 python像素处理_计算机视觉


所以,我补充一下,我们返回的img实际上是具有数据类型属性的——并且图片的像素信息,一般为uint8——这也是,为什么我们创建黑色背景图片时采用numpy的array产生一个指定形状(shape)的数据类型为numpy.uint8的多维数组的原因!!!

修改像素信息(包含图像数据类型的查看——.dtype)

我们既然可以得到,同样的也可以通过对行列索引的img实现赋值来修改像素颜色信息等~

import cv2 as cv
import numpy as np

img = 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各点像素值 python像素处理_numpy_02

读取和修改像素的展示

Python各点像素值 python像素处理_计算机视觉_03

实现代码

import cv2 as cv
import numpy as np


if __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 np

img = 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各点像素值 python像素处理_numpy_04


Python各点像素值 python像素处理_opencv_05

对于单个像素的修改itemset

array.itemset()实现对某个像素的某一个通道值进行设置——同样的,完整修改一个像素点全部信息,需要三次不同的通道调用!!!
array.itemset()参数:

  • 参数形式为——位置通道元组+修改值: 如((200, 120, 0), 100)

代码展示一下:

import cv2 as cv
import numpy as np

img = cv.imread('./imag_in_save/open_class.png')
print("原始[200, 120]位置的B值: "+str(img.item(200, 120, 0)))  # 打印原始[200, 120]位置的B值

set_value = 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各点像素值 python像素处理_python_06

访问图像信息——访问img的数组信息(shape)

直接上代码:

import cv2 as cv
import numpy as np


if __name__ == "__main__":
    img = cv.imread('./imag_in_save/open_class.png')
    print(img.shape)

打印结果:(返回的是该array数组的形状——表示行列和通道数——这是对于彩色图片的)

针对这个特性——可以推出,灰度图片判别的方式之一是,shape是否含有通道数——无的话,就是灰度图像了。

Python各点像素值 python像素处理_opencv_07

总结

我们imread方法返回的数据是一个numpy的array数组,是多维度的——介于这个特性,我们可以对图像进行很多科学计算——以上的像素处理仅仅是基础应用,或者说熟悉如何去处理像素信息,像素是什么的认识。在后边,慢慢接触,可能会有更多的类似图像复制,拼接图像,检测特征等。

总之,numpy的方法,对opencv都是适用的——
比如采用numpy.zeros()方法创建指定大小的黑色图片:img = np.zeros((512, 512, 3), np.uint8)
从这里,也可以看出,图像的基本数据类型是uint8,和彩色图片的数组形状——也就是行列,以及彩色图片必含的3个通道数(BGR)