通过形态学操作实现图像边缘
2013-12-26 19:29
435 查看
实现图像边缘的算法的思路是:首先将图像转换为二值图像,然后膨胀此二值图像,最后减去未膨胀之前的图像便得到了图像的边缘。
参考代码如下所示:int _tmain(int argc, _TCHAR* argv[])
{
IplImage *srcImg = cvLoadImage("test.jpg");
IplImage *grayImg = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvCvtColor(srcImg, grayImg, CV_BGR2GRAY);
IplImage *dstImg = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvThreshold(grayImg, dstImg, cv::Otsu(srcImg), 255, CV_THRESH_BINARY);
IplConvKernel *kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS);
cvMorphologyEx(dstImg, dstImg, NULL, kernel, CV_MOP_OPEN, 3);
cvMorphologyEx(dstImg, dstImg, NULL, kernel, CV_MOP_CLOSE, 1);
// Find edges: dilate(image) - image;
IplImage *dilatedImg = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvDilate(dstImg, dilatedImg, kernel, 1);
cvSub(dilatedImg, dstImg, dstImg);
// Label edges in srcImg
IplImage *redCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
IplImage *greenCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
IplImage *blueCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvSplit(srcImg, blueCh, greenCh, redCh, NULL);
cvOr(redCh, dstImg, redCh);
cvMerge(blueCh, greenCh, redCh, NULL, srcImg);
cvNamedWindow("src");
cvShowImage("src", srcImg);
cvNamedWindow("dst");
cvShowImage("dst", dstImg);
cvWaitKey(0);
return 0;
}其中cv::Otsu(srcImg)的算法,可参考http://en.wikipedia.org/wiki/Otsu%27s_method输出结果:
关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.
参考代码如下所示:int _tmain(int argc, _TCHAR* argv[])
{
IplImage *srcImg = cvLoadImage("test.jpg");
IplImage *grayImg = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvCvtColor(srcImg, grayImg, CV_BGR2GRAY);
IplImage *dstImg = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvThreshold(grayImg, dstImg, cv::Otsu(srcImg), 255, CV_THRESH_BINARY);
IplConvKernel *kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS);
cvMorphologyEx(dstImg, dstImg, NULL, kernel, CV_MOP_OPEN, 3);
cvMorphologyEx(dstImg, dstImg, NULL, kernel, CV_MOP_CLOSE, 1);
// Find edges: dilate(image) - image;
IplImage *dilatedImg = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvDilate(dstImg, dilatedImg, kernel, 1);
cvSub(dilatedImg, dstImg, dstImg);
// Label edges in srcImg
IplImage *redCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
IplImage *greenCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
IplImage *blueCh = cvCreateImage(cvGetSize(srcImg), 8, 1);
cvSplit(srcImg, blueCh, greenCh, redCh, NULL);
cvOr(redCh, dstImg, redCh);
cvMerge(blueCh, greenCh, redCh, NULL, srcImg);
cvNamedWindow("src");
cvShowImage("src", srcImg);
cvNamedWindow("dst");
cvShowImage("dst", dstImg);
cvWaitKey(0);
return 0;
}其中cv::Otsu(srcImg)的算法,可参考http://en.wikipedia.org/wiki/Otsu%27s_method输出结果:
关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.
相关文章推荐
- 图像形态学概要-腐蚀、膨胀、开运算、闭运算、形态学梯度(形态学边缘提取)、顶帽操作、黑帽操作
- 二值形态学操作、图像的边缘检测、图像编码
- 通过操作BMP文件的RGB值实现BMP文件的旋转,锐化,二值化,轮廓提取,边缘检测,合并等功能(一)
- 通过操作BMP文件的RGB值实现BMP文件的旋转,锐化,二值化,轮廓提取,边缘检测,合并等功能(二)
- opencv 中通过鼠标和键盘操作实现图像的平移
- opencv 图像处理 形态学操作 腐蚀 膨胀 开闭运算 阈值二值化 图像卷积 图像金字塔 Sobel算子 Laplacian 算子 candy边缘检测 霍夫变换 直方图
- 使用C#自动生成Word2003文档(通过操作COM组件实现)-转载
- 全面理解虚拟DOM,以及通过diff算法实现真正的虚拟DOM操作
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 通过JSCH 实现FTP各种操作
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- OpenCV图像识别、移动侦测、边缘检测实现及 cvCopy()和cvCloneImage()的区别
- 图像掩码操作的两种实现
- 形态学操作实现
- iOS 通过textfield的代理方法实现不进入编辑,实现别的操作
- OpenCV学习笔记(3)——图像形态学操作(Mathematical Morphology)
- MongoDB学习笔记(二) 通过samus驱动实现基本数据操作
- @interface 自定义annotation 通过AOP来实现人员操作日志
- C#中Bitmap类实现对图像操作的一些方法
- opencv读图像C语言实现canny边缘检测