这是一个先腐蚀后膨胀的程序。
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
IplImage *image, *image1, *image2;
image = cvLoadImage("b.jpg");
image1 = cvCreateImage
(cvSize(image->width, image->height), 8, 1);
//创建首地址并分配存储空间
image2 = cvCreateImage
(cvSize(image->width, image->height), 8, 1);
cvCvtColor(image, image1, CV_RGB2GRAY);
//参数CV_RGB2GRAY是RGB到gray
cvCvtColor(image, image2, CV_RGB2GRAY);
cvNamedWindow("image", 1);
cvShowImage("image", image);
cvNamedWindow("Erode_fushi", 1);
cvNamedWindow("Dilate_pengzhang", 1);
cvErode(image1, image1, 0, 1);
cvDilate(image2, image2, 0, 1);
cvShowImage("Erode_fushi", image1);
cvShowImage("Dilate_pengzhang", image2);
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&image1);
cvReleaseImage(&image2);
cvDestroyAllWindows();
return 0;
}
如果是彩色图像,各个通道单独处理。
1 cvErode()腐蚀
void cvErode(
IplImage* src,
IplImage* dst,
IplConvKernel* B=NULL,
int iterations=1
);
src:输入图像.
dst:输出图像.
B:核,默认为 NULL。若为NULL,则使用参考点位于中心的3×3 核
iterations:腐蚀的次数,默认为1
2 cvDilate()膨胀
void cvDilate(
IplImage* src,
IplImage* dst,
IplConvKernel* B=NULL,
int iterations=1
);
在试图找到连通分支(即具有相似颜色或强度的像素点的大块的互相分离的区域)时通常使用膨胀操作。因为在大多数情况下一个大区域可能被噪声、阴影等类似的东西分割成多个部分,而一次轻微的膨胀又将使这些部分“融合”在一起。
3 自定义核
我们不必局限于选择3×3方形的核,可以创建自定义的核。这样的核由cvCreateStructuringElementEx()函数创建,由cvReleaseStructuringElement()函数释放。
3.1 cvCreateStructuringElementEx()
创建结构元素
IplConvKernel* cvCreateStructuringElementEx(
int cols,
int rows,
int anchor_x,
int anchor_y,
int shape,
int* values=NULL
);
cols
结构元素的列数目
rows
结构元素的行数目
anchor_x
锚点的相对水平偏移量
anchor_y
锚点的相对垂直偏移量
shape
结构元素的形状,可以是下列值:
CV_SHAPE_RECT, 长方形元素;
CV_SHAPE_CROSS, 交错元素
CV_SHAPE_ELLIPSE, 椭圆元素;
CV_SHAPE_CUSTOM, 用户自定义元素。
这个函数其实我也不太明白,但是看了那么多解释,感觉百度百科的解释比较靠谱:
http://baike.baidu.com/view/4819443.htm#2