一、 分辨率
分辨率为 800×1200 的图像是一个包含800列和1200行的网格,每个网格就是称为一个像素,因此其中包含 800×1200=96 万像素。图像中有多少像素并不表示其物理尺寸(一个像素不等于一毫米)。像素的大小取决于为该图像设置的每英寸像素数 (Pixels Per Inch, PPI)。图像的 PPI 一般设置在 [200-400] 范围内。计算PPI的基本公式如下:
①PPI=宽度(像素) / 图像宽度(英寸)
②PPI=高度(像素) / 图像高度(英寸)
例如,一个4×6英寸图像,图像分辨率为 800×1200,则PPI是200。
二、灰度图
灰度就是没有色彩,RGB色彩分量全部相等。如果一个二值灰度图像,它的像素值只能为0或1,我们说它的灰度级为2。一个256级灰度图,RGB(100,100,100)就代表灰度为100,RGB(50,50,50)就代表灰度为50。灰度是指黑白图像中的颜色深度,范围一般0-255,白色为255,黑色为0,故黑白图片也称为灰度图像。
若是彩色图像的灰度其实是在转化为黑白图像后的像素值(是一种广义的提法),转化的方法看应用领域而定,一般按加权的方法转换,R,G,B的一般比例为3: 6:1。
三、图像描述
图像可以描述为2D函数f(x,y),其中(x,y)是空间坐标,而f(x,y)是图像在点(x,y)处的亮度或灰度或颜色值。彩色图像也可以用同样的方式表示,只是我们需要定义三个函数来分别表示红色、绿色、蓝色值。这三个单独的函数中的每一个都遵循与灰度图像定义的f(x,y)函数相同的公式。我们将这三个函数的子索引分别表示为、
和
。黑色图像也可以表示为相同的形式,其仅需要一个函数来表示图像,且f(x,y)只能取两个值。通常,0表示黑色,1表示白色。
四、OpenCV中的通道顺序
在 OpenCV 使用中,使用的颜色通道顺序为 BGR 颜色格式而不是 RGB 格式。此外,也有其他 Python 包使用的是 RGB 颜色格式(例如,Matplotlib 使用 RGB 颜色格式,Matplotlib 是最流行的 2D Python 绘图库,提供多种绘图方法)。因此,我们需要知道如何将图像从一种格式转换为另一种格式。
当我们掌握了将图像从一种格式转换为另一种格式的方法后,就可以选择使用 OpenCV 进行图像处理,同时利用 Matplotlib 包提供的函数来显示图像,接下来,让我们看看如何处理两个库采用的不同颜色格式。
import cv2
from matplotlib import pyplot as plt
img_OpenCV = cv2.imread('caise.png')
b, g, r = cv2.split(img_OpenCV)
img_matplotlib = cv2.merge([r, g, b])
plt.subplot(1, 2, 1)
plt.imshow(img_OpenCV)
plt.subplot(1, 2, 2)
plt.imshow(img_matplotlib)
plt.show()
此外,我们还可以通过NumPy将图像从 BGR 转换为 RGB。其中,第一个“:”表示对第一维的所有元素进行切片;第二个“:”表示对第二维的所有元素进行切片;“::-1”
表示对第三维的所有元素进行逆序切片。
img_RGB = img_BGR[:, :, ::-1]
实验效果图:
五、图像属性
shape:行×列×通道数(如果图像是彩色的)。
size:图像的大小(高度×宽度×通道数)
dtype:图像数据类型
import cv2
img = cv2.imread("caise.png")
print("img shape:", img.shape) # img shape: (452, 349, 3)
print("img size:", img.size) # img size: 473244
print("img data type:", img.dtype) # 因为像素值为[0,255],因此图像数据类型是uint8
如果我们要访问某个点的像素值,我们需要向img变量提供行和列,例如要获得(x=6,y=12)处的像素值。另外,OpenCV对彩色图像使用BGR格式。因此,我们也可以使用通道的索引来获取B、G和R值。
# 获取固定点位的像素值
b, g, r = img[12, 6]
print(b, g, r) # 91 86 87
# 获取固定点位的B值
B = img[12, 6, 0]
print(B) # 91
需要处理某个区域而不是一个像素时,应该提供这个区域的范围(也称切片),而不是单个值。例如,要获取图像的左上角。
# 获取某个区域的像素值
top_left_area = img[0:200, 0:150]
cv2.imshow("top_left_area", top_left_area)
cv2.waitKey(0)