尿沉渣图像处理——有形成分边缘检测
来源:互联网 发布: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(灰度)图像。
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算法
累加平均
最终处理结果
- 尿沉渣图像处理——有形成分边缘检测
- 图像处理笔记 —— 边缘检测
- 边缘检测算法——图像处理
- 【图像处理】图像边缘检测
- 图像处理算法4——Sobel 边缘检测算子
- c#图像处理-边缘检测
- 图像处理与边缘检测
- 图像处理------Canny边缘检测
- 图像处理25:边缘检测
- 图像处理理论(二)——形态学、边缘检测、图像金字塔
- 【图像处理】彩色图像边缘检测
- 数字图像处理之边缘检测,图像分割
- 图像处理常用边缘检测算子总结
- 图像处理常用边缘检测算子总结
- dsp图像处理Prewitt算子边缘检测
- 图像处理常用边缘检测算子总结
- 图像处理之边缘检测概述
- 图像处理之Canny边缘检测
- iReport常用设置
- OCP 1Z0 052 40
- 非阻塞同步机制与CAS操作
- the resource is not on the build path of a php project
- 全球安全软件厂商重新排座次 IBM首次杀入三甲
- 尿沉渣图像处理——有形成分边缘检测
- 全栈工程师到底有什么用
- lua 一些需要注意的细节
- jquery给checkboxlist设置选中状态
- Visual Studio 2013 Update 2 (Build 2014)
- 抽象基类
- 为代码减负之<一>触发器(SQL)
- Eclipse 几个常用快捷键
- Jump Game II