龙空技术网

OpenCV图像处理中常见操作

七月在线 375

前言:

当前各位老铁们对“图像二值化处理”大致比较关怀,朋友们都想要学习一些“图像二值化处理”的相关文章。那么小编同时在网络上搜集了一些关于“图像二值化处理””的相关文章,希望看官们能喜欢,我们快快来学习一下吧!

导读:OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上,同时支持多语言、跨平台,功能强大。

01、图像几何变换

图像几何变换:将不同的几何变换应用到图像上,如平移、旋转、仿射变换等。

变换

OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,您可以使用它们进行各种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。

缩放

缩放只是调整图像的大小。为此,OpenCV带有一个函数cv.resize()。图像的大小可以手动指定,也可以指定缩放比例。也可使用不同的插值方法。首选的插值方法是cv.INTER_AREA用于缩小,cv.INTER_CUBIC(慢)和cv.INTER_LINEAR用于缩放。默认情况下,出于所有调整大小的目的,使用的插值方法为cv.INTER_LINEAR。

旋转

图像旋转角度为θ,是通过以下形式的变换矩阵实现的,为了找到此转换矩阵,OpenCV提供了一个函数cv.getRotationMatrix2D。

仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行。为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的对应位置。然后cv.getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv.warpAffine。

透视变换

对于透视变换,您需要3x3变换矩阵。即使在转换后,直线也将保持直线。要找到此变换矩阵,您需要在输入图像上有4个点,在输出图像上需要相应的点。在这四个点中,其中三个不应共线。然后可以通过函数cv.getPerspectiveTransform找到变换矩阵。然后将cv.warpPerspective应用于此3x3转换矩阵。

【OpenCV的入门与实战】课程共包含6个课时,25个知识点、11个实战项目,以OpenCV的使用与计算机视觉基础知识点开始,然后讲解计算机视觉通用算法和具体实现,进而使用OpenCV来完成视觉项目。

课程报名链接

02、图像阈值

简单阈值

图像处理时,常常需要将图片二值化。以某个点为区分点,大于它的为一个值,小于它的赋另一个值。opencv提供了cv.threshold(),处理阈值,并生成阈值处理后的结果。

在这里,问题直截了当。对于每个像素,应用相同的阈值。如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。函数cv.threshold用于应用阈值。

第一个参数是源图像,它应该是灰度图像。第二个参数是阈值,用于对像素值进行分类。第三个参数是分配给超过阈值的像素值的最大值。

OpenCV提供了不同类型的阈值,这由函数的第四个参数给出。通过使用cv.THRESH_BINARY类型。

cv.THRESH_BINARY 二值化阈值处理,会将原始图像处理为仅有两个值的二值图像。cv.THRESH_BINARY_INV,反二值化阈值处理,反二值化阈值处理与相反,高于阈值的部分设置为0,低于阈值的部分设置为maxval. cv.THRESH_TRUNC,截断阈值化处理 ,大于阈值的像素点设置为阈值,小于阈值的像素点不变。

cv.THRESH_TOZERO, 低阈值零处理 cv.THRESH_TOZERO_INV,超阈值零处理 所有阈值处理类型,都需要自己设置一个阈值,以此作为图像阈值处理的依据。但在某些情况下,阈值并不好测算。

例如:有些图像的灰度级分布非常不均衡,比如绝大部分在60-70之间,若把阈值设置为127,则明显不符合预期。需要找到更好的阈值。但阈值的并不是一下就能看出的。若需要手动查找,工作量太大。而Otsu处理则可以自动找出最佳的分割阈值。

该方法返回两个输出。第一个是使用的阈值,第二个输出是阈值后的图像。

自适应阈值

在面我们使用一个全局值作为阈值。但这可能并非在所有情况下都很好,例如,如果图像在不同区域具有不同的光照条件。在这种情况下,自适应阈值阈值化可以提供帮助。在此,算法基于像素周围的小区域确定像素的阈值。因此,对于同一图像的不同区域,我们获得了不同的阈值,这为光照度变化的图像提供了更好的结果。除上述参数外,方法cv.adaptiveThreshold还包含三个输入参数:

该adaptiveMethod决定阈值是如何计算的:

cv.ADAPTIVE_THRESH_MEAN_C:阈值是邻近区域的平均值减去常数C。cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值的高斯加权总和减去常数C。

该BLOCKSIZE确定附近区域的大小,C是从邻域像素的平均或加权总和中减去的一个常数。

