Opencv3笔记11——形态学滤波(1)

3 形态学滤波(1):腐蚀与膨胀

3.1 形态学概述

数学形态学

建立在格论核拓扑学基础上的图像分析学科,基础的运算包括:二值腐蚀和膨胀,二值开闭运算,骨架抽取,极限腐蚀,击中击不中变换,形态学梯度,Top-hat变换,颗粒分析,流域变换,灰值腐蚀和膨胀,灰值开闭运算,灰值形态学梯度等

膨胀和腐蚀
  • 消除噪声
  • 分割出独立的图像元素,在图像中连接相邻的元素
  • 寻找图像中的明显的极大值或极小值区域
  • 求出图像的梯度

3.2 膨胀

膨胀(dilate)就是求局部的最大值的操作。从数学的角度就是图像与核进行卷积
核可以是任何形状核大小,它拥有一个单独定义出来的参考点,称为锚点,可以把核视为模板或者掩码
数学公式

dst(x,y)=max(x,y):element(x,y)0src(x+x,y+y) d s t ( x , y ) = max ( x ′ , y ′ ) : e l e m e n t ( x ′ , y ′ ) ≠ 0 s r c ( x + x ′ , y + y ′ )

3.3 腐蚀

腐蚀就是求局部最小值的操作。
数学公式:

dst(x,y)=min(x,y):element(x,y)0src(x+x,y+y) d s t ( x , y ) = min ( x ′ , y ′ ) : e l e m e n t ( x ′ , y ′ ) ≠ 0 s r c ( x + x ′ , y + y ′ )

3.4 相关API函数讲解

1 膨胀:dilate函数

函数原型

void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1),int iteration = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue());
  1. InputArray 类型的kernel,膨胀操作的核,当为NULL,表示使用参考点位于3×3的核。使用getStructuringElement配合这个参数使用,返回指定形状和尺寸的结构元素。矩形:MORPH_RECT,交叉形:MORPH_CROSS,椭圆形MORPH_ELLIPSE
  2. Point类型的anchor,锚的位置,表示锚的位置
  3. int类型的iterations,迭代使用erode()函数的次数
  4. int类型的borderType用于推断图像外部像素的某种边界模式
2 腐蚀:erode函数

函数原型

void erode(InputArray src, OutputArray dst, InputArray kernal, Point anchor = Point(-1,-1),int iterations = 1, int borderType = BORDER_CONSTANT,const Scalar & borderValue=morphologyDefualtBorderValue())

3.6 综合示例

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

using namespace cv;
using namespace std;


//-----------------------【全局变量声明部分】-----------------------
//  描述:全局变量声明
//---------------------------------------------------------------

Mat g_srcImage, g_dstImage;     //原始图和效果图
int g_nTrackbarNumer = 0;       //0表示腐蚀,1表示膨胀
int g_nSructElementSize = 3;    //结构元素(内核矩阵)尺寸

//-----------------------【全局函数声明部分】-----------------------
//  描述:全局函数声明
//---------------------------------------------------------------

void Process();                 //腐蚀和膨胀的处理函数
void on_TrackbarNumChange(int, void *); //回调函数
void on_ElementSizeChange(int, void *); //回调函数


int main()
{
    system("color 5E");

    //载入原图
    g_srcImage = imread("1.jpg");
    if (!g_srcImage.data)
    {
        printf("读取srcImage错误~!\n");
        return false;
    }

    //显示原图
    namedWindow("【原始图】");
    imshow("【原始图】", g_srcImage);

    //进行腐蚀和膨胀操作并显示效果图
    namedWindow("【效果图】");

    //获取自定义核
    Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nSructElementSize + 1, 2 * g_nSructElementSize + 1), Point(g_nSructElementSize, g_nSructElementSize));
    erode(g_srcImage, g_dstImage, element);
    imshow("【效果图】", g_dstImage);

    //创建轨迹条
    createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumer, 1, on_TrackbarNumChange);
    createTrackbar("内核尺寸", "【效果图】", &g_nSructElementSize, 21, on_ElementSizeChange);

    //按键q退出
    while (char(waitKey(1)) != 'q') {}
    return 0;
}

//-----------------【Process()函数】------------------------
//  描述:进行自定义的腐蚀核膨胀操作
//---------------------------------------------------------
void Process()
{
    Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nSructElementSize + 1, 2 * g_nSructElementSize + 1), Point(g_nSructElementSize, g_nSructElementSize));

    if (g_nTrackbarNumer == 0)
    {
        erode(g_srcImage, g_dstImage, element);
    }
    else
    {
        dilate(g_srcImage, g_dstImage, element);
    }

    //显示效果图
    imshow("【效果图】", g_dstImage);
}

//------------------------【on_TrackbarNumChange()函数】--------
//  描述:腐蚀核膨胀之间切换开关回调函数
//------------------------------------------------------------

void on_TrackbarNumChange(int, void *)
{
    Process();
}


//------------------------【on_ElementSizeChange()函数】--------
//  描述:腐蚀核膨胀内核改变回调函数
//------------------------------------------------------------

void on_ElementSizeChange(int, void *)
{
    Process();
}

这里写图片描述

这里写图片描述

这里写图片描述


  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV中提供了多种高通滤波和低通滤波的函数,下面分别介绍其中的几种。 1. 高斯滤波(低通滤波) 高斯滤波是一种常用的低通滤波器,可以通过对信号进行平滑处理来去除高频噪声,保留信号中的低频信息。在OpenCV中,可以使用`cv2.GaussianBlur`函数实现高斯滤波。 ```python blurred = cv2.GaussianBlur(image, (ksize, ksize), sigmaX) ``` 其中,`image`为输入图像,`ksize`为滤波器的大小,`sigmaX`为高斯核的标准差。 2. 拉普拉斯滤波(高通滤波) 拉普拉斯滤波是一种常用的高通滤波器,可以通过增强信号的高频成分来增强图像的边缘信息。在OpenCV中,可以使用`cv2.Laplacian`函数实现拉普拉斯滤波。 ```python laplacian = cv2.Laplacian(image, cv2.CV_32F, ksize) ``` 其中,`image`为输入图像,`cv2.CV_32F`表示输出图像的数据类型为32位浮点数,`ksize`为滤波器的大小。 3. Sobel滤波(高通滤波) Sobel滤波也是一种常用的高通滤波器,它可以通过检测图像中的边缘来增强图像的高频成分。在OpenCV中,可以使用`cv2.Sobel`函数实现Sobel滤波。 ```python sobelx = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize) sobely = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize) ``` 其中,`image`为输入图像,`cv2.CV_32F`表示输出图像的数据类型为32位浮点数,`1`和`0`表示对x和y方向进行滤波,`ksize`为滤波器的大小。 总的来说,OpenCV提供了多种高通滤波和低通滤波的函数,具体使用哪种滤波器取决于信号的特性和需要的处理效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值