图像处理之膨胀腐蚀操作
2014-01-23 14:32
190 查看
腐蚀的算法:
用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为1,结果图像的该像素为1。否则为0。
结果:使二值图像减小一圈
B}Í S = { x,y | SxyÄ定义:E = B
膨胀的算法:
用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为0,结果图像的该像素为0。否则为1
结果:使二值图像扩大一圈
S = { x,y | Sxy∩B ≠Ф}Å定义:E = B
原图
结果
用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为1,结果图像的该像素为1。否则为0。
结果:使二值图像减小一圈
B}Í S = { x,y | SxyÄ定义:E = B
膨胀的算法:
用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为0,结果图像的该像素为0。否则为1
结果:使二值图像扩大一圈
S = { x,y | Sxy∩B ≠Ф}Å定义:E = B
void erode_image(IplImage * src,IplImage * dst) { if(src == NULL || dst == NULL) return; int width = src->width; int height = src->height; //水平方向的腐蚀 for (int i=0;i < src->height;i++) { for (int j=1;j < src->width - 1;j++) { // data = ((uchar *)(src->imageData + src->widthStep * i))[j]; if(((uchar *)(src->imageData + src->widthStep * i))[j] == 0) { ((uchar *)(dst->imageData + dst->widthStep * i))[j] = 0; for (int k=0;k < 3;k++) { // data = ((uchar *)(src->imageData + src->widthStep * i))[j + k -1]; if(((uchar *)(src->imageData + src->widthStep * i))[j + k -1] == 255) { ((uchar *)(dst->imageData + dst->widthStep * i))[j] = 255; break; } } } else ((uchar *)(dst->imageData + dst->widthStep * i))[j] = 255; } } //垂直方向的腐蚀 for (int i=0;i < dst->width;i++) { for (int j=1;j < dst->height - 1;j++) { // data = ((uchar *)(src->imageData + src->widthStep * i))[j]; if(((uchar *)(dst->imageData + dst->widthStep * j))[i] == 0) { ((uchar *)(src->imageData + src->widthStep * j))[i] = 0; for (int k=0;k < 3;k++) { // data = ((uchar *)(src->imageData + src->widthStep * i))[j + k -1]; if(((uchar *)(dst->imageData + dst->widthStep * (j + k -1)))[i] == 255) { ((uchar *)(src->imageData + src->widthStep * j))[i] = 255; break; } } } else ((uchar *)(src->imageData + src->widthStep * j))[i] = 255; } } } void dilate_image(IplImage * src,IplImage * dst) { if(src == NULL || dst == NULL) return; int width = src->width; int height = src->height; //水平方向的膨胀 for (int i=0;i < src->height;i++) { for (int j=1;j < src->width - 1;j++) { if(((uchar *)(src->imageData + src->widthStep * i))[j] == 255) { ((uchar *)(dst->imageData + dst->widthStep * i))[j] = 255; for (int k=0;k < 3;k++) { if(((uchar *)(src->imageData + src->widthStep * i))[j + k -1] == 0) { ((uchar *)(dst->imageData + dst->widthStep * i))[j] = 0; break; } } } else ((uchar *)(dst->imageData + dst->widthStep * i))[j] = 0; } } //垂直方向的膨胀 for (int i=0;i < dst->width;i++) { for (int j=1;j < dst->height - 1;j++) { // data = ((uchar *)(src->imageData + src->widthStep * i))[j]; if(((uchar *)(dst->imageData + dst->widthStep * j))[i] == 255) { ((uchar *)(src->imageData + src->widthStep * j))[i] = 255; for (int k=0;k < 3;k++) { // data = ((uchar *)(src->imageData + src->widthStep * i))[j + k -1]; if(((uchar *)(dst->imageData + dst->widthStep * (j + k -1)))[i] == 0) { ((uchar *)(src->imageData + src->widthStep * j))[i] = 0; break; } } } else ((uchar *)(src->imageData + src->widthStep * j))[i] = 0; } } }
image = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE); dst1 = cvCreateImage(cvSize(image->width,image->height),image->depth,image->nChannels); dilate_image(image,dst1); erode_image(image,dst1); cvSaveImage(str,image);
原图
结果
相关文章推荐
- 图像处理之膨胀腐蚀操作
- OpenCV图像处理形态学操作腐蚀Erode与膨胀Dilate
- Opencv--形态学图像处理--膨胀与腐蚀,开操作与闭操作
- 灰度图像--形态学处理:腐蚀、膨胀、开操作、闭操作、顶帽、底帽等
- OpenCV图像处理形态学操作腐蚀Erode与膨胀Dilate
- OpenCV1.0图像处理形态学操作腐蚀Erode与膨胀Dilate
- OpenCV之imgproc 模块. 图像处理(1)图像平滑处理 腐蚀与膨胀(Eroding and Dilating) 更多形态学变换 图像金字塔 基本的阈值操作
- OpenCV&图像处理_3:以腐蚀[eroding]和膨胀[dilating]为基础的形态学操作和图像金字塔[image pyramids]
- OpenCV1.0图像处理形态学操作腐蚀Erode与膨胀Dilate
- opencv 图像处理 形态学操作 腐蚀 膨胀 开闭运算 阈值二值化 图像卷积 图像金字塔 Sobel算子 Laplacian 算子 candy边缘检测 霍夫变换 直方图
- 学习【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀----思维导图笔记
- 图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
- 图像处理中的膨胀、腐蚀、细化
- [学习opencv]图像腐蚀、膨胀、开闭操作
- Matlab 图像处理 形态学 腐蚀 膨胀 开闭运算 连通分量
- 形态学图像处理-腐蚀和膨胀
- 【图像处理】膨胀与腐蚀
- 形态学图像处理-腐蚀和膨胀
- python 简单图像处理(14) 灰度图腐蚀和膨胀,开运算、闭运算
- Matlab 图像处理 形态学 腐蚀 膨胀 开闭运算 连通分量