官网tutorials
图像信息在计算机中其实是作为一个array存在的。
对于灰度图,每个像素的值可以用一个uint8型表示(0->255,黑->白)。这样整个灰度图的图片可以用一个二维数组表示。
例如,对于200x300(200,300指像素,一共有60000个像素)大小的灰度图,可以用一个uint8 array[200, 300]表示。
对于彩色图片,每个像素的位置还是用一个二位数组表示,而该位置处的像素值可以用一个size等于3的向量表示(例如3通道RGB图)。整个图片可以用一个width * height * number_of_channel表示(例如200*300*3)。有些图片格式还有透明度信息,此时每个像素值将有4个channel。
对于R, G, B三个channel,每个channel可以用一个uint8表示,在R这个channel上,其值0->255表示黑色->红色(前提是另外两个channel你都设为了0)。
写个代码练一练:
img = np.zeros(shape = (300, 400), dtype = np.uint8)
img包含了一些属性:
print(img.shape) #output 300x400
print(img.size)
print(img.dtype)
print(img
运行结果:
(300, 400)
120000
uint8
[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
cv2.imwrite("/home/kyle/Pictures/gray_img.jpg", img)
注意:在imwrite中,路径参数不能用~/Pictures/***.jpg,我也不知为什么,如果这样用的话程序运行不会报错,但是在那个路径下找不到保存的图片文件。
然后就可以用图片查看工具打开gray_img.jpg了。打开后你会发现是个全黑的图片,因为每个像素的值都是0。
例如将上一步生成的单通道的灰度图转换为3通道的BGR图:
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
print(img.shape) #output 300x400x3, 3 channel.
print(img.size)
print(img.dtype)
print(img
打印输出:
(300, 400, 3)
360000
uint8
[[[0 0 0]
[0 0 0]
[0 0 0]
...
[0 0 0]
[0 0 0]
[0 0 0]]]
#img[:, :] = 200 #change the value of all channels to 200.
img[:, :, 1] = 200 #change the value of channel 1 to 200.
print(img)
cv2.namedWindow("Image")
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
默认情况下,即使图像文件为灰度格式,imread()函数也会返回BGR格式的图像。该函数包含一些可配置的参数:
IMREAD_GRAYSCALE = 0
IMREAD_COLOR = 1
IMREAD_ANYDEPTH = 2
IMREAD_ANYCOLOR = 4
IMREAD_LOAD_GDAL = 8
IMREAD_UNCHANGED = -1
例如,将一幅彩色图片以灰度图的方式读取,并以灰度图的方式保存到本地:
grayImage = cv2.imread("/home/kyle/Pictures/test.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imwrite("/home/kyle/Pictures/test_gray.png", grayImage)
原图与另存后的图:
你也可以尝试其他参数,查看读取的结果。
完整代码:
GitHub地址:GitHub
#!/usr/bin/env python3
import numpy as np
from cv2 import cv2 #if you use "import cv2", it will occurs some error prompt in vscode.
def test():
img = np.zeros(shape = (300, 400), dtype = np.uint8)
print(img.shape) #output 300x400
print(img.size)
print(img.dtype)
print(img)
#save img to file. I don't know why can't use "~/Pictures/gray_img.jpg".
cv2.imwrite("/home/kyle/Pictures/gray_img.jpg", img)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
print(img.shape) #output 300x400x3, 3 channel.
print(img.size)
print(img.dtype)
print(img)
#img[:, :] = 200 #change the value of all channels to 200.
img[:, :, 1] = 200 #change the value of channel 1 to 200.
cv2.imwrite("/home/kyle/Pictures/color_img.jpg", img)
print(img)
img[90:190, 30:120, 0] = 255
cv2.namedWindow("Image") #not necessary.
cv2.imshow("Image", img)
grayImage = cv2.imread("/home/kyle/Pictures/test.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imwrite("/home/kyle/Pictures/test_gray.png", grayImage)
cv2.namedWindow("Image2")
cv2.imshow("Image2", grayImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
test()