1、图像的形态学操作

包括图像的腐蚀膨胀形态学梯度、顶帽、黑帽、分支主题、结构元素等操作。

具体概念参考:(41条消息) 图像处理-形态学处理_Good@dz的博客-CSDN博客_图像处理 形态学

1.1、膨胀

用3×3的核去扫描二值图像,当核与图像中的前景像素(值为1的像素)有交集时,则将二值图像中对应的卷积核中心位置的像素值置为1。

拓展:卷积核可以为任意形状(除1×1),且重置点可以选用卷积核中的任意位置,有‘交集‘就对重置点位置像素置1。

1.2、腐蚀

用3×3的核去扫描二值图像,仅当核的与前景像素有完全重合区域时,将二值图像中对应的卷积核中心位置的像素保留,其余情况下,将中心位置的像素置0。

拓展:卷积核可以为任意形状,且重置点可以选用卷积核中的任意位置。

膨胀与腐蚀的区别:膨胀只要有交集就触发,而腐蚀必须是重置点与前景像素有完全重合区域才保留

1.3、开与闭

开:腐蚀再膨胀,去除微小干扰块。

闭:膨胀再腐蚀,填充闭合区域。

1.4、形态学梯度

       基本梯度:膨胀图 - 腐蚀图

    内梯度:原图 - 腐蚀图

    外梯度:膨胀图 - 原图

这里opencv只能直接实现基本梯度,在使用API:morphologyEx  时,调用MORPH_GRADIENT方法即可。

内梯度、外梯度没有直接的API,一般通过已有API间接实现

1.5、其余形态学操作

顶帽:原图 - 开操作后的图

黑帽:闭操作后的图 - 原图

        注:顶帽和黑帽操作用于获取图像中的微小细节

击中击不中: 通过特定模板,仅当输入的图像中,有与模板一模一样的块时,被击中的输入图像区域才会被保留。

使用API:morphologyEx  时,分别调用MORPH_TOPHAT 、MORPH_BLACKHAT、MORPH_HITMISS方法即可实现。

2、API

    定义核形状


Mat cv::getStructuringElement   (   int     shape,Size  ksize,Point     anchor = Point(-1,-1) )        

shape——核的形状,可以定义矩形,十字形等形状,如下:


ksize——大小
anchor ——锚定点,即前文中的重置点。

 注:当设计到保留横线或竖线时,可以将核定义成1×n或者n×1的形状,从而去除其余形状的线。

Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 1), Point(-1, -1));

        腐蚀:

void cv::erode   (   InputArray  src,OutputArray     dst,InputArray  kernel,Point    anchor = Point(-1,-1),int  iterations = 1,int     borderType = BORDER_CONSTANT,const Scalar &    borderValue = morphologyDefaultBorderValue() ) 

 膨胀:


void cv::dilate (   InputArray  src,OutputArray     dst,InputArray  kernel,Point    anchor = Point(-1,-1),int  iterations = 1,int     borderType = BORDER_CONSTANT,const Scalar &    borderValue = morphologyDefaultBorderValue() ) 

    通用:

void cv::morphologyEx    (   InputArray  src,OutputArray     dst,int     op,InputArray   kernel,Point    anchor = Point(-1,-1),int  iterations = 1,int     borderType = BORDER_CONSTANT,const Scalar &    borderValue = morphologyDefaultBorderValue() ) 

op ——形态学操作选用,如下:


iterations——重复腐蚀和膨胀的次数。
borderType ——边界类型
borderValue ——Border value in case of a constant border. The default value has a special meaning.

3、代码

3.1、腐蚀膨胀代码:

void erode_dilate(Mat& image)
{Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);Mat binary;threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);namedWindow("THRESH_OTSU", WINDOW_FREERATIO);imshow("THRESH_OTSU", binary);Mat dst1, dst2;//定义核int kernel_size = 5;Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));//腐蚀erode(binary, dst1, kernel);namedWindow("erode", WINDOW_FREERATIO);imshow("erode", dst1);//膨胀dilate(binary, dst2, kernel);namedWindow("dilate", WINDOW_FREERATIO);imshow("dilate", dst2);
}

3.2、开闭:

void QuickDemo::open_close(Mat& image)
{Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);Mat binary;threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);namedWindow("THRESH_OTSU", WINDOW_FREERATIO);imshow("THRESH_OTSU", binary);Mat dst1, dst2;//定义核int kernel_size = 5;Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));//开morphologyEx(binary, dst1, MORPH_OPEN, kernel, Point(-1, -1), 1, 0);namedWindow("MORPH_OPEN", WINDOW_FREERATIO);imshow("MORPH_OPEN", dst1);//闭、morphologyEx(binary, dst2, MORPH_CLOSE, kernel, Point(-1, -1), 1, 0);namedWindow("MORPH_CLOSE", WINDOW_FREERATIO);imshow("MORPH_CLOSE", dst2);
}

3.3、形态学梯度

注:在边缘提取应用中,梯度边缘后,会再进行二值化,从而获取更好的边缘图像。

