6.4.9形态学综合示例:形态学滤波(腐蚀与膨胀+开闭运算+顶帽黑帽)

#include <opencv2/opencv.hpp>
#include<iostream>
//#include <math.h>
using namespace cv;
using namespace std;

/*-------------------------------------------------------------------全局变量声明-------------------------------------------------------------------*/
Mat src, dst, dst1, dst2;
int openclose_number = 9;
int erodedilate_number = 9;
int topblackhat_number = 9;
int slidermax_number = 10;
int elementshape = MORPH_RECT;//初始化为矩形

/*-------------------------------------------------------------------全局函数声明-------------------------------------------------------------------*/
void openclose(int, void *);
void erodedilate(int, void *);
void topblackhat(int, void *);

int main()
{
    src = imread("1.jpg");
    if (!src.data)
    {
        cout << "Could not load the image!" << endl;
        return 0;
    }
    namedWindow("【原始图】");
    imshow("【原始图】",src);

    namedWindow("【开/闭运算】");
    namedWindow("【腐蚀/膨胀】"); 
    namedWindow("【顶帽/黑帽】");

    /*-------------------------------------------------------------------创建进度条函数-------------------------------------------------------------------*/
    createTrackbar("内核值", "【开/闭运算】", &openclose_number, slidermax_number * 2, openclose);//调试了好大半天。此窗口名 "【开/闭运算】"
                                                                                                                                             //与namedWindow( "【开/闭运算】")空格隔了一个,
                                                                                                                                             //一定要注意一致,要不然进度条就不会在窗口中显示出来
    createTrackbar("内核值", "【腐蚀/膨胀】", &erodedilate_number, slidermax_number*2, erodedilate); 


    createTrackbar("内核值", "【顶帽/黑帽】", &topblackhat_number, slidermax_number*2, topblackhat);



    while (1)
    {
        int c;

        /*-------------------------------------------------------------------调用回调函数-------------------------------------------------------------------*/
        openclose(openclose_number, 0);
        topblackhat(topblackhat_number, 0);
        erodedilate(erodedilate_number, 0);

        c=waitKey(0);
        //按下'q'键或者ESC键程序退出
        if ((char)c == 'q' || (char)c == 27)
            break;
        if ((char)c == 49)//键盘阿拉伯数字1的ASSCII码
            elementshape = MORPH_ELLIPSE;
           else if((char)c==50)
               elementshape = MORPH_RECT;
           else if ((char)c == 51)
               elementshape = MORPH_CROSS;
        //按下空格键,在矩形、椭圆、十字形结构元素中循环
           else if ((char)c ==' ')
               elementshape =( elementshape+1)%3;


    }
    return 0;
}


/*-------------------------------------------------------------------【开/闭运算】回调函数-------------------------------------------------------------------*/
void openclose(int, void *)
{
    int offset = openclose_number - slidermax_number;    //偏移量计算
    int absolute = offset > 0 ? offset : -offset;                //取绝对值
    Mat element = getStructuringElement(elementshape,Size(absolute*2+1, absolute * 2 +1));
    if (offset < 0)

        morphologyEx(src, dst, MORPH_OPEN, element);//morphologyEx(src,dst,CV_MOP_OPEN,element);为Opencv2版本
    else
        morphologyEx(src, dst, MORPH_CLOSE, element);

    imshow("【开/闭运算】",dst);

}


/*-------------------------------------------------------------------【腐蚀/膨胀】回调函数-------------------------------------------------------------------*/
void erodedilate(int, void *)
{
    int offset = erodedilate_number - slidermax_number;//偏移量计算
    int absolute = offset > 0 ? offset : -offset;//取绝对值
    Mat element = getStructuringElement(elementshape, Size(absolute * 2 + 1, absolute * 2 + 1),Point(absolute, absolute));
    if (offset < 0)
        erode(src, dst,  element);
    else
        dilate(src, dst,  element);
    imshow("【腐蚀/膨胀】", dst);
}


/*-------------------------------------------------------------------【顶帽/黑帽】回调函数-------------------------------------------------------------------*/
void topblackhat(int, void *)
{
    int offset = topblackhat_number - slidermax_number;//偏移量计算
    int absolute = offset > 0 ? offset : -offset;//取绝对值
    Mat element = getStructuringElement(elementshape, Size(absolute * 2 + 1, absolute * 2 + 1), Point(absolute, absolute));
    if (offset < 0)
        morphologyEx(src, dst, MORPH_TOPHAT, element);
    else
        morphologyEx(src, dst, MORPH_BLACKHAT, element);
    imshow("【顶帽/黑帽】", dst);

}

这里写图片描述这里写图片描述这里写图片描述这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值