OpenCV学习之形态学操作

本文介绍了一个使用OpenCV进行形态学图像处理的C++程序实例,包括开运算、闭运算、腐蚀和膨胀等基本操作,并提供了交互式的参数调整功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//形态学操作
#include "cv.h"
#include "highgui.h"
IplImage* src = 0;
IplImage* dst = 0;
IplConvKernel* element = 0;
int element_shape = CV_SHAPE_RECT;
int max_iters = 10;
int open_close_pos = 0;
int erode_dilate_pos = 0;
void OpenClose(int pos) {
    int n = open_close_pos - max_iters;
    int an = n > 0 ? n : -n;
    element = cvCreateStructuringElementEx(an * 2 + 1, an * 2 + 1, an, an, element_shape, 0);
    if (n < 0) {
        cvErode(src, dst, element, 1);
        cvDilate(dst, dst, element, 1);
    }
    else {
        cvDilate(src, dst, element, 1);
        cvErode(dst, dst, element, 1);
    }
    cvReleaseStructuringElement(&element);
    cvShowImage("Open/Close", dst);
}
void ErodeDilate(int pos) {
    int n = erode_dilate_pos - max_iters;
    int an = n > 0 ? n : -n;
    element = cvCreateStructuringElementEx(an * 2 + 1, an * 2 + 1, an, an, element_shape, 0);
    if (n > 0) {
        cvErode(src, dst, element, 1);
    }
    else {
        cvDilate(src, dst, element, 1);
    }
    cvReleaseStructuringElement(&element);
    cvShowImage("Erode/Dilate", dst);
}
int main(int argc, char** argv) {
    src = cvLoadImage("Lena.tif", 1);
    printf("Hot Key:\n"
        "\tEsc - quit\n"
        "\tr - use rectangle structuring element\n"
        "\te - use elloptic structuring element\n"
        "\tc - use cross - shaped structuring element\n"
        "\tENTER - loop through all the options\n");
    dst = cvCloneImage(src);
    cvNamedWindow("Open/Close", 1);
    cvNamedWindow("Erode/Dilate");
    open_close_pos = erode_dilate_pos = max_iters;
    cvCreateTrackbar("iterations", "Open/Close", &open_close_pos, max_iters * 2 + 1, OpenClose);
    cvCreateTrackbar("iterations", "Erode/Dilate", &erode_dilate_pos, max_iters * 2 + 1, ErodeDilate);
    while (1) {
        int c;
        OpenClose(open_close_pos);
        ErodeDilate(erode_dilate_pos);
        c = cvWaitKey(0);
        if (c == 27)
            break;
        else if (c == 'r')
            element_shape = CV_SHAPE_RECT;
        else if (c == 'e')
            element_shape = CV_SHAPE_ELLIPSE;
        else if (c == 'c')
            element_shape = CV_SHAPE_CROSS;
        else if (c == '\r')
            element_shape = (element_shape + 1) % 3;
    }
    cvReleaseImage(&src);
    cvReleaseImage(&dst);
    cvDestroyWindow("Open/Close");
    cvDestroyWindow("Erode/Dilate");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值