void QuickDemo::shape_gradient(Mat& image)
{Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);Mat g1, g2, g3;Mat dst1, dst2;int kernel_size = 7;Mat kernel = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));//基本梯度morphologyEx(gray, g1, MORPH_GRADIENT, kernel, Point(-1, -1), 1, 0);//膨胀morphologyEx(gray, dst1, MORPH_DILATE, kernel, Point(-1, -1), 1, 0);//腐蚀morphologyEx(gray, dst2, MORPH_ERODE, kernel, Point(-1, -1), 1, 0);//外梯度subtract(dst1, gray, g2);//内梯度subtract(gray, dst2, g3);namedWindow("基本梯度", WINDOW_FREERATIO);imshow("基本梯度", g1);namedWindow("外梯度", WINDOW_FREERATIO);imshow("外梯度", g2);namedWindow("内梯度", WINDOW_FREERATIO);imshow("内梯度", g3);//最后再进行二值化,获取更好的边缘图像,选用基本梯度示例Mat binary;threshold(g1, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);namedWindow("二值化", WINDOW_FREERATIO);imshow("二值化", binary);
}

3.4、其余形态学操作(顶帽、黑帽、击中击不中)

void QuickDemo::other_method(Mat& image)
{Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);Mat binary;threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);namedWindow("二值化", WINDOW_FREERATIO);imshow("二值化", binary);Mat dst1, dst2, dst3;int kernel_size = 5;Mat kernel_1 = getStructuringElement(MORPH_RECT, Size(kernel_size, kernel_size), Point(-1, -1));//顶帽morphologyEx(binary, dst1, MORPH_TOPHAT, kernel_1, Point(-1, -1), 1, 0);namedWindow("顶帽", WINDOW_FREERATIO);imshow("顶帽", dst1);//黑帽morphologyEx(binary, dst2, MORPH_BLACKHAT, kernel_1, Point(-1, -1), 1, 0);namedWindow("黑帽", WINDOW_FREERATIO);imshow("黑帽", dst2);//击中击不中Mat kernel_2 = getStructuringElement(MORPH_CROSS, Size(kernel_size, kernel_size), Point(-1, -1));morphologyEx(binary, dst3, MORPH_HITMISS, kernel_2, Point(-1, -1), 1, 0);namedWindow("击中击不中", WINDOW_FREERATIO);imshow("击中击不中", dst3);
}

opencv c++ 图像形态学操作相关推荐

  1. OpenCV中图像形态学操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 图像形态学是图像处理的分支学科,在二值图像处理 ...

  2. 2020.11.01 使用OpenCV进行图像形态学操作(开、闭、梯度)【OpenCV C++】

    进行基础的图像形态学操作练习 (开操作.闭操作.梯度.顶帽.黑帽操作) 源代码: // #include <opencv2/opencv.hpp> #include <iostrea ...

  3. opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽

    图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...

  4. opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽

    Morphological Transformations 1图像腐蚀 腐蚀的基本思想:侵蚀前景物体的边界(总是试图保持前景为白色):内核在图像中滑动(如在2D卷积中).只有当内核下的所有像素都是1时 ...

  5. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  6. Opencv学习笔记四——图像形态学操作

    需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...

  7. opencv常用的形态学操作

    导读 在使用opencv做图像处理的时候,我们经常会需要用到一些基础的图像形态学操作腐蚀.膨胀.通过这些基本的形态学操作我们可以实现去噪以及图像的切割等. 形态学变换是基于图像形状的基础变换,它只能在 ...

  8. 【opencv】基本图像形态学操作

    图像形态学的作用是简化图像数据,保持基本图像特性,取出不相干结构等. 目录: 1.erode() 2.dilate() 3.morphologyEx()//MORPH_OPEN 4.morpholog ...

  9. 详细分析图像形态学操作

    原文链接:http://blog.csdn.net/poem_qianmo/article/details/23710721 还是比教科书上的图文并茂的多.以防删除,如有疑问或者版权问题,请移步原博客 ...

最新文章

  1. pod setup慢的解决方法
  2. sklearn警告:ConvergenceWarning: lbfgs failed to converge (status=1):
  3. Creational模式之Builder模式
  4. JavaScript中匿名函数的作用和用法
  5. mysql 5.6压缩安装_MySQL 5.6 for Windows 解压缩版配置安装
  6. HTTP协议简介_请求消息/请求数据包/请求报文_响应消息/响应数据包/响应报文
  7. 同步应用(python 版)
  8. js遍历对象去除空格
  9. Word 之 清除页眉下划线
  10. 人工蜂群算法python_人工蜂群算法简介与程序分析
  11. 洛谷 P1618 STL全排列方法
  12. mysql中db的名词解释_数据库原理名词解释
  13. WPF绑定XML数据源
  14. PHP网站漏洞poc,phpyun某处SQL注入漏洞含POC
  15. 51单片机最小系统的制作和程序烧录
  16. Anaconda3安装
  17. 中国女排为何世界杯屡战屡胜?郎平靠的是史诗级的项目管理
  18. Mind the Box: $\ell_1$-APGD for Sparse Adversarial Attacks on Image Classifiers
  19. Directsound开发指南(2)
  20. Java阻塞队列-BlockingQueue介绍及实现原理

热门文章

  1. 生鲜小程序 微信小程序怎么制作 临沂修齐网络专业制作微信小程序
  2. 2003服务器系统能上网吗,windows server 2003上网飞速的秘诀
  3. Android中更换头像功能的实现
  4. CentOS 配置 yum 源
  5. matlab实现感知器分类 高斯分布,模式作业设计
  6. win7系统配置时间服务器,win7系统配置ntp服务器地址
  7. ImpREC手工指定IAT中的表项值
  8. Python Sorted - key
  9. linux卸载rpm包的命令,如何恢复误删除的rpm包命令
  10. Demo_C#_Winform 压缩、解压缩