Opencv学习(二)——图像处理

本文内容包含于imgproc组件

线性滤波

一、方框滤波

方框滤波:被封装在一个名为boxblur的函数中,即boxblur函数的作用是使用方框滤波器来模糊一张图片。函数原型为:

void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor =
Point(-1, -1),
boolnormalize = true,
int borderType = BORDER_DEFAULT
);

参数详解

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可
  • 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
  • 第四个参数,Size类型的ksize,内核的大小(Size(w,h),w 为像素宽度, h为像素高度)
  • 第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)
  • 第六个参数,bool类型的normalize,默认值为true,表示内核是否被其区域归一化(normalized)了
  • 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT

二、均值滤波

均值滤波,是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。函数原型为:(参数含义与方框滤波相同)

void blur(
InputArray src,
OutputArraydst,
Size ksize,
Point anchor =
Point(-1,-1),
int borderType = BORDER_DEFAULT
);


三、高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。函数原型为:(除第四五个参数不同之外其余与方框滤波相同,因此只详细说明第四五个参数)

void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
);

参数详解

  • 第四个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。

  • 第五个参数,double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来


非线性滤波

一、中值滤波

中值滤波(Median filter)是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节。

void medianBlur(
InputArray src,
OutputArray dst,
int ksize
);

参数详解

  • 第三个参数:滤波孔径,必须是大于1的奇数

二、双边滤波

​ 结合图像中的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到了保边去噪的目标。
双边滤波是基于空间分布的高斯滤波函数,所以在边缘附近,离得较远的像素不会对边缘上的像素值影响太多。但是只能对低频信息进行较好地滤波。

void bilateralFilter(
InputArray src,
OutputArray dst,
int d ,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
);

参数详解

  • 第一个参数:int类型的d表示在滤波过程中每个像素邻域的直径
  • 第二个参数:double 类型的sigmaColor,颜色空间滤波器的sigma值,越大表示像素邻域内的越宽广的颜色会被混合在一起
  • 第三个参数:double 类型的sigmaSpace 坐标空间中滤波器的sigma值,坐标空间的标注方差,数值越大,意味着越远的像素相互影响。

形态学滤波(1)

腐蚀与膨胀

​ 腐蚀和膨胀是针对白色部分(高亮部分)而言的。

​ 膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。

​ 膨胀就是求局部最大值的操作,从图像直观看来,就是将图像光亮部分放大,黑暗部分缩小。

膨胀:

void dilate(
inputArray,
outputArray,
kernel,
Point anchor=Point(-1,-1),
iterations=1,
borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);

腐蚀:

void erode(
inputArray,
outputArray,
kernel,
Point anchor=Point(-1,-1),
iterations=1,
borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);

参数详解:

  • 第一个参数:src,输入图像,图像深度应为CV_8U、16U、16S、32F、64F其中之一
  • 第二个参数:dst,输出图像
  • 第三个参数:kernel,当为NULL时,使用参考点位于中心的3x3的核。一般使用函数getStructuringElement配合这个参数的使用,getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。其中getStructuringElement函数的第一个参数表示内核的形状,
    (1)矩形:MORPH_RECT
    (2)交叉形:MORPH_CROSS
    (3)椭圆形:MORPH_ELLIPSE
    getStructuringElement函数的第二个和第三个参数分别是内核的尺寸和锚点的位置。一般在调用erode和dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值
  • 第四个参数:Point类型的anchor,默认值(-1,-1)表示锚点中心
  • 第五个参数:迭代使用dilate()函数的次数,默认为1.
  • 第六个参数:用于推断图像外部像素的某种边界模式
  • 第七个参数:一般不用管

getStructuringElement使用方法:

//结构元素(内核矩阵)的尺寸
int g_nKernelSize=3;
//获得自定义核
Mat element=getStructuringElement(MORPH_RECT, Size(g_nKernelSize*2+1,g_nKernelSize*2+1),Point(g_nKernelSize,g_nKernelSize));

形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽

一、开运算

​ 开运算,其实就是先腐蚀后膨胀的过程。

​ 开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。

二、闭运算

​ 先膨胀后腐蚀的过程称为闭运算

​ 闭运算能够排除小型黑洞(黑色区域)。

三、形态学梯度

​ 形态学梯度为膨胀图与腐蚀图之差

​ 对二值图像进行这一操作可以将团块的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。

四、礼帽

​ 顶帽运算又常常被译为“礼帽”运算。为原图像开运算的结果图之差

​ 因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。

​ 顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

五、黑帽

​ 黑帽运算为闭运算的结果图与原图像之差

​ 黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。

​ 所以,黑帽运算用来分离比邻近点暗一些的斑块


核心API函数:morphologyEx()

void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue()
);

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
  • 第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
    MORPH_OPEN – 开运算(Opening operation)
    MORPH_CLOSE – 闭运算(Closing operation)
    MORPH_GRADIENT -形态学梯度(Morphological gradient)
    MORPH_TOPHAT - “顶帽”(“Top hat”)
    MORPH_BLACKHAT - “黑帽”(“Black hat“)
  • 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
  • 第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
  • 第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
  • 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
  • 第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

其中的这些操作都可以进行就地操作。且对于多通道图像,每一个通道都是单独进行操作。


图片尺寸缩放

一、尺寸调整——resize()

​ resize函数可以将源图像精确地转化为指定尺寸的目标图像。

​ 要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。

​ 第一种,规定好你要图片的尺寸,就是你填入你要的图片的长和高。可以是设定好ROI区域,填充进去。

​ 第二种,填入你要缩小或者放大的比率。

void resize(
InputArray src,
OutputArray dst,
Size dsize,
double fx=0,
double fy=0,
int interpolation=INTER_LINEAR
);

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
  • 第二个参数,OutputArray类型的dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸,或者由src.size()计算出来。
  • 第三个参数,Size类型的dsize,输出图像的大小;如果它等于零,由下式进行计算:
    dsize=Size(round(fxsrc.cols),round(fysrc.raws))
    其中,dsize,fx,fy都不能为0。
  • 第四个参数,double类型的fx,沿水平轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
    (double)dsize.width/src.cols
  • 第五个参数,double类型的fy,沿垂直轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
    (double)dsize.heigth/src.raws
  • 第六个参数,int类型的interpolation,用于指定插值方式,默认为INTER_LINEAR(线性插值)。
    可选的插值方式如下:
    INTER_NEAREST - 最近邻插值
    INTER_LINEAR - 线性插值(默认值)
    INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
    INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
    INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)

阈(yu)值化

​ OpenCV中图像阈值处理有两个函数,cvThreshold和cvAdaptiveThreshold。进行图像的二值化处理。

double cv::threshold(
cv::InputArray src,
cv::OutputArray dst,
double thresh,
double maxValue,
int thresholdType
);

  • src_gray: 输入的灰度图像的地址。
  • dst: 输出图像的地址。
  • threshold_value: 进行阈值操作时阈值的大小。
  • max_BINARY_value: 设定的最大灰度值(该参数运用在二进制与反二进制阈值操作中)。
  • threshold_type: 阈值的类型。从上面提到的5种中选择出的结果。

void cv::adaptiveThreshold(
cv::InputArray src,
cv::OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType
int blockSize,
double C
);

  • 第四个参数有两种取值:ADAPTIVE_THRESH_MEAN_C和ADAPTIVE_THRESH_GAUSSIAN_C,分别表示对区域内像素采用均值处理和高斯加权处理。
  • 第五个参数也和cvThreshold中的一样。
  • 第六个参数表示区域大小。
  • 最后一个参数是一个定值。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值