opencv中的cvSmooth函数学习

平滑处理

”平滑处理“也称”模糊处理“,英文可以称为”blurring“,是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多,但最常见的是用来减少图像上的噪声或失真,还可以降低图像的分辨率。

目前opencv可以提供五种不同的平滑操作方法,所有操作都有cvSmooth函数实现,该函数可以将用户期望的平滑方式作为参数。

void cvSmooth{
  const  CvArr*       src,
  CvArr*              dst,
  int                 smoothtype,
  int                 param1,
  int                 param2,
  int                 param3,
  int                 param4
};
src和dst分别是平滑操作的输入图像和结果,cvSmooth()函数包含4个参数;param1,param2,pparam3和param4.这些参数的含义取决于smoothtype的值。

smoothtype的值可以为CV_BLUR、CV_BLUR_NO_SCALE、CV_MEDIAN、CV_GAUSSIAN、CV_BILATERAL四种类型。

CV_BLUR(简单模糊)支持in place方式(in place方式代表输入图像与结果图像是同一个图像),支持1或3通道,可以处理8位无符号图像和32位浮点图像,输出图像的每一个像素是窗口中输入图像对应像素的简单平均值,即对每个像素的param1×param2邻域求和,并做1/(param1×param2)的比例缩放。

CV_BLUR_NO_SCAL(简单无缩放变换的模糊)仅支持单通道,与CV_BLUR本质上式相同的,但没有计算其平均值的操作。所以,输入图像和结果图像必须有不同的数值精度,才能保证模糊操作不会导致错误溢出。支持输入8位图像到输出16位图像的转换,支持输入32位浮点图像到输出32位浮点图像的转换,即不支持in place方式:输入图像和输出图像必须不同。用户选择简单无缩放比例的模糊操作是因为其比缩放比例的模糊操作要快一点。操作:对每个像素的param1×param2邻域求和。

CV_MEDIAN(中值滤波)支持1、3通道的8位图像,输出图像也是8位的,不支持in place方式。它将中心像素的正方形邻域内的每个像素值用中间像素值替换,基于平均算法的simple blur(即CV_BLUR)对噪声图像特别是有大的孤立点的图像非常敏感,即使有极少数量点存在较大差异也会导致平均值的明显波动,但是中值滤波可以通过选择中间值避免这些点的影响。操作:对图像进行核大小为param1×param2的中值滤波。

CV_GAUSSIAN(高斯滤波)虽然它不是最快的,但它是最有用的滤波器。高斯滤波用卷积核与输入图像的每个点进行卷积,将最终计算结果之和作为输出图像的像素值。前两个参数代表滤波器窗口的宽度和高度,可选择的第三个参数代表卷积核的sigma值。如果第三个参数未指定,系统将会根据窗口尺寸通过下面的方差来自动确定高斯核的各个参数:。如果希望高斯核不对称,那么可以引入第四个参数。这样,第三个和第四个参数分别为水平方向和垂直方向的sigma值。如果前两个参数被设为0,那么窗口的尺寸会根据sigma值自动确定。高斯滤波的opencv的实现还为几个常见的核提供了更高的性能优化。具有标准sigma值的3×3,5×5和7×7比其他核具有更优的性能,支持in place方式操作。

CV_BILATERAL(双边滤波)是”边缘保留滤波“的图像分析方法中的一种。将它与高斯平滑对比后会更容易理解。进行高斯滤波的通常原因是真实图像在空间内的像素是缓慢变化的,因此邻近点的像素变化不会很明显。但是随机的两个点就可能形成很大的像素差(即空间上噪声点不是相互联系的)。正式基于这一点,高斯滤波在保留信号的条件下减少噪声。但是这种方法在接近边缘处就无效了,因为边缘处的相邻像素联系不太紧密,因此,高斯滤波会磨平边缘。双边滤波能够提供一种不会将边缘平滑掉的方法,但作为代价,需要更多处理时间。与高斯滤波类似,双边滤波会依据每个像素及其邻域构造一个加权平均值,加权计算包括两个部分,其中第一部分加权方式与高斯平滑中的相同,第二部分也属于高斯加权,但不是基于中心像素点与其他像素点的空间距离之上的加权,而是基于其他像素与中心像素的亮度差值的加权。可以将双边滤波视为高斯平滑,对相似的像素富裕较高的权重,不相似的像素赋予较小权重。这种滤波的典型效果就是使处理过的图像看上去像是一幅源图的水彩画,可用于图像的分割。双边滤波含有两个参数。第一个参数代表空域中所使用的高斯核的宽度,与高斯滤波的sigma参数类似。第二个参数代表颜色域内高斯核的宽度。第二个参数越大,表明带滤波的强度或颜色范围越大(因此不连续的程度越高,以便保留)。具体可以内容可以参考:点击打开链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Delphi11 使用 `delphi-opencv-master` 进行图像处理和计算机视觉操作,需要使用 OpenCV的一些函数和类。在 `delphi-opencv-master` ,这些函数和类都被封装在不同的单元,你可以通过使用 `uses` 语句来引入这些单元。 如果你想使用 `ocv.imgproc_c` 单元函数,可以通过以下步骤实现: 1. 在 Delphi11 打开你的项目,然后在菜单栏选择 `Project` -> `Options` -> `Delphi Compiler` -> `Search Path`,将 `OpenCV` 文件夹所在的路径添加到搜索路径。 2. 在 Delphi11 使用 `uses` 语句引入 `ocv.imgproc_c` 单元,并调用其函数来进行图像处理操作。 例如,以下代码演示了如何使用 `ocv.imgproc_c` 单元的 `cvSmooth` 函数对图像进行平滑处理: ``` uses OpenCV_Core, ocv.imgproc_c, OpenCV_Image; var img: IplImage; begin // 读取图像 img := LoadImage('lena.jpg'); // 将图像转换为灰度图像 cvCvtColor(img, img, CV_RGB2GRAY); // 对图像进行平滑处理 cvSmooth(img, img, CV_GAUSSIAN, 5, 5); // 显示图像 ShowImage('My Image', img); // 等待用户按下任意键 WaitKey; // 释放图像内存 img.Release; end; ``` 这段代码使用了 `OpenCV_Core`、`ocv.imgproc_c` 和 `OpenCV_Image` 三个单元提供的函数和类来进行图像处理和计算机视觉操作。其,使用了 `ocv.imgproc_c` 单元提供的 `cvSmooth` 函数对图像进行平滑处理。你可以根据自己的需要,使用 `delphi-opencv-master` 提供的其他函数和类来进行更加复杂的图像处理和计算机视觉操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值