图像数字化是指用数字表示图像。每一幅数字图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰度级别分别用区间[0,255]中的数值表示。其中,“0”表示纯黑色;“255”表示纯白色。

一、 像素

像素是构成数字图像的基本单位。当我们放大图像发现许多个小方块组成的,通常把一个小方块称作一个像素。因此,一个像素是具有一定面积的一个块,而不是一个点。需要注意的是,像素的形状是不固定的;大多数情况下,像素被认为是方形的,但有时也可能是圆形的或者是其他形状的。

1、确定像素的位置

图片是由许多像素组成,我们按照水平方向和垂直方向上进行建立向下的坐标系,通过坐标(x,y)的点位置确定像素的位置。

python opencv matchTemplate数字识别 opencv识别图片中的数字_图像识别


我们需要注意的一点是,坐标的起始位置都是从0开始,横轴的坐标范围为0~366也就是横轴的像素个数为367个,同理纵轴的像素范围0 ~ 199 那么像素个数为200个。

确定像素的位置:

import cv2

image = cv2.imread("./imgs/opencv.jpg")

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 获取坐标为(167,267)的像素
px = image[167,267]

这里需要注意一下,图像水平方向对应着像素的列数,而垂直方向对应着像素的行数,图像上我们确定像素位置坐标看作是(X,Y)而代码中输出的则是(Y,X)这个之间关系要区别。

2、获取像素的BGR值

我们先了解一下三基色的概念。人眼能够感知红色、绿色和蓝色这3种不同的颜色,因此把这3种颜色称作三基色。如果将这3种颜色以不同的比例进行混合,人眼就会感知到丰富多彩的颜色。
计算机利用色彩空间对颜色编码。也就是说色彩空间是计算机对颜色进行编码的模型。

以较为常用的RGB色彩空间为例,在RGB色彩空间中,存在3个通道,即R通道、G通道和B通道。其中,R通道指的是红色(Red)通道;G通道指的是绿色(Green〉通道;B通道指的是蓝色(Blue))通道;并且每个色彩通道都在区间[0,255]内进行取值。

通常使用一个三维数组来表示一幅图像中某一个像素的RGB值。

这里需要区分一下像素的BGR值与色彩空间RGB值的顺序是相反的。
RGB图像是指用RGB色彩空间显示的图像,BGR图像是指用BGR色彩空间显示的图像;RGB色彩空间和BGR色彩空间的区别是图像在RGB色彩空间中的通道顺序是R→G→B,在BGR的色彩空间中的通道顺序是B→G→R。

import cv2

image = cv2.imread("./imgs/opencv.jpg")

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 获取坐标为(167,267)的像素
px = image[167,267]

# 坐标(167,267)上的像素的BGR值是: [255 87 110]
print("坐标(167,267)上的像素的BGR值是:",px)

# 分别获取坐标(167,267)上像素的B通道、G通道和R通道的值。
blue = image[167,267,0]  #坐标(167,267)上的像素的B通道的值
green = image[167,267,1]  #坐标(167,267)上的像素的G通道的值
red = image[167,267,2]  #坐标(167,267)上的像素的R通道的值
print("(B,G,R):",(blue,green,red))  # (B,G,R): (255, 87, 110)

这里说明一点:我们先确定了像素的位置,每个像素其实是一个小方块。

python opencv matchTemplate数字识别 opencv识别图片中的数字_计算机视觉_02


我们可以这样理解,一张图片是由一系列的像素组成的二维矩阵,而每一个像素则对应着BGR色彩空间中的BGR通道值,是一个三维数组。其实也就是,二维矩阵的每个元素都是三维数组。

3、修改像素的BGR值

import cv2

image = cv2.imread("./imgs/opencv.jpg")
print(image)

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 获取坐标为(167,267)的像素
px = image[167,267]

# 坐标(167,267)上的像素的BGR值是: [255 87 110]
print("坐标(167,267)上的像素的BGR值是:",px)

image[167,267] = [255,255,255]
#把坐标(291,218)上的像素的值修改为[255,255,255]
print("坐标(167,267)上的像素修改后的BGR值是",px)

cv2.imwrite("./imgs/my_save.jpg",image)

python opencv matchTemplate数字识别 opencv识别图片中的数字_人工智能_03

4、修改指定区域内的所有像素

import cv2

image = cv2.imread("./imgs/opencv.jpg")
cv2.imshow("opencv.jpg", image)

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 显示opencv.jpg
for i in range(150, 200):
    # i表示横坐标:像素行数
    for j in range(300, 367):
        # j表示纵坐标:像素列数
        image[i, j] = [255, 255, 255]  # 把区域内的所有像素都修改为白色

cv2.imshow("opencv_demo.jpg", image)  # 显示图opencv_demo.jpg

cv2.waitKey()
cv2.destroyAllwindows()  # 关闭所有的窗口时,销毁所有窗口

python opencv matchTemplate数字识别 opencv识别图片中的数字_人工智能_04