【OpenCV的入门与实战】课程共包含6个课时,25个知识点、11个实战项目,以OpenCV的使用与计算机视觉基础知识点开始,然后讲解计算机视觉通用算法和具体实现,进而使用OpenCV来完成视觉项目。

课程报名链接

03、Otsu的二值化

在全局阈值化中,我们使用任意选择的值作为阈值。相反,Otsu的方法避免了必须选择一个值并自动确定它的情况。

考虑仅具有两个不同图像值的图像(双峰图像),其中直方图将仅包含两个峰。一个好的阈值应该在这两个值的中间。类似地,Otsu的方法从图像直方图中确定最佳全局阈值。

为此,使用了cv.threshold作为附加标志传递。阈值可以任意选择。然后,算法找到最佳阈值,该阈值作为第一输出返回。

Otsu的二值化如何实现?由于我们正在处理双峰图像,因此Otsu的算法尝试找到一个阈值(t),该阈值将由关系式给出的加权类内方差最小化:实际上,它找到位于两个峰值之间的t值,以使两个类别的差异最小。

图像平滑

在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一个过程称之为对图片的平滑处理。图像平滑处理的基本原理是:将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值, 使用各种低通滤镜模糊图像 - 将定制的滤镜应用于图像(2D卷积)

图像过滤

与一维信号一样,还可以使用各种低通滤波器(LPF),高通滤波器(HPF)等对图像进行滤波。LPF有助于消除噪声,使图像模糊等。HPF滤波器有助于在图像中找到边缘。OpenCV提供了一个函数cv.filter2D来将内核与图像进行卷积。

图像平滑

通过将图像与低通滤波器内核进行卷积来实现图像模糊。这对于消除噪音很有用。它实际上从图像中消除了高频部分(例如噪声,边缘)。因此,在此操作中边缘有些模糊。(有一些模糊技术也可以不模糊边缘)。OpenCV主要提供四种类型的模糊技术。

① 平均 也称之为均值滤波:用当前像素点周围N*N个像素值的均值来代替当前像素值,遍历处理图像内的每一个像素点。

这是通过将图像与归一化框滤镜进行卷积来完成的。它仅获取内核区域下所有像素的平均值,并替换中心元素。这是通过功能cv.blur()或cv.boxFilter()完成的。指定内核的宽度和高度,如果您不想使用标准化的框式过滤器,请使用cv.boxFilter()。将参数normalize = False传递给函数。

② 高斯模糊 在进行均值滤波时,其邻域内每个像素的权重是相等的,在高斯滤波中,会将中心点的权重加大,远离中心点的权重减少,在此基础上计算邻域内各个像素值不同权重的和。通过功能cv.GaussianBlur() 完成的。我们应指定内核的宽度和高度,该宽度和高度应为正数和奇数。我们还应指定X和Y方向的标准偏差,分别为sigmaX和sigmaY。如果仅指定sigmaX,则将sigmaY与sigmaX相同。如果两个都为零,则根据内核大小进行计算。高斯模糊对于从图像中去除高斯噪声非常有效。

可以使用函数cv.getGaussianKernel() 创建高斯内核。

③ 中位模糊 用邻域内所有像素值的中间值来代替当前像素点的像素值。函数cv.medianBlur() 提取内核区域下所有像素的中值,并将中心元素替换为该中值。这对于消除图像中的椒盐噪声非常有效。有趣的是,在上述过滤器中,中心元素是新计算的值,该值可以是图像中的像素值或新值。但是在中值模糊中,中心元素总是被图像中的某些像值代替。有效降低噪音。其内核大小应为正奇数整数。

④ 双边滤波 双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。这样不对吧苦入

cv.bilateralFilter() 在去除噪声的同时保持边缘清晰锐利非常有效。但是,与其他过滤器相比,该操作速度较慢。高斯滤波器采用的邻域并找到其高斯加权平均值。高斯滤波器仅是空间的函数,也就是说,滤波时会考虑附近的像素。它不考虑像素是否具有几乎相同的强度。它不考虑像素是否是边缘像素。因此它也模糊了边缘,这是我们不想做的。

双边滤波器在空间中也采用高斯滤波器,但是又有一个高斯滤波器,它是像素差的函数。空间的高斯函数确保仅考虑附近像素的模糊,而强度差的高斯函数确保仅考虑强度与中心像素相似的那些像素的模糊。由于边缘的像素强度变化较大,因此可以保留边缘。

标签: #图像二值化处理 #均值滤波处理椒盐噪声