OpenCV(6)-腐蚀和膨胀
2016-06-28 23:15
417 查看
腐蚀和膨胀属于形态学操作。
膨胀是指:将卷积核B滑过图像A,找出卷积核区域内最大像素值作为锚点像素值。这一操作可以缩小低像素值区域。
通过前面的卷积可以看出,膨胀相当于“最大值”滤波器,腐蚀相当于”最小值“滤波器。滤波器的形状我们可以自己定义。
\[
\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))
\]
\[
\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))
\]
\[
\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )
\]
\[
\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )
\]
\[
\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}
\]
获取卷积核,卷积核中,对应形状位置的元素都为1.
shape:
MORPH_RECT:矩形
MORPH_ELLIPSE:椭圆
MORPH_CROSS:十字形
ksize:
核大小
src:输入图像
dst:结果图像
op:操作MORPH_OPEN开运算,MORPH_CLOSE闭运算、MORPH_GRADIENT形态梯度、MORPH_TOPHAT钉帽、MORPH_BLACKHAT黑冒
腐蚀和膨胀
腐蚀是指:将卷积核B滑过图像A,找出卷积核区域内最小像素值作为锚点像素值。这一操作可以扩大低像素值区域。膨胀是指:将卷积核B滑过图像A,找出卷积核区域内最大像素值作为锚点像素值。这一操作可以缩小低像素值区域。
通过前面的卷积可以看出,膨胀相当于“最大值”滤波器,腐蚀相当于”最小值“滤波器。滤波器的形状我们可以自己定义。
其他形态学操作
开运算
先对图像腐蚀,再膨胀\[
\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} ))
\]
闭运算
先膨胀再腐蚀\[
\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} ))
\]
形态梯度
膨胀图和腐蚀图之差\[
\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} )
\]
顶冒
原图和开运算图之差\[
\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} )
\]
黑冒
闭运算结果和原图之差\[
\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src}
\]
实验代码
常用函数
Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))
获取卷积核,卷积核中,对应形状位置的元素都为1.
shape:
MORPH_RECT:矩形
MORPH_ELLIPSE:椭圆
MORPH_CROSS:十字形
ksize:
核大小
void 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() )
src:输入图像
dst:结果图像
op:操作MORPH_OPEN开运算,MORPH_CLOSE闭运算、MORPH_GRADIENT形态梯度、MORPH_TOPHAT钉帽、MORPH_BLACKHAT黑冒
代码
#include <iostream> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main(int argc, char* argv[]){ const char* path = ""; Mat img = imread(path); if (!img.data){ cout << "Wrong Image" << endl; return -1; } Mat kern = getStructuringElement(MORPH_RECT, Size(5, 5)); Mat erosion_img, dilate_img; //腐蚀 erode(img, erosion_img, kern); //膨胀 dilate(img, dilate_img, kern); imshow("original image", img); imshow("erosion image", erosion_img); imshow("dilate image", dilate_img); Mat open_mat, close_mat, gradient_mat, tophat_mat, blackhat_mat; morphologyEx(img, open_mat, MORPH_OPEN, kern); morphologyEx(img, close_mat, MORPH_CLOSE, kern); morphologyEx(img, gradient_mat, MORPH_GRADIENT, kern); morphologyEx(img, tophat_mat, MORPH_TOPHAT, kern); morphologyEx(img, blackhat_mat, MORPH_BLACKHAT, kern); imshow("Opening", open_mat); imshow("Closing", close_mat); imshow("Grandient", gradient_mat); imshow("Tohat", tophat_mat); imshow("Black", blackhat_mat); cvWaitKey(0); return 0; }
相关文章推荐
- Linux下find(文件查找)命令的总结
- Tomcat failed to starte的问题
- ecshop模板取模运算,取余运算符
- ecshop模板取模运算,取余运算符
- 解析Greenplum每个实例的postmaster.opts和postmaster.pid内容
- linux下so动态库一些不为人知的秘密 系列
- [sql]大型网站MySQL深度优化揭秘
- SHELL实现CentOS6,Ubuntu16下自动下载,编译安装LAMP
- linux日志文件说明
- linux编程-守护进程编写
- Linux:-bash: ***: command not found
- 主机无法访问linux虚拟机中tomcat的服务-解决办法
- Linux掉电处理
- mysql linux下源码安装错误集锦
- linux下搭建zookeeper集群
- 关于架构的一些自己的想法
- 高并发网站集群场景下MySQL数据库优化
- 第二十七天 sudo使用、selinux管理、手工制作linux系统
- Linux服务器时间不准确
- Linux的学习之旅之碰到的问题