Opencv3 C++ VS2017 学习笔记 08形态学操作MORPHOLOGY

  • 学习方法总结:
    • 通过视频学习初步了解理论知识点+相关API用法
    • 梳理知识点,从课本中查阅相关数学理论支撑

MORPGHOLOGY


  • 回调函数:主函数调用回调函数,主函数执行完毕后, 执行回调函数
  • createTrackbar
    • 原型:  createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0, void* userdata = 0);
    • 实例:  createTrackbar("Element Size", "dst_image", &element_size, max_size,CallBack_Dem);
    • 参数:滑动控件名称,显示在的窗口名称, 初始化阈值(形参指针,故传地址), 控件刻度最大值, 回调函数
      • 回调函数可以理解为一个函数变量
      • 回调函数原型是void (*TrackbarCallback)(int pos, void* userdata);
        • (*TrackbarCallback)为函数void (int pos,void* userdata)的别名
        • 回调函数是专门为滑动控件而产生的,
        • 第一个形参pos,它表示的是当前滑块所在的位置,它的值是createTrackbar()传给他的,就是初始化阈值
  • getStructuringElement
    • 得到一个结构元素, 如何理解???
      • 可以这么理解,之前定义filter\kernel都是先用Mat声明一个对象,然后元素逐个赋值,比较麻烦,这里opencv封装了一个函数,直接指定参数就可以得到一个同样的东西, 只是封装了一下步骤,没有什么优化
      • 用直接修改参数的方法得到一个kernel\filter
      • getStructruingElement(shape, ksize, anchor=None);
        • kernel形状: MORPH_RECT矩形,  MORPH_CORSS交叉形, MORPH_ELLIPSE椭圆形等等
        • kernel的维度尺寸, (n,n) ,如图的Size(7,7);
        • 锚点, (-1,-1)为默认值,如图圈圈
        • 上述说的什么形状其实是一个矩阵里有效值的排列显示,如图
          • 还可以有其他任意形状
  • 膨胀: 求局部最大值的操作
    • 原理:膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积
      • kernel可以是任何形状,它有一个单独定义的参考点, anchor锚点,kernel可以理解成filter掩膜等
      • 膨胀就是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值anchor.随着卷积核扫描这个图像, 会使图像中的高亮区域逐渐增长
      • 膨胀可以简单理解为将B与A接触的所有背景点合并到A中的过程。
    • API: dilate
      • dilate(src0, dst, structureElement, Point(-1, -1));
      • 参数: 源图像, 结果图, kernel,anchor点(-1,-1为默认)
  • 腐蚀:腐蚀就是求局部最小值的操作。
    • 原理:腐蚀可以理解为B的中心(锚点)沿着A的内边界走了一圈。腐蚀也是对高亮部分而言,A区域之外的部分 < A的高亮像素,所里里面被外面取代。A中能完全包含B的像素被留下来了。
      • 腐蚀可以简单理解为消除物体A所有边界点的过程。
      • 二值时黑底白图时, 可以很容易消除细小的噪点
    • API:erode(src0, dst, structureElement, Point(-1, -1);
  • open开操作
    • 原理: 先腐蚀后膨胀就称为开操作, 具体运用依然要看前景后景颜色
      • 可以去除孤立的小点, 不在图像区域内的小点或者连接桥
    • API
      • morphologyEx(src0, dst, MORPH_OPEN, kernel);
  • close闭操作
    • 原理:先膨胀后腐蚀
      • 填充图像内部的断裂点和盆地点
    • API
      • morphologyEx(src0, dst, MORPH_CLOSE, kernel);
  • 顶帽
    • top hat 是原图像-开图像
    • API
      • morphologyEx(src0, dst, MORPH_TOPHAT, kernel);
  • 黑帽blackhat
    • 是闭图像-源图像
    • API
      • morphologyEx(src0, dst, MORPH_BLACKHAT, kernel);
  • 形态学梯度Morphological Gradient
    • 原理: 膨胀减去腐蚀,又称基本梯度
    • API
      • morphologyEx(src0, dst, MORPH_GRADIENT, kernel);
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>

using namespace std;
using namespace cv; 

Mat src0, src1, dst;
int element_size = 3;
int max_size = 21;
void CallBack_Dem(int, void*);

int main(int argc, char ** argv)
{
	src0 = imread("C:\\Users\\xujin\\Desktop\\test0.JPG");
	if (!src0.data)
	{
		cout << "no image";
		return -1;
	}
	namedWindow("src0_image", WINDOW_AUTOSIZE);
	imshow("src0_image", src0);
	namedWindow("dst_image", WINDOW_AUTOSIZE);
	createTrackbar("Element Size", "dst_image", &element_size, max_size,CallBack_Dem);
	//CallBack_Dem(0, 0);

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	//morphologyEx(src0, dst, MORPH_OPEN, kernel);
	//morphologyEx(src0, dst, MORPH_CLOSE, kernel);
	//morphologyEx(src0, dst,MORPH_BLACKHAT, kernel);
	morphologyEx(src0, dst, MORPH_TOPHAT, kernel);
    //morphologyEx(src0, dst, MORPH_GRADIENT, kernel);

	imshow("dst_image", dst);

	waitKey(0);
	return 0;
}

void CallBack_Dem(int, void*)
{
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	dilate(src0, dst, structureElement, Point(-1, -1));
	//erode(src0, dst, structureElement, Point(-1, -1);
	imshow("dst_image", dst);
	return;
}

猜你喜欢

转载自blog.csdn.net/Mrsherlock_/article/details/104510077