【OpenCV】形态学处理

形态学

  形态学处理包括:开运算、闭运算、形态学梯度、顶帽、黑帽、击中或击不中变换。通过函数 cv::morphologyEx实现。

  开运算Opening

  dst=open(src,element)=dilate(erode(src,element))



  闭运算Closing

  dst=close(src,element)=erode(dilate(src,element))



  形态学梯度Morphological Gradient

  dst=morphgrad(src,element)=dilate(src,element)−erode(src,element)



  顶帽Top Hat

  dst=tophat(src,element)=src−open(src,element)



  黑帽Black Hat

  dst=blackhat(src,element)=close(src,element)−src



  击中或击不中变换Hit-or-Miss




代码示例

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;

Mat src, dst;

int morph_elem = 0;
int morph_size = 0;
int morph_operator = 0;
int max_operator = 4;
int max_elem = 2;
int max_kernel_size = 21;
char* window_name = "Morphology";

void Morphology_Operations(int, void*);

int main(int argc, char** argv)
{
    String imageName("../data/baboon.jpg");
    src = imread(imageName, IMREAD_COLOR);
    if (src.empty()) { return -1; }

    namedWindow(window_name, WINDOW_AUTOSIZE);

    createTrackbar("Operator:\n 0:Opening 1:Closing  \n 2:Gradient 3:Top Hat \n 4:Black Hat", window_name, 
        &morph_operator, max_operator, Morphology_Operations);
    createTrackbar("Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,
        &morph_elem, max_elem, Morphology_Operations);
    createTrackbar("Kernel size:\n 2n +1", window_name,
        &morph_size, max_kernel_size, Morphology_Operations);

    Morphology_Operations(0, 0);

    waitKey(0);
    return 0;
}

void Morphology_Operations(int, void*)
{
    int operation = morph_operator + 2;                             // 见开头的表,MORPH_X : 2,3,4,5 and 6
    Mat element = getStructuringElement(morph_elem, 
        Size(2 * morph_size + 1, 2 * morph_size + 1), Point(morph_size, morph_size));

    morphologyEx(src, dst, operation, element);                     // 形态学处理
    imshow(window_name, dst);
}


运行结果

原图像

开运算、闭运算


形态学梯度


顶帽、黑帽


击中或击不中

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;

int main() 
{
    Mat input_image = (Mat_<uchar>(8, 8) <<
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 255, 255, 255, 0, 0, 0, 255,
        0, 255, 255, 255, 0, 0, 0, 0,
        0, 255, 255, 255, 0, 255, 0, 0,
        0, 0, 255, 0, 0, 0, 0, 0,
        0, 0, 255, 0, 0, 255, 255, 0,
        0, 255, 0, 255, 0, 0, 255, 0,
        0, 255, 255, 255, 0, 0, 0, 0);

    Mat kernel = (Mat_<int>(3, 3) <<
        0, 1, 0,
        1, -1, 1,
        0, 1, 0);

    Mat output_image;
    morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);             // 形态学处理:hit or miss

    const int rate = 50;                                                        // 放大显示
    kernel = (kernel + 1) * 127;
    kernel.convertTo(kernel, CV_8U);

    resize(input_image, input_image, Size(), rate, rate, INTER_NEAREST);        // 原图像
    imshow("Original", input_image);    
    resize(kernel, kernel, Size(), rate, rate, INTER_NEAREST);                  // 掩模
    imshow("kernel", kernel);
    resize(output_image, output_image, Size(), rate, rate, INTER_NEAREST);      // 击中或击不中
    imshow("Hit or Miss", output_image);

    waitKey(0);
    return 0;
}


运行结果


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值