您的位置:首页 > 其它

尿沉渣图像处理——有形成分边缘检测

2014-06-11 18:32 239 查看
有形成分边缘检测

处理思路:

1.将彩色图像灰度化,以去除图像冗余信息;

2.使用中值滤波,以去除椒盐噪声;

3.邻域滤波,使图像模糊,以便于去除刻度框阴影;

4.Canny算法与Sobel算法边缘检测后叠加平均,使细胞可形成连通域;

5.孔洞填充、腐蚀膨胀操作后最终形成连通域。

实现方法:

1.将彩色图像灰度化,以去除图像冗余信息。

void cvCvtColor( const CvArr* src, CvArr* dst, int code ),第一个参数为指向源图像的指针,第二个参数为指向目标图像的指针,第三个参数为颜色转换的方式,此处取CV_BGR2GRAY,表示将RGB图像转为GRAY(灰度)图像。





2.使用中值滤波,以去除椒盐噪声。

void cvSmooth(pSrc,pDst,CV_MEDIAN,3,3,0,0),其中pSrc表示源图像,pDst表示目标图像,CV_MEDIAN表示中值滤波,使用3×3区域。





3.邻域滤波,使图像模糊,以便于去除刻度框阴影。

void cvSmooth(pSrc,pDst,CV_MEDIAN,3,3,0,0),其中pSrc表示源图像,pDst表示目标图像,CV_BLUR表示中值滤波,使用3×3区域。





4.Canny算法与Sobel算法边缘检测后叠加平均,使细胞可形成连通域。

void cvSobel(const CvArr* src,CvArr* dst,int xorder,int yorder,int aperture_size CV_DEFAULT(3)),第一个参数是指原函数的指针,第二个参数是目标图像的指针,第三个参数是指x方向上的差分阶数,第四个参数是指y方向上的差分阶数,第四个参数为扩展Sobel核的大小。经过实验验证,当x方向上差分阶数取0,y方向上差分阶数取1时,可以有效的保留有形成分的信息。Sobel算子对边缘的检测不够精细,保留的往往是内外边界之中的图像信息,而且依然保留一些噪声点。





void cvCanny( const CvArr* image, CvArr* edges, double threshold1,double threshold2, int aperture_size CV_DEFAULT(3) ),第三个参数是小阈值,第四个参数为大阈值,第五个参数取默认即可。Canny算法的优点是边缘纤细,缺点是用两个自定义阈值取得的边缘点可能不连续。





经过试验,用Sobel和Canny算子分别提取轮廓后,将两幅二值化图像叠加平均。

5.孔洞填充、腐蚀膨胀操作后最终形成连通域。

腐蚀膨胀:void cvMorphologyEx(const CvArr* src,CvArr* dst,CvArr* temp,IplConvKernel* element,int operation,int iterations CV_DEFAULT(1)),第一个参数是指源图像指针;第二个参数是指目标图像指针;第三个参数在此处无用处,不追究;第四个参数是进行开闭运算的结构元素,经过验证,取默认的3×3最为合适;第四个参数放置了形态学运算的方式,有开运算,闭运算,形态梯度,礼帽操作,黑帽操作等,此处选取开和闭运算,分别为CV_MOP_OPEN和CV_MOP_CLOSE;第五个参数表示运算的次数,经过实验,此处取3次。

孔洞填充:

// 内轮廓填充

// 参数:

// 1. pBinary: 输入二值图像,单通道,位深IPL_DEPTH_8U。

// 2. dAreaThre: 面积阈值,当内轮廓面积小于等于dAreaThre时,进行填充。

void FillInternalContours(IplImage *pBinary, double dAreaThre)

{

double dConArea;

CvSeq *pContour = NULL;

CvSeq *pConInner = NULL;

CvMemStorage *pStorage = NULL;

// 执行条件

if (pBinary)

{

// 查找所有轮廓

pStorage = cvCreateMemStorage(0);

cvFindContours(pBinary, pStorage, &pContour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

// 填充所有轮廓

cvDrawContours(pBinary, pContour, CV_RGB(155, 55, 255), CV_RGB(255, 255, 255), 2, CV_FILLED, 8, cvPoint(0, 0));

// 外轮廓循环

for (; pContour != NULL; pContour = pContour->h_next)

{

// 内轮廓循环

for (pConInner = pContour->v_next; pConInner != NULL; pConInner = pConInner->h_next)

{

// 内轮廓面积

dConArea = fabs(cvContourArea(pConInner, CV_WHOLE_SEQ));

if (dConArea <= dAreaThre)

{

cvDrawContours(pBinary, pConInner, CV_RGB(255, 255, 255), CV_RGB(55, 55, 255), 0, CV_FILLED, 8, cvPoint(0, 0));

}

}

}

cvReleaseMemStorage(&pStorage);

pStorage = NULL;

}

}

上皮细胞处理示例:



Canny算法



Sobel算法



累加平均



最终处理结果

处理结果对比:











内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: