点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
图像处理适用于图像和视频。良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等。今天我们来回顾一下图像处理中的最基础的,但是却非常实用的一些操作。
图像处理
图像处理始于计算机识别数据。首先,为图像格式的数据创建一个矩阵。图像中的每个像素值都被处理到此矩阵中。例如,为尺寸为200x200的图片创建尺寸为200x200的矩阵。如果此图像是彩色的,则此尺寸变为200x200x3(RGB)。实际上,图像处理中的每个操作都是矩阵运算。假设需要对图像进行模糊操作。特定的过滤器会在整个矩阵上移动,从而对所有矩阵元素或部分矩阵元素进行更改。作为该过程的结果,图像的所需部分或全部变得模糊。
在许多情况下都需要对图像进行处理[1]。通常,这些操作应用于将在深度学习模型中使用。例如,使用彩色图像进行训练会导致性能下降。卷积神经网络是图像处理最广泛使用的深度学习结构之一。该网络确定图像上卷积层训练所需的属性。在这一点上,仅图像中将用于训练的某些部分可能需要处理。图片中更圆的线条而不是清晰的线条突出有时可以提高训练的成功率。
除上述情况外,相同的逻辑还基于日常生活中使用的图像优化程序的操作。图像处理中有许多过程,例如提高图像质量,对图像进行还原,消除噪声,直方图均衡化。
OpenCV
OpenCV是用于图像处理的最流行的库之一[2]。有许多使用OpenCV的公司,例如Microsoft,Intel,Google,Yahoo。OpenCV支持多种编程语言,例如Java,C ++,Python和Matlab。本工作中的所有示例都是使用Python编码的。
import cv2
from matplotlib import pyplot as plt
import numpy as np
首先,导入库。OpenCV中的某些功能在每个版本中均无法稳定运行。这些功能之一是“ imshow”。此功能使我们可以查看由于操作导致的图像变化。对于有此类问题的人,matplotlib库将用作这项工作的替代解决方案。
图1.标准图像
要执行的过程将应用于上面显示的图像(图1)。最初会读取图像,以便对其进行处理。
img_path = "/Users/..../opencv/road.jpeg"
img = cv2.imread(img_path)
print(img.shape)
>>>(960, 1280, 3)
图2中图像的尺寸为960 x 1280像素。当我们要在读取过程后打印尺寸时,我们看到960x1280x3的结果。因此,根据图像的尺寸创建了一个矩阵,并为该矩阵分配了图像每个像素的值。RGB有3个维度,因为图像是彩色的。
如果我们想将图像转换为黑白图像,则使用cvtColor函数。
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
如果要查看由于该函数而发生的更改,可以使用matplotlib中的imshow函数。
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray_image)
plt.show()
print(gray_image.shape)
>>>(960, 1280)
图2.黑白图像
如图2所示,我们已将图像转换为黑白图像。当我们检查其尺寸时,不再有3个尺寸。
当查看图像的矩阵值时,我们看到它由0到255之间的值组成。在某些情况下,我们可能希望此矩阵仅由0到255的值组成[3]。在这种情况下使用阈值功能。
(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 20, 255, cv2.THRESH_BINARY)
(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 80, 255, cv2.THRESH_BINARY)
(thresh, blackAndWhiteImage) = cv2.threshold(gray_image, 160, 255, cv2.THRESH_BINARY)
(thresh, blackAndWhiteImage) &