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

来源:互联网 发布:linux tail 后100行 编辑:程序博客网 时间:2024/04/25 23:03

有形成分边缘检测

处理思路:

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方向上差分阶数取0y方向上差分阶数取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_OPENCV_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算法

 

累加平均


最终处理结果




处理结果对比:

          

     

     




0 0