计算机视觉技术赋予计算机“看见”的能力,它的发展让人类能够看到原本不存在的事物,比如将彩色图像转换成黑白版本。众多计算机视觉和机器学习库使得这一切成为可能,例如OpenCV、Kornia、Scikit-Image、PIL、SimpleCV和PG Magic等。本文将从OpenCV开始,介绍这些库的基本实现和特性。
对于机器来说,图像被解释为由像素组成的二维矩阵,这些像素排列成行和列。像素是图像中最小的可访问部分。图像分辨率告诉图像中有多少像素,它由图像的宽度和高度定义。常见的图像分辨率包括VGA(640x480)、HD(1280x720)、FHD(1920x1080)和4K(3840x2160)。
二值图像是指黑白图像,因为在黑白图像中,每个小元素/盒子要么是黑色(用0表示),要么是白色(用1表示)。这些图像因此被称为二值图像。
安装PyCharm 3.7,因为它与OpenCV兼容良好。打开新项目并选择项目解释器为3.7。在PyCharm中安装OpenCV库。
import cv2
注意:OpenCV发布了两个Python接口,cv和cv2。cv2是最新版本,将使用这个版本。
在OpenCV中,使用imread()
函数来读取图像。首先,需要创建一个图像变量,比如‘img’。imread()
函数需要传入图像文件的路径作为参数。
img = cv2.imread("Resources/lena.png")
语法:
img = cv2.imread("path location of Image folder")
转换到不同的颜色空间
使用cvtColor()
函数可以将图像转换到150多种颜色空间。
img = cv2.cvtColor(prev_img_object, colorspace)
例如,将图像转换为灰度颜色空间:
img = cv2.imread("Resource/lena.png")
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", imgGray)
注意:传统上使用RGB,但在OpenCV中,写作BGR。
高斯模糊
高斯模糊函数用于给图像添加模糊效果。
imgBlur = cv2.GaussianBlur(prev_img_object, (kernel size, Kernel Size), sigma x)
例如:
img = cv2.imread("Resources/lena.png")
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7,7), 0)
cv2.imshow("Blur Image", imgBlur)
Canny边缘检测
Canny边缘检测是一种用于提取结构信息(即边缘)的技术。它接受灰度图像作为输入。
imgCanny = cv2.Canny(prev_img_obj, threshold1, threshold2)
例如:
imgCanny = cv2.Canny(img, 150, 200)
图像膨胀
图像膨胀是一种用于沿边缘扩展图像像素的技术。它用于加厚图像中的边缘,以消除图像中的间隙。
imgDilation = cv2.dilate(imgCanny, kernel, iterations=n)
例如:
kernel = np.ones((5,5), np.uint8)
imgDilation = cv2.dilate(imgCanny, kernel, iterations=1)
图像腐蚀
由于腐蚀是膨胀的相反操作,如果对膨胀后的图像应用腐蚀,可以得到类似于Canny边缘版本的图像结果。腐蚀计算给定区域内像素的最小区域。
imgEroded = cv2.erode(imgCanny, kernel, iterations=n)
例如:
imgEroded = cv2.erode(imgDilation, kernel, iterations=n)
cv2.imshow("Eroded Image", imgEroded)
OpenCV约定
调整图像大小
要调整图像大小,需要知道图像的当前大小。为此,使用shape
函数。
print(img_name.shape)
例如:
img = cv2.imread("Resources/lambo.png")
cv2.imshow("Original Image", img)
print(img.shape)
输出:
[1] 462 623 3
注意:这里462是高度,623是宽度,3代表RGB通道。
调整大小函数
用于调整图像大小,它接受新的高和宽作为参数。
ResizedImage = cv2.resize(originalimagename, (new height, new width))
例如:
imgResize = cv2.resize(img, (300, 200))
print(imgResize.shape)
输出:
[1] 200 300 3
注意:这里200和300分别是新的高和宽。
裁剪图像
图像是一个像素数组,它是一个矩阵。因此,不需要任何特殊的OpenCV函数,可以使用Numpy的矩阵函数来实现。
imgCropped = img[Start_height : End_height, start_width : end_width]
注意在OpenCV函数中,先写宽度然后是高度。
在图像中添加文本
使用cv2.putText()
函数在图像中添加文本。它接受要添加的文本、起始坐标、字体类型、厚度以及文本的颜色(BGR格式)和缩放比例——文本的大小。
cv2.putText(img_obj, "text_here", (start coordinates), cv2.Font_Type, scale, (B,R,G), Thickness)
例如:
cv2.putText(img, "OPENCV", (100, 200), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 0), 2)
FONT_HERSHEY_SIMPLEX = 0
FONT_HERSHEY_PLAIN = 1
FONT_HERSHEY_DUPLEX = 2
FONT_HERSHEY_COMPLEX = 3
FONT_HERSHEY_TRIPLEX = 4
FONT_HERSHEY_COMPLEX_SMALL = 5
FONT_HERSHEY_SCRIPT_SIMPLEX = 6
FONT_HERSHEY_SCRIPT_COMPLEX = 7