opencv视觉学习温习(五)

一:更高级的形态学处理

1:开运算(Opening Operation)

其实就是先腐蚀后膨胀的过程。

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

 

2: 闭运算(Closing Operation)

先膨胀后腐蚀的过程称为闭运算(Closing Operation)。

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

 

3:形态学梯度(MorphologicalGradient)

膨胀图与腐蚀图之差。

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

 

4:顶帽(Top Hat)

为原图像与“开运算“的结果图之差。

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
 

5:黑帽(Black Hat)

”闭运算“的结果图与原图像之差。

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。所以,黑帽运算用来分离比邻近点暗一些的斑块。

二:morphologyEx函数讲解

C++: 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()函数得到更详细的解释。
     

代码示例:

基本都一样,只是morphologyEx函数的第三个参数不同而已,补充,也可以用morphologyEx函数表示腐蚀和膨胀,也是变化第三个参数,腐蚀:MORPH_ERODE,膨胀:MORPH_DILATE

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
 
//-----------------------------------【命名空间声明部分】---------------------------------------
//            描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
//            描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main( )
{
       //载入原始图  
       Mat image = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
       //创建窗口  
       namedWindow("【原始图】开运算"); 
       namedWindow("【效果图】开运算"); 
       //显示原始图 
       imshow("【原始图】开运算", image); 
       //定义核
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 
       //进行形态学操作
       morphologyEx(image,image, MORPH_OPEN, element);
       //显示效果图 
       imshow("【效果图】开运算", image); 
 
       waitKey(0); 
 
       return 0; 
}

新任opencv开始六件套:

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#icludee<iostream>

using namespace std;    
using namespace cv;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值