opencv c++ 图像形态学操作
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++ 图像形态学操作相关推荐
- OpenCV中图像形态学操作
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 图像形态学是图像处理的分支学科,在二值图像处理 ...
- 2020.11.01 使用OpenCV进行图像形态学操作(开、闭、梯度)【OpenCV C++】
进行基础的图像形态学操作练习 (开操作.闭操作.梯度.顶帽.黑帽操作) 源代码: // #include <opencv2/opencv.hpp> #include <iostrea ...
- opencv 实现图像形态学操作 膨胀和腐蚀 开闭运算 形态学梯度 顶帽和黑帽
图像膨胀和腐蚀 图解 原理及python实现 更多内容:图像膨胀和腐蚀原理及python实现 opencv中膨胀和腐蚀函数 dilation = cv.dilate(img, kernel) # 膨胀 ...
- opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽
Morphological Transformations 1图像腐蚀 腐蚀的基本思想:侵蚀前景物体的边界(总是试图保持前景为白色):内核在图像中滑动(如在2D卷积中).只有当内核下的所有像素都是1时 ...
- OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽
OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...
- Opencv学习笔记四——图像形态学操作
需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...
- opencv常用的形态学操作
导读 在使用opencv做图像处理的时候,我们经常会需要用到一些基础的图像形态学操作腐蚀.膨胀.通过这些基本的形态学操作我们可以实现去噪以及图像的切割等. 形态学变换是基于图像形状的基础变换,它只能在 ...
- 【opencv】基本图像形态学操作
图像形态学的作用是简化图像数据,保持基本图像特性,取出不相干结构等. 目录: 1.erode() 2.dilate() 3.morphologyEx()//MORPH_OPEN 4.morpholog ...
- 详细分析图像形态学操作
原文链接:http://blog.csdn.net/poem_qianmo/article/details/23710721 还是比教科书上的图文并茂的多.以防删除,如有疑问或者版权问题,请移步原博客 ...
最新文章
- pod setup慢的解决方法
- sklearn警告:ConvergenceWarning: lbfgs failed to converge (status=1):
- Creational模式之Builder模式
- JavaScript中匿名函数的作用和用法
- mysql 5.6压缩安装_MySQL 5.6 for Windows 解压缩版配置安装
- HTTP协议简介_请求消息/请求数据包/请求报文_响应消息/响应数据包/响应报文
- 同步应用(python 版)
- js遍历对象去除空格
- Word 之 清除页眉下划线
- 人工蜂群算法python_人工蜂群算法简介与程序分析
- 洛谷 P1618 STL全排列方法
- mysql中db的名词解释_数据库原理名词解释
- WPF绑定XML数据源
- PHP网站漏洞poc,phpyun某处SQL注入漏洞含POC
- 51单片机最小系统的制作和程序烧录
- Anaconda3安装
- 中国女排为何世界杯屡战屡胜?郎平靠的是史诗级的项目管理
- Mind the Box: $\ell_1$-APGD for Sparse Adversarial Attacks on Image Classifiers
- Directsound开发指南(2)
- Java阻塞队列-BlockingQueue介绍及实现原理