图像开运算
2015-12-19 11:53
405 查看
开运算是先腐蚀后膨胀的过程,它能去除孤点、毛刺和小桥(连接两区域的小点),消除小物体、平滑大物体的边界,并且不明显改变面积。
开运算公式如下:
源图,二值图和开运算图如下所示:
开运算公式如下:
#include"cv.h" #include "highgui.h" void erode(CvMat *src, CvMat *dst); void dilate(CvMat *src, CvMat *dst); void open(CvMat *src, CvMat *dst); int main() { IplImage *src = cvLoadImage("linzhilin.jpg",1); const int width = src->width; const int height = src->height; CvMat* gray = cvCreateMat(height, width, CV_8UC1); CvMat* openImg = cvCreateMat(height, width, CV_8UC1); cvCvtColor(src, gray, CV_BGR2GRAY); cvThreshold(gray, gray, 1, 255, CV_THRESH_OTSU); open(gray, openImg); cvShowImage("SRC", src); cvShowImage("BINARY IMAGE", gray); cvShowImage("OPEN", openImg); cvWaitKey(0); cvSaveImage("binImg.bmp", gray); cvSaveImage("open.bmp", openImg); cvReleaseMat(&gray); cvReleaseMat(&openImg); return 0; } void erode(CvMat *src, CvMat *dst) { const int WIDTH = src->width; const int HEIGHT = src->height; memcpy(dst->data.ptr, src->data.ptr, WIDTH*HEIGHT); uchar* srcData = (uchar*)(src->data.ptr); for(int j = 0; j < HEIGHT - 1; j ++) { uchar* dstData = (uchar*)(dst->data.ptr + j * dst->step); for(int i = 0; i < WIDTH - 1; i ++) { bool found = false; dstData[i] = 255; for(int m = 0; m < 3; m ++) { if(found) break; for(int n = 0; n < 3; n ++) { if((srcData + (j + m - 1) * src->step)[i + n - 1] == 0) { dstData[i] = 0; found = true; break; } } } } } } void dilate(CvMat *src, CvMat *dst) { const int WIDTH = src->width; const int HEIGHT = src->height; memcpy(dst->data.ptr, src->data.ptr, WIDTH*HEIGHT); uchar* srcData = (uchar*)(src->data.ptr); for(int j = 0; j < HEIGHT - 1; j ++) { uchar* dstData = (uchar*)(dst->data.ptr + j * dst->step); for(int i = 0; i < WIDTH - 1; i ++) { bool found = false; dstData[i] = 0; for(int m = 0; m < 3; m ++) { if(found) break; for(int n = 0; n < 3; n ++) { if((srcData + (j + m - 1) * src->step)[i + n - 1] == 255) { dstData[i] = 255; found = true; break; } } } } } } void open(CvMat *src, CvMat *dst) { CvMat *openImg = cvCloneMat(src); erode(src, dst); dilate(dst, openImg); cvCopy(openImg, dst); cvReleaseMat(&openImg); }
源图,二值图和开运算图如下所示:
相关文章推荐
- hdu3294 girl‘s research
- 整理下iOS常用的三方库,以备查阅
- Phaser 开发之智能提示
- vi
- mac下已有pyhon2.7,装了python3 之后,怎么调用python3啊
- CronTrigger(转)
- 一般源码编译安装步骤
- manacher模板
- 【学习总结】声明变量在@interface括号中与使用@property的区别
- 背影渐变shape写法
- springMVC面试问题整理一
- 【C#】WPF Path 详解
- idea15破解
- AIX 分页替换技术入门
- idea15破解
- AngularJS directive 实现分页包装指令
- Dom4j操作XML文件
- VS调试技巧之附加进程
- [javase学习笔记]-6.5 类类型参数与匿名对象
- 后缀数组模板