Day24 opencv预处理
图像滤波
图像滤波是通过滤波器得到另一个图像的过程。在深度学习中,滤波器又称为卷积核,滤波的过程称为卷积。卷积核的大小通常为奇数,如3x3、5x5、7x7等,以保证锚点在中间,防止位置发生偏移。锚点是指卷积核的中心点,卷积核越大,看到的信息越多,提取的特征越好,但计算量也越大。
图像平滑处理
图像噪声是指存在于图像数据中的不必要的或多余的干扰信息,妨碍了人们通过视觉器官对接收信息的理解。图像噪声可以分为外部噪声和内部噪声,外部噪声由外部环境因素引起,如光线变化、电磁干扰等,内部噪声由设备本身的因素引起,如传感器噪声、电路噪声等。图像噪声的产生原因包括传感器和电路产生的噪声、长时间曝光、格式压缩、感光元件特性等。
为了减少图像中的噪声,可以采取一些专业的图像处理技术,如图像降噪。常见的图像平滑处理方法包括高斯滤波、中值滤波和双边滤波。
高斯滤波
高斯滤波是图像处理中常用的一种平滑滤波方法,主要作用是去除图像中的噪声,并减少图像细节,以实现图像的平滑处理。高斯滤波的原理是利用高斯函数对图像进行加权平均,通过这种方式,高斯滤波可以有效地减少图像中的噪声,并保留图像的整体特征。高斯滤波的使用场景包括去除高斯噪声、模糊处理、提取大致轮廓等。
cv2.GaussianBlur()
是 OpenCV 库中用于图像模糊处理的函数之一。该函数可以对图像进行高斯模糊处理,即在每个像素周围使用高斯核来加权平均计算像素值,从而达到模糊效果。
cv2.GaussianBlur(src, ksize, sigmaX)
:
-
src
:输入图像。 -
ksize
:高斯核的大小,通常以元组(width, height)
的形式指定。 -
sigmaX
:高斯核在 x 方向上的标准差。
双边滤波
双边滤波是图像处理中常用的一种平滑滤波方法,它可以同时平滑图像并保留边缘信息。双边滤波通过考虑像素点的空间距离和灰度差异,实现了对图像进行平滑的同时,尽量保留图像的边缘细节。双边滤波适用于各种类型的图像,特别适合于那些需要平滑处理但仍保留边缘细节的图像,例如人脸识别、图像增强和图像去噪等领域。
双边滤波适用于各种类型的图像,特别适合于那些需要平滑处理但仍保留边缘细节的图像,例如人脸识别、图像增强和图像去噪等领域。
cv2.bilateralFilter()
是 OpenCV 库中用于图像滤波处理的函数之一。该函数可以对图像进行双边滤波处理,即在保持边缘清晰的同时,对图像进行平滑处理。
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
函数接受四个参数:
-
src
:输入图像。 -
d
:滤波器的直径,用于指定在每个像素周围考虑的像素邻域大小。一般为正奇数 -
sigmaColor
:颜色空间的标准差,用于控制滤波过程中颜色相似性的权重。较大的值意味着更宽松的颜色相似性条件。 -
大 sigmaColor 值:当
sigmaColor
较大时,颜色差异较大的像素也会被赋予较大的权重,这意味着滤波器会在更大范围内进行平滑处理,导致图像细节的丢失较多。 -
小 sigmaColor 值:当
sigmaColor
较小时,只有颜色差异较小的像素会被赋予较大的权重,滤波器主要在颜色相似的区域内进行平滑处理,这样可以更好地保留边缘和细节 -
sigmaSpace
:坐标空间的标准差,用于控制滤波过程中空间相似性的权重。较大的值意味着更宽松的空间相似性条件。 -
大 sigmaSpace 值:当
sigmaSpace
较大时,空间上距离较远的像素也会被赋予较大的权重,这意味着滤波器会在更大的空间范围内进行平滑处理,导致图像的局部细节被进一步平滑。 -
小 sigmaSpace 值:当
sigmaSpace
较小时,只有空间上距离较近的像素会被赋予较大的权重,滤波器主要在局部范围内进行平滑处理,这样可以更好地保留局部细节和边缘信息
中值滤波
中值滤波是图像处理中常用的一种平滑滤波方法,其主要作用是去除图像中的胡椒噪声或其他类型的脉冲噪声。中值滤波的原理是将每个像素点周围的邻域像素按照灰度值大小进行排序,然后取中间值作为该像素点的输出值。中值滤波适用于各种类型的图像,特别适合于那些受到椒盐噪声干扰的图像。
cv2.medianBlur()是OpenCV中的一个函数,用于对图像进行中值滤波处理。中值滤波是一种常见的图像处理技术,可用于去除图像中的椒盐噪声或斑点噪声。这个函数的语法如下:
cv2.medianBlur(src, ksize)
其中:
-
src
是输入的图像。 -
ksize
是用于中值滤波的孔径大小,必须是大于1的奇数,例如3、5、7等。
import cv2
img = cv2.imread("images/hujiao.png")
# 对图像进行高斯模糊处理
blurred_image = cv2.medianBlur(img,5)
# 显示原始图像和滤波后的图像
cv2.imshow('old Image', img)
cv2.imshow('new Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像边缘检测
图像边缘检测是物体与背景、物体与物体之间的边界检测,对于图像分割、特征提取等任务非常重要。图像边缘蕴含了丰富的信息,如形状、方向、纹理等,这些信息对于后续的图像处理和分析非常重要。通过边缘检测,可以大幅减少数据量,并且剔除可以认为不相关的信息,保留了图像重要的结构属性。
Canny边缘检测
Canny边缘检测广泛应用于图像处理、计算机视觉和机器学习中的物体识别、图像分割等任务。Canny边缘检测算法可以有效地提取图像中的边缘,通过设置低阈值和高阈值来识别可能的边缘像素和强烈的边缘像素,从而减少由于噪声引起的虚假边缘。
函数语法
edges = cv2.Canny(image, threshold1, threshold2)
参数
-
image: 输入的灰度图像。
-
threshold1: 第一个阈值,用于边缘检测的低阈值。
-
threshold2: 第二个阈值,用于边缘检测的高阈值。
-
低阈值:
-
低阈值用来识别可能的边缘像素。如果一个像素的梯度值大于低阈值,那么这个像素可能会被认为是边缘的一部分。
-
但是,单独依靠低阈值来识别边缘是不够的,因为它可能会导致很多虚假的边缘被识别出来,特别是那些由于噪声引起的边缘。
-
-
高阈值:
-
高阈值用于识别强烈的边缘像素。如果一个像素的梯度值大于高阈值,那么这个像素几乎可以肯定是边缘的一部分。
-
高阈值的存在可以有效地减少由于噪声引起的虚假边缘
-
返回值
-
edges: 返回检测到的边缘图像,边缘部分为白色,其他部分为黑色。
图像形态学操作
图像形态学操作是一类基于形状的图像处理技术,主要用于提取图像中的有用特征,如边界检测、噪声去除等。常见的形态学操作包括腐蚀、膨胀、开运算、闭运算、梯度、顶帽和黑帽等。
腐蚀
腐蚀操作会减少图像中白色区域的大小,常用于消除小的白色噪声点。腐蚀的基本思想是,如果一个结构元素完全包含在前景物体内部,则该结构元素对应的输出图像位置的值为1,否则为0。
函数:
eroded = cv2.erode(src, kernel, dst,iterations=1)
参数说明
-
src: 输入图像。
-
kernel: 结构元素,用于定义腐蚀操作的方式。是一个矩阵结构数据
-
dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。
-
iterations (可选): 腐蚀操作的迭代次数,默认为1
迭代次数的影响
-
迭代次数:
iterations
参数控制腐蚀操作的迭代次数。增加迭代次数会使腐蚀效果更加明显,但也会导致前景物体变得更小
膨胀
膨胀操作与腐蚀相反,它会增加图像中白色区域的大小,常用于填补前景物体中的小洞或扩大前景物体的边界。
函数:
dilated = cv2.dilate(src, kernel, iterations=1)
参数说明
-
src: 输入图像。
-
kernel: 结构元素,用于定义腐蚀操作的方式。是一个矩阵结构数据
-
dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。
-
iterations (可选): 迭代操作的迭代次数,默认为1
开运算
开运算是先腐蚀后膨胀的过程,常用于去除小的物体、平滑较大的物体边界以及填充细长的突出部分。
函数:
opened = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
参数说明
-
src: 输入图像。
-
op
: 形态学操作的类型,可以是以下几种之一:
-
cv2.MORPH_OPEN
:开运算 -
cv2.MORPH_CLOSE
:闭运算 -
cv2.MORPH_GRADIENT
:形态学梯度 -
cv2.MORPH_TOPHAT
:顶帽 -
cv2.MORPH_BLACKHAT
:黑帽
-
-
kernel: 结构元素,用于定义形态学操作的方式。可以通过
cv2.getStructuringElement
函数获得
闭运算
闭运算是先膨胀后腐蚀的过程,常用于填充前景物体中的小洞,平滑较大物体的边界以及连接邻近的物体。
函数:
closed = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
形态学梯度
形态学梯度是通过计算膨胀后的图像与腐蚀后的图像之间的差值来得到的,可以突出物体的边缘。
顶帽
顶帽变换是原图像与开运算结果的差值,用于获取图像中的亮细节。
tophat = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
黑帽
黑帽变换是闭运算结果与原图像的差值,用于获取图像中的暗细节。
blackhat = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)