zoukankan      html  css  js  c++  java
  • OpenCV 图象腐蚀形态学操作 全家桶

     图象腐蚀与形态学操作 opencv

    1. 通过调用库函数实现图像的腐蚀、膨胀;

    2. 通过设置结构元素、元素大小、形态学操作类型实现对图象的形态学操作。

    源码(VS2017+OpenCV 4.0)

     1 #include <iostream>
     2 #include <opencv2/opencv.hpp>
     3 #include <opencv2/core.hpp>
     4 #include <opencv2/highgui.hpp>
     5 #include <opencv2/imgproc/imgproc.hpp>
     6 #include <opencv2/imgproc/types_c.h>
     7 using namespace std;
     8 using namespace cv;
     9 
    10 //全局变量
    11 Mat src, res;
    12 int slider = 0;//腐蚀膨胀滑杆
    13 const int slider_max = 30;
    14 int operation = 0;//形态学操作类型
    15 const int operation_max = 4;
    16 int kenl = 0;//内核类型
    17 const int kenl_max = 2;
    18 int kenl_size = 1;//内核大小
    19 const int kenl_size_max = 4;
    20 
    21 //回调函数
    22 void on_trackbar(int pos, void*);
    23 //腐蚀
    24 void getErodeAndDilate(int level, int pattern);
    25 
    26 //腐蚀
    27 void getErodeAndDilate(int level, int pattern)
    28 {
    29     //进行腐蚀/膨胀
    30     if(pattern == 0)
    31         erode(src, res, Mat(), Point(-1, -1), level);
    32     else if(pattern == 1)
    33         dilate(src, res, Mat(), Point(-1, -1), level);
    34 
    35     imshow("处理结果1", res);
    36 }
    37 
    38 //回调函数:腐蚀
    39 void on_trackbar1(int pos, void*)
    40 {
    41     getErodeAndDilate(pos, 0);
    42 }
    43 
    44 //回调函数:膨胀
    45 void on_trackbar2(int pos, void*)
    46 {
    47     getErodeAndDilate(pos, 1);
    48 }
    49 
    50 //回调函数:形态学操作类型
    51 void on_trackbar3(int pos, void*)
    52 {
    53     int op = pos + 2;
    54     //选择内核形状
    55     Mat elemment = getStructuringElement(kenl, Size(2 * kenl_size + 1, 2 * kenl_size + 1));
    56 
    57     morphologyEx(src, res, op, elemment);
    58     imshow("处理结果2", res);
    59 }
    60 
    61 int main()
    62 {    
    63     string file = "D:\trashBox\testIMG\monkey.jpg";
    64     src = imread(file);
    65     if (!src.data)
    66     {
    67         cout << "图片读取失败." << endl;
    68         return 0;
    69     }
    70     namedWindow("处理结果1");
    71     //创建选择腐蚀次数的 trackbar
    72     createTrackbar("腐蚀级数", "处理结果1", &slider, slider_max, on_trackbar1);
    73     //创建选择膨胀次数的 trackbar
    74     createTrackbar("膨胀级数", "处理结果1", &slider, slider_max, on_trackbar2);
    75 
    76     namedWindow("处理结果2");
    77     //创建选择具体操作的 trackbar
    78     createTrackbar("形态学操作
    开运算-0
    闭运算-1
    梯度-2
    TopHat-3
    BlackHat-4", "处理结果2", &operation, operation_max, on_trackbar3);
    79     //创建选择内核形状的 trackbar
    80     createTrackbar("结构元素:
     0: Rect - 1: Cross - 2: Ellipse", "处理结果2", &kenl, kenl_max, on_trackbar3);
    81     //创建选择内核大小的 trackbar
    82     createTrackbar("内核大小:
     2n +1", "处理结果2", &kenl_size, kenl_size_max, on_trackbar3);
    83 
    84     waitKey(0);
    85     return 0;
    86 }

    效果图

    1. 图像腐蚀、膨胀

    2. 形态学操作

    其他组合操作,自己去探索吧,挺有趣的!


    更多opencv中文资料,参考这里哟!

  • 相关阅读:
    又到泰山了
    有趣的数字
    关于Servlet/JSP里"/"的用法
    [WS]一个简单的WSDL文档(下)
    30天敏捷结果(28):撰写你的个人使命
    推荐:敏捷个人应该订阅的博客
    30天敏捷结果(27):做些有重要意义的事
    30天敏捷结果(29):找到适合你发展的环境
    COM+的配置:痛并快乐着
    30天敏捷结果(22):设计你的一天
  • 原文地址:https://www.cnblogs.com/yocichen/p/10870451.html
Copyright © 2011-2022 走看看