OpenCV笔记(一)---阈值 、模糊滤波、膨胀与腐蚀

阈值二值化 cv:threshold

输入为灰度图像

threshold(src, dst, 127, 255, THRESH_BINARY);  
reshold(src                  //输入  
        dst                 //输出  
        thresh           //阈值  
        maxValue     //二值化最大值  
         thresholdType //阈值类型  CV_THRESH_OTSU
         )

自适应阈值   cv::adaptiveThreshold

adaptiveThreshold(gray, dst2, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 5,8); //自适应阈值,高斯分布 5*5. 阈值为高斯均值-8  
adaptiveThreshold(  
    InputArry     src,  
    OutputArrt    dst,  
    double        maxValue        //设置最大值  
    int           adaptiveMethod  //均值或高斯取值  
                                  //ADAPTIVE_THRESH_MEAN_C  
                                  //ADAPTIVE_THRESH_GAUSSIAN_C  
    int           thresholdType   //阈值类型  
   int           blockSize       //方框边长 为奇数  
   double        C               //阈值未取高斯阈值-C  
} 

 平滑与滤波

简单模糊 blur

	blur(mat, img_blur, Size(11, 11), Point(-1, -1));//均值模糊
	void blur(
		InpurArry  src,
		OutputArry dst,
		Size       Ksize    //模糊盒装块大小
		Point      anchor   //核的位置一般未Point(-1,-1),表示居中
		int        borderType //一般不输入

	)

高斯模糊 GaussianBlur

	GaussianBlur(mat, img_gar, Size(11, 11), 11, 11);
	void GaussianBlur(
		InpurArry  src,
		OutputArry dst,
		Size       Ksize    //模糊盒装块大小
		double     sigmaX   //X方向方差
		double     sigmaY   //Y方向方差
		int        borderType //没用

	)

 中值滤波器(去除黑白点)

medianBlur(src, dst, 11);
void medianBlur(InputArray src, OutputArray dst, int ksize);//ksize方块边长

双边滤波器(边缘保留) bilateralFilter 

边界在,细节被滤去

    bilateralFilter(src, dst, 15, 150, 3);
	//15计算半径, 150 决定多少差值之内的像素会被计算,3如果d大于0则无效,否则用他来计算d的值
	//边缘保留的滤波算法
	void bilateralFilter(InputArray src, OutputArray dst, 
		int d,               //半径       
		double sigmaColor,   //颜色权重函数的宽度参数,差值之内的被计算
		double sigmaSpace,   //空间权函数的宽度参数
		int borderType = BORDER_DEFAULT
	);

任意线性滤波器做卷积

每一个图元与算子进行卷积来达到滤波的目的

Robert算子:45度方向求导数

Sobel算子:x y方向求导数

拉普拉斯算子:全导数

卷积函数:

void filter2D( InputArray src, OutputArray dst, 
                            int ddepth,       //深度,不知道的写 -1
                            InputArray kernel,  //卷积算子
                            Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );

索贝尔函数:

Sobel( InputArray src, OutputArray dst, int ddepth,
       int dx, int dy, //求导顺序取值0 1 2,0表示不求导
       int ksize = 3,
       double scale = 1, double delta = 0,
       int borderType = BORDER_DEFAULT );

拉普拉斯变换函数 (二次求导取出边缘)

void Laplacian( InputArray src, OutputArray dst, int ddepth,
                int ksize = 1, double scale = 1, double delta = 0,
                int borderType = BORDER_DEFAULT );

图像形态学

膨胀与腐蚀

目标像素点的值替换为卷积核覆盖区域 的局部最大(小)值

先获得核 getStructuringElement

Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
//ship MORPH_RECT(一般是)(长方形) \MORPH_CROSS\MORPH_ELLIPSE
//esize 如Size(s*s) s为奇数,指的是卷积核覆盖区域大小
//锚点默认Point(-1, -1))指中心

膨胀 dilate

dilate(src, dst, structure, Point(-1, -1));
void dilate(InputArray src, OutputArray dst, //输入输出
		    InputArray kernel,                       //输入核
		    Point anchor = Point(-1, -1), int iterations = 1,
		    int borderType = BORDER_CONSTANT,        //暂时没用,不用输入
		    const Scalar& borderValue = morphologyDefaultBorderValue() //暂时没用,不用输入
);

腐蚀 erode

erode(src, dst, structure, Point(-1, -1));//同膨胀
void erode( InputArray src, OutputArray dst, InputArray kernel,
            Point anchor = Point(-1,-1), int iterations = 1,
            int borderType = BORDER_CONSTANT,
            const Scalar& borderValue = morphologyDefaultBorderValue() );

形态学操作:

CV_MOP_OPEN开操作先腐蚀,后膨胀,可以去掉小的对象。
CV_MOP_CLOSE闭操作先膨胀,后腐蚀,可以填充小的洞。
CV_MOP_GRADIENT形态学梯度膨胀减去腐蚀 gradient(src)=dilate(src)-erode(src),高亮图中变化剧烈的部分
CV_MOP_TOPHAT顶帽原图像与开操作图像的差值,明亮的局部(黑线条的背光)被提取出来
CV_MOP_BLACKHAT黑帽 闭图像与原图像的差值,暗洞(黑线条)被提取出来
void morphologyEx( InputArray src, OutputArray dst,
                   int op,           //选择形态学操作,如开操作 CV_MOP_OPEN ,闭操作CV_MOP_CLOSE
                   InputArray kernel,//输入结构元素,图元
                   Point anchor = Point(-1,-1), //位置,默认中心
                   int iterations = 1,          //迭代次数,默认1
                   int borderType = BORDER_CONSTANT,
                   const Scalar& borderValue = morphologyDefaultBorderValue() );

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值