zoukankan      html  css  js  c++  java
  • opencv-形态处理

    开运算 (Opening)

    • 原理摘自:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html

    • 开运算是通过先对图像腐蚀再膨胀实现的。

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

    • 可以排除小团块物体(如果物体较背景明亮)

    • 请看以下。左图是原图像,右图是採用开运算转换之后的结果图。

      观察发现字母拐弯处的白色空间消失。



    闭运算(Closing)

    • 闭运算是通过先对图像膨胀再腐蚀实现的。

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

    • 可以排除小型黑洞(黑色区域)。


    形态梯度(Morphological Gradient)

    • 膨胀图与腐蚀图之差

      dst = morph_{grad}( 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


    • 代码:
    • // ConsoleApplication3_6_23.cpp : Defines the entry point for the console application.
      //
      
      #include "stdafx.h"
      #include<opencv2/opencv.hpp>
      #include<iostream>
      using namespace std;
      using namespace cv;
      
      Mat src,dst;
      
      int pro_elem = 0;
      int pro_size = 0;
      int pro_operator = 0;
      
      const int max_elem = 2;
      const int max_size = 21;
      const int max_operator = 4;
      
      char* windowName = "Demo";
      void Image_pro(int,void*);
      
      int _tmain(int argc, _TCHAR* argv[])
      {
      	src = imread("hwl.jpg");
      	if(!src.data)
      		return -1;
      
      	namedWindow(windowName,CV_WINDOW_AUTOSIZE);
      
      	createTrackbar("Operator:
       0:opening-1:closing-2:gradient-3:Top Hat-4:	Black Hat",
      		windowName,&pro_operator,max_operator,Image_pro);
      
      	createTrackbar("Element:
       0:Rect-1:Cross-2:Ellipse",
      		windowName,&pro_elem,max_elem,Image_pro);
      
      	createTrackbar("Kernel size:
       2n+1",
      		windowName,&pro_size,max_size,Image_pro);
      	
      	Image_pro(0,0);
      	waitKey(0);
      	return 0;
      }
      
      void Image_pro(int,void*)
      {
      	int operation = pro_operator + 2;
      	Mat  element = getStructuringElement(pro_elem,Size(2*pro_size+1,2*pro_size+1),
      		Point(pro_size,pro_size));
      	morphologyEx(src,dst,operation,element);
      	imshow(windowName,dst);
      }
      


    版权声明:本文博主原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    宇宙纪录片
    IIC总线协议和时序
    使用MATLAB设计FIR滤波器
    rcosfir函数的用法
    ov5640介绍
    FPGA学习之路——PLL的使用
    输入信号与时钟变化一致时,非阻塞方式内部信号变化分析
    使用ChipScope Pro调试硬件
    FPGA烧完程序之后,检测不到网口的
    怎样才能使用ChipScope 加入被优化掉的信号
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4760002.html
Copyright © 2011-2022 走看看