openCV 形态学 腐蚀、膨胀、开操作和比操作、形态梯度 、顶帽、黑帽
2015-04-21 10:47
567 查看
函数定义如下:
[cpp]
view plaincopyprint?
//! erodes the image (applies the local minimum operator)
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
//! dilates the image (applies the local maximum operator)
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
//! applies an advanced morphological operation to the image
CV_EXPORTS_W 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() );
开运算 (Opening)
开运算是通过先对图像腐蚀再膨胀实现的。
能够排除小团块物体(假设物体较背景明亮)
请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。
闭运算是通过先对图像膨胀再腐蚀实现的。
能够排除小型黑洞(黑色区域)。
膨胀图与腐蚀图之差
能够保留物体的边缘轮廓,如下所示:
原图像与开运算结果图之差
闭运算结果图与原图像之差
OutputArray dst, 结果输出图像
InputArray kernel, 结构元素
Point anchor=Point(-1,-1), 结构元素的原点
int iterations=1, 迭代次数
dilate(膨胀函数):InputArray src, 原图像
OutputArray dst, 结果输出图像
InputArray kernel, 结构元素
Point anchor=Point(-1,-1), 结构元素的原点
int iterations=1, 迭代次数
morphologyEx(形态学函数):InputArray src, 原图像
OutputArray dst, 结果输出图像
int op,cv::MORPH_OPEN(打开) cv::MORPH_CLOSE(关闭)
Gradient: MORPH_GRADIENT(梯度)
Top Hat: MORPH_TOPHAT(顶帽) Black Hat: MORPH_BLACKHAT(黑帽)
InputArray kernel, 结构元素
Point anchor=Point(-1,-1), 结构元素的原点
int iterations=1, 迭代次数
[cpp]
view plaincopyprint?
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{
// Read input image
cv::Mat image= cv::imread("binary.bmp");
if (!image.data)
return 0;
// Display the image
cv::namedWindow("Image");
cv::imshow("Image",image);
// Erode the image
cv::Mat eroded;
cv::erode(image,eroded,cv::Mat());
// Display the eroded image
cv::namedWindow("Eroded Image");
cv::imshow("Eroded Image",eroded);
cv::imwrite("eroded.bmp",eroded);
// Dilate the image
cv::Mat dilated;
cv::dilate(image,dilated,cv::Mat());
// Display the dialted image
cv::namedWindow("Dilated Image");
cv::imshow("Dilated Image",dilated);
cv::imwrite("dilated.bmp",dilated);
// Erode the image with a larger s.e.
cv::Mat element(7,7,CV_8U,cv::Scalar(1));
cv::erode(image,eroded,element);
// Display the eroded image
cv::namedWindow("Eroded Image (7x7)");
cv::imshow("Eroded Image (7x7)",eroded);
cv::imwrite("Eroded Image 7x7.bmp",eroded);
// Erode the image 3 times.
cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);
// Display the eroded image
cv::namedWindow("Eroded Image (3 times)");
cv::imshow("Eroded Image (3 times)",eroded);
cv::imwrite("Eroded Image 3 times.bmp",eroded);
// Close the image
cv::Mat element5(5,5,CV_8U,cv::Scalar(1));
cv::Mat closed;
cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5);
// Display the opened image
cv::namedWindow("Closed Image");
cv::imshow("Closed Image",closed);
cv::imwrite("Closed Image.bmp",closed);
// Open the image
cv::Mat opened;
cv::morphologyEx(image,opened,cv::MORPH_OPEN,element5);
// Display the opened image
cv::namedWindow("Opened Image");
cv::imshow("Opened Image",opened);
cv::imwrite("Opened Image.bmp",opened);
// Close and Open the image
cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
// Display the close/opened image
cv::namedWindow("Closed and Opened Image");
cv::imshow("Closed and Opened Image",image);
cv::imwrite("Closed and Opened Image.bmp",image);
// Read input image
image= cv::imread("binary.bmp");
// Open and Close the image
cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
// Display the close/opened image
cv::namedWindow("Opened and Closed Image");
cv::imshow("Opened and Closed Image",image);
cv::imwrite("Opened and Closed Image.bmp",image);
cv::waitKey();
return 0;
}
四、程序结果显示和分析:
binary.bmp(源图像)
eroded.bmp (腐蚀)消除一些小的噪声
dilated.bmp(膨胀)填充物体的空洞,膨胀物体
Eroded Image 7x7.bmp(腐蚀,结构元素尺寸是7x7)相比结构元素为默认3x3的相比,源图像的噪声跟大点的噪声也消失了
Eroded Image 3 times.bmp(腐蚀 3次迭代)迭代后结果不变
Opened Image.bmp(先腐蚀后膨胀)消除小噪声,然后再膨胀,平滑大物体,分离小物体
Closed Image.bmp(关闭 先膨胀在腐蚀)填充细小空洞,连接相邻物体,平滑边界
Opened and Closed Image.bmp 先打开在关闭
Closed and Opened Image.bmp先关闭再打开
一、opencv几个形态学函数定义
形态学函数的头文件:#include <opencv2/imgproc/imgproc.hpp>函数定义如下:
[cpp]
view plaincopyprint?
//! erodes the image (applies the local minimum operator)
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
//! dilates the image (applies the local maximum operator)
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
//! applies an advanced morphological operation to the image
CV_EXPORTS_W 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() );
//! erodes the image (applies the local minimum operator) CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() ); //! dilates the image (applies the local maximum operator) CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() ); //! applies an advanced morphological operation to the image CV_EXPORTS_W 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() );
开运算 (Opening)
开运算是通过先对图像腐蚀再膨胀实现的。
能够排除小团块物体(假设物体较背景明亮)
请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。
闭运算(Closing)
闭运算是通过先对图像膨胀再腐蚀实现的。能够排除小型黑洞(黑色区域)。
形态梯度(Morphological Gradient)
膨胀图与腐蚀图之差能够保留物体的边缘轮廓,如下所示:
顶帽(Top Hat)
原图像与开运算结果图之差
黑帽(Black Hat)
闭运算结果图与原图像之差二、形态学函数解析
erode(腐蚀函数): InputArray src, 原图像OutputArray dst, 结果输出图像
InputArray kernel, 结构元素
Point anchor=Point(-1,-1), 结构元素的原点
int iterations=1, 迭代次数
dilate(膨胀函数):InputArray src, 原图像
OutputArray dst, 结果输出图像
InputArray kernel, 结构元素
Point anchor=Point(-1,-1), 结构元素的原点
int iterations=1, 迭代次数
morphologyEx(形态学函数):InputArray src, 原图像
OutputArray dst, 结果输出图像
int op,cv::MORPH_OPEN(打开) cv::MORPH_CLOSE(关闭)
Gradient: MORPH_GRADIENT(梯度)
Top Hat: MORPH_TOPHAT(顶帽) Black Hat: MORPH_BLACKHAT(黑帽)
InputArray kernel, 结构元素
Point anchor=Point(-1,-1), 结构元素的原点
int iterations=1, 迭代次数
三、形态学函数使用举例及结果分析
程序对源图像进行多种形态学处理,不同参数的膨胀(如函数默认的结构元素是3x3,改为7x7,还可以设置多次迭代),腐蚀,打开,关闭,以及开关的级联。[cpp]
view plaincopyprint?
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{
// Read input image
cv::Mat image= cv::imread("binary.bmp");
if (!image.data)
return 0;
// Display the image
cv::namedWindow("Image");
cv::imshow("Image",image);
// Erode the image
cv::Mat eroded;
cv::erode(image,eroded,cv::Mat());
// Display the eroded image
cv::namedWindow("Eroded Image");
cv::imshow("Eroded Image",eroded);
cv::imwrite("eroded.bmp",eroded);
// Dilate the image
cv::Mat dilated;
cv::dilate(image,dilated,cv::Mat());
// Display the dialted image
cv::namedWindow("Dilated Image");
cv::imshow("Dilated Image",dilated);
cv::imwrite("dilated.bmp",dilated);
// Erode the image with a larger s.e.
cv::Mat element(7,7,CV_8U,cv::Scalar(1));
cv::erode(image,eroded,element);
// Display the eroded image
cv::namedWindow("Eroded Image (7x7)");
cv::imshow("Eroded Image (7x7)",eroded);
cv::imwrite("Eroded Image 7x7.bmp",eroded);
// Erode the image 3 times.
cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);
// Display the eroded image
cv::namedWindow("Eroded Image (3 times)");
cv::imshow("Eroded Image (3 times)",eroded);
cv::imwrite("Eroded Image 3 times.bmp",eroded);
// Close the image
cv::Mat element5(5,5,CV_8U,cv::Scalar(1));
cv::Mat closed;
cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5);
// Display the opened image
cv::namedWindow("Closed Image");
cv::imshow("Closed Image",closed);
cv::imwrite("Closed Image.bmp",closed);
// Open the image
cv::Mat opened;
cv::morphologyEx(image,opened,cv::MORPH_OPEN,element5);
// Display the opened image
cv::namedWindow("Opened Image");
cv::imshow("Opened Image",opened);
cv::imwrite("Opened Image.bmp",opened);
// Close and Open the image
cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
// Display the close/opened image
cv::namedWindow("Closed and Opened Image");
cv::imshow("Closed and Opened Image",image);
cv::imwrite("Closed and Opened Image.bmp",image);
// Read input image
image= cv::imread("binary.bmp");
// Open and Close the image
cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
// Display the close/opened image
cv::namedWindow("Opened and Closed Image");
cv::imshow("Opened and Closed Image",image);
cv::imwrite("Opened and Closed Image.bmp",image);
cv::waitKey();
return 0;
}
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> int main() { // Read input image cv::Mat image= cv::imread("binary.bmp"); if (!image.data) return 0; // Display the image cv::namedWindow("Image"); cv::imshow("Image",image); // Erode the image cv::Mat eroded; cv::erode(image,eroded,cv::Mat()); // Display the eroded image cv::namedWindow("Eroded Image"); cv::imshow("Eroded Image",eroded); cv::imwrite("eroded.bmp",eroded); // Dilate the image cv::Mat dilated; cv::dilate(image,dilated,cv::Mat()); // Display the dialted image cv::namedWindow("Dilated Image"); cv::imshow("Dilated Image",dilated); cv::imwrite("dilated.bmp",dilated); // Erode the image with a larger s.e. cv::Mat element(7,7,CV_8U,cv::Scalar(1)); cv::erode(image,eroded,element); // Display the eroded image cv::namedWindow("Eroded Image (7x7)"); cv::imshow("Eroded Image (7x7)",eroded); cv::imwrite("Eroded Image 7x7.bmp",eroded); // Erode the image 3 times. cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3); // Display the eroded image cv::namedWindow("Eroded Image (3 times)"); cv::imshow("Eroded Image (3 times)",eroded); cv::imwrite("Eroded Image 3 times.bmp",eroded); // Close the image cv::Mat element5(5,5,CV_8U,cv::Scalar(1)); cv::Mat closed; cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5); // Display the opened image cv::namedWindow("Closed Image"); cv::imshow("Closed Image",closed); cv::imwrite("Closed Image.bmp",closed); // Open the image cv::Mat opened; cv::morphologyEx(image,opened,cv::MORPH_OPEN,element5); // Display the opened image cv::namedWindow("Opened Image"); cv::imshow("Opened Image",opened); cv::imwrite("Opened Image.bmp",opened); // Close and Open the image cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5); cv::morphologyEx(image,image,cv::MORPH_OPEN,element5); // Display the close/opened image cv::namedWindow("Closed and Opened Image"); cv::imshow("Closed and Opened Image",image); cv::imwrite("Closed and Opened Image.bmp",image); // Read input image image= cv::imread("binary.bmp"); // Open and Close the image cv::morphologyEx(image,image,cv::MORPH_OPEN,element5); cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5); // Display the close/opened image cv::namedWindow("Opened and Closed Image"); cv::imshow("Opened and Closed Image",image); cv::imwrite("Opened and Closed Image.bmp",image); cv::waitKey(); return 0; }
四、程序结果显示和分析:
binary.bmp(源图像)
eroded.bmp (腐蚀)消除一些小的噪声
dilated.bmp(膨胀)填充物体的空洞,膨胀物体
Eroded Image 7x7.bmp(腐蚀,结构元素尺寸是7x7)相比结构元素为默认3x3的相比,源图像的噪声跟大点的噪声也消失了
Eroded Image 3 times.bmp(腐蚀 3次迭代)迭代后结果不变
Opened Image.bmp(先腐蚀后膨胀)消除小噪声,然后再膨胀,平滑大物体,分离小物体
Closed Image.bmp(关闭 先膨胀在腐蚀)填充细小空洞,连接相邻物体,平滑边界
Opened and Closed Image.bmp 先打开在关闭
Closed and Opened Image.bmp先关闭再打开
相关文章推荐
- 形态学操作(腐蚀、膨胀、开操作、闭操作、形态学梯度、顶帽、黑帽)
- 图像形态学概要-腐蚀、膨胀、开运算、闭运算、形态学梯度(形态学边缘提取)、顶帽操作、黑帽操作
- 【OpenCV3图像处理】形态学 --- 膨胀、腐蚀、开运算 闭运算、形态学梯度、顶帽运算、黑帽运算
- opencv for python (14) 形态学转换(图像腐蚀、图像膨胀、开运算、闭运算、形态学梯度、礼帽、黑帽)
- 【opencv学习之二十五】OpenCV腐蚀、膨胀、开闭运算、形态学梯度、顶帽、黑帽
- OpenCV 系列 --- 形态学操作(膨胀、腐蚀)
- Opencv--形态学图像处理--膨胀与腐蚀,开操作与闭操作
- OpenCV形态学操作 腐蚀 膨胀 开闭
- OpenCV图像处理形态学操作腐蚀Erode与膨胀Dilate
- OpenCV学习笔记(六) 滤波器 形态学操作(腐蚀、膨胀等)
- OpenCV图像处理形态学操作腐蚀Erode与膨胀Dilate
- OpenCV形态学操作 腐蚀 膨胀 开闭
- OpenCV&图像处理_3:以腐蚀[eroding]和膨胀[dilating]为基础的形态学操作和图像金字塔[image pyramids]
- OpenCV1.0图像处理形态学操作腐蚀Erode与膨胀Dilate
- Opencv学习笔记(七):腐蚀,膨胀,开操作,闭操作及其他相关的形态学操作
- 形态学处理:膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽
- opencv3学习之形态学(腐蚀/膨胀/开运算/闭运算/顶帽/黑帽)
- opencv图像的形态学操作:腐蚀与膨胀
- OpenCV1.0图像处理形态学操作腐蚀Erode与膨胀Dilate
- OpenCV之imgproc 模块. 图像处理(1)图像平滑处理 腐蚀与膨胀(Eroding and Dilating) 更多形态学变换 图像金字塔 基本的阈值操作