一、读取图片
cv2.imread(path, flags)
path:图片的路径,相对路径或绝对路径。
flags:加载图片的方式,有三种取值,默认为cv2.IMAGED_COLOR。
cv2.IMREAD_COLOR:图片的透明度会被忽略,默认为该值。
cv2.IMREAD_GRAYSCALE:以灰度模式一张图片。
cv2.IMREAD_UNCHANGED:图片的透明度不会被忽略。
如果给定的图片路径不对,该函数不会抛出异常,而是返回一个None,如果给定正确的图片路径,将返回一个[height, width, channel]的numpy.ndarray对象,height表示图片高度,width表示图片宽度,channel表示图片的通道。
(a)IMAGE_COLOR (b)IMAGE_GRAYSCALE (3)IMAGE_UNCHANGED
实现代码:
import cv2
img = cv2.imread("caise.png")
img_COLOR = cv2.imread("caise.png", cv2.IMREAD_COLOR)
img_GRAYSCALE = cv2.imread("caise.png", cv2.IMREAD_GRAYSCALE)
img_UNCHANGED = cv2.imread("caise.png", cv2.IMREAD_UNCHANGED)
cv2.imshow("image", img)
cv2.imshow("image_COLOR", img_COLOR)
cv2.imshow("image_GRAYSCALE", img_GRAYSCALE)
cv2.imshow("image_UNCHANGED", img_UNCHANGED)
cv2.waitKey(0)
在这里,如果我们想在同一个窗口显示两个图像,可以构建一个包含这两个图像的拼接图像,将这两张图片水平连接起来。为此,我们需要使用NumPy的concatenate()方法。
concatenate((a1, a2, ...), axis=0)
(a1, a2,...):传入的参数必须是一个多个数组的元组或者列表。
axis:默认为0,表示拼接的方向。
实现代码:
import cv2
import numpy as np
img = cv2.imread("caise.png")
img_COLOR = cv2.imread("caise.png", cv2.IMREAD_COLOR)
img_GRAYSCALE = cv2.imread("caise.png", cv2.IMREAD_GRAYSCALE)
img_UNCHANGED = cv2.imread("caise.png", cv2.IMREAD_UNCHANGED)
img_concat = np.concatenate((img, img_COLOR, img_UNCHANGED), axis=1)
cv2.imshow("img_concat", img_concat)
cv2.waitKey(0)
在上述过程中,发现以cv2.IMAGE_GRAYSCALE方式加载图片的方式所得到的数组维度与其他方式得到的数组维度不一样(因为灰度图的B,G,R值相同)。因此,可以通过NumPy中的shape()方式查看数组的维度。
实现代码:
import cv2
import numpy as np
img = cv2.imread("caise.png")
img_COLOR = cv2.imread("caise.png", cv2.IMREAD_COLOR)
img_GRAYSCALE = cv2.imread("caise.png", cv2.IMREAD_GRAYSCALE)
img_UNCHANGED = cv2.imread("caise.png", cv2.IMREAD_UNCHANGED)
print("img shape:", img.shape) # img shape: (452, 349, 3)
print("img_COLOR shape:", img_COLOR.shape) # img_COLOR shape: (452, 349, 3)
print("img_GRAYSCALE shape:", img_GRAYSCALE.shape) # img_GRAYSCALE shape: (452, 349)
print("img_UNCHANGED shape:", img_UNCHANGED.shape) # img_UNCHANGED shape: (452, 349, 3)
二、显示图片
cv2.imshow(window_name, image)
window_name:一个字符串,表示创建的窗口名字,每一个窗口必须有一个唯一的名字。
image:是一个图片矩阵,numpy.ndarray类型。
在图片显示的过程中,通常会伴随几个其他的函数,他们分别是:
cv2.waitkey():让程序在这里挂起暂停执行,接受一个单位为毫秒的时间,它等待指定时间的键盘事件,在指定时间内发生了键盘事件,程序继续执行,否则必须等到时间结束才能继续执行,参数如果为0表示等待无限长的事件。
cv2.destroyALLWindows():销毁所有已创建的窗口。
cv2.destroyWindow(window_name):销毁指定窗口。
cv2.namedWindow(window_name,flag):放大或缩小窗口,flag可以是cv2.WINDOW_NORMAL,cv2.WINDOW_AUTOSIZE,cv2.WINDOW_FULLSCREEN等。
实现代码:
import cv2
img_caise = cv2.imread("caise.png")
img_heibai = cv2.imread("heibai.png")
cv2.imshow("img_caise", img_caise)
cv2.imshow("img_heibai", img_heibai)
cv2.waitKey(0)
cv2.imshow("img_caise", img_caise)
cv2.imshow("img_heibai", img_heibai)
cv2.destroyWindow("img_caise")
cv2.waitKey(0)
三、保存图片
cv2.imwrite(filename, img)
filename:保存文件的路径名。
img:图像的numpy.ndarray对象。
四、RGB图像的通道拆分与合并
通道拆分:
方法一:通过OpenCV的split()函数。
b, g, r = cv2.split(img)
方法二:由于cv2.split()是一项耗时的操作。因此首先考虑使用 NumPy 索引。
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
通道合并:
img = cv2.merge([B,G,R])
实现代码:
import cv2
import numpy as np
img = cv2.imread("caise.png")
b, g, r = cv2.split(img)
# b = img[:, :, 0]
# g = img[:, :, 1]
# r = img[:, :, 2]
cv2.imshow("image", img)
cv2.imshow("Blue", b)
cv2.imshow("Green", g)
cv2.imshow("Red", r)
cv2.waitKey(0)
分离出来的RGB单通道图像是灰度图,我们将RGB图像三通道拆分的过程实际上是先拆分出来,再形成了R/G/B的单通道的图像,而单通道图像就是灰度图。
如果想把它变成红色/绿色/蓝色的通道图,可以做通道合并(但其他通道分量为零)。
实现代码:
import cv2
import numpy as np
img = cv2.imread("caise.png")
b, g, r = cv2.split(img)
# b = img[:, :, 0]
# g = img[:, :, 1]
# r = img[:, :, 2]
cv2.imshow("image", img)
cv2.imshow("Blue", b)
cv2.imshow("Green", g)
cv2.imshow("Red", r)
cv2.waitKey(0)
cv2.destroyAllWindows()
zeros = np.zeros(img.shape[:2], dtype="uint8") # 构造维度为img的长×宽的零矩阵
blue = cv2.merge([b, zeros, zeros])
green = cv2.merge([zeros, g, zeros])
red = cv2.merge([zeros, zeros, r])
cv2.imshow("Blue", blue)
cv2.imshow("Green", green)
cv2.imshow("Red", red)
cv2.waitKey(0)