灰度图像--图像分割 区域分割之区域分离
2015-03-10 20:37
204 查看
学习DIP第59天
转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
从结构来讲可以抽象成一颗四叉树:
算法最核心的是设计一个判别式,上面说的判别式是均值和均方的联合,也可以使用其他判别式,根据实际情况可以具体设计。
算法:
初始化,输入参数,包括均值上下界m1,m2,标准差上下界d1,d2
计算区域均值和标准差,如果满足条件,输出对应设置为亮 否者将区域分为四份
将其中一份带入步骤2递归进行计算
如果区域分割小于设定的最小值结束递归。
想要分离周围的星云,参数见图中标注:
原图:
同样分离周围的星云,参数见图中标注:
待续。。。
转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
开篇废话
废话开始,今天本来只想写一篇,但晚上觉得还是快把区域分割简单介绍下,后面开始彩色图像类的知识学习和代码实现,下一篇介绍分水岭算法,这才是个头疼的算法,今天的区域分离(合并)相对比较好理解。算法原理
首先本算法依然是基于区域的,用到的区域的性质是区域的均值和标准差,简单描述算法,如果一个区域满足设定的均值范围和标准差范围,设置整个区域为亮,否则将次区域分为四份,每一份继续递归进行,直至预先设定的最小区域。从结构来讲可以抽象成一颗四叉树:
算法最核心的是设计一个判别式,上面说的判别式是均值和均方的联合,也可以使用其他判别式,根据实际情况可以具体设计。
算法:
初始化,输入参数,包括均值上下界m1,m2,标准差上下界d1,d2
计算区域均值和标准差,如果满足条件,输出对应设置为亮 否者将区域分为四份
将其中一份带入步骤2递归进行计算
如果区域分割小于设定的最小值结束递归。
代码
[code]/*******************************************************************************/ /* *区域分割算法,递归进行判断 *如果区域不符合条件,将区域 *分为四份,递归判断每个区域 *知道区域分为最小设定值 */ void findSplitRegion(double *src,double *dst,int width,int height,int x,int y,int w_width,int w_height,double mean_param1,double mean_param2,double variance_param1,double variance_param2){ double mean=RegionMean(src, width, height, x, y, w_width, w_height); double variance=RegionStdDeviation(src, width, height, x, y, w_width, w_height); if(mean>mean_param1&& mean<=mean_param2&& variance>variance_param1&& variance<=variance_param2){ RegionSetOne(dst, width, height, x, y, w_width, w_height); }else{ #define MINIMAL_CELL 3 if(w_width>=MINIMAL_CELL&&w_height>=MINIMAL_CELL){ findSplitRegion(src, dst, width,height, x, y, w_width/2+1, w_height/2+1, mean_param1, mean_param2, variance_param1, variance_param2); findSplitRegion(src, dst, width,height, x+w_width/2, y, w_width/2+1, w_height/2+1, mean_param1, mean_param2, variance_param1, variance_param2); findSplitRegion(src, dst, width,height, x+w_width/2, y+w_height/2+1, w_width/2+1, w_height/2, mean_param1, mean_param2, variance_param1, variance_param2); findSplitRegion(src, dst, width,height, x, y+w_height/2, w_width/2+1, w_height/2+1, mean_param1, mean_param2, variance_param1, variance_param2); } } } void RegionSplit(double *src,double *dst,int width,int height,double mean_param1,double mean_param2,double variance_param1,double variance_param2){ double *dsttemp=(double *)malloc(sizeof(double)*width*height); findSplitRegion(src, dsttemp, width, height, 0,0, width, height, mean_param1, mean_param2, variance_param1,variance_param2); matrixCopy(dsttemp, dst, width, height); free(dsttemp); }
实验结果
原图:想要分离周围的星云,参数见图中标注:
原图:
同样分离周围的星云,参数见图中标注:
总结
此算法运行速度很快,但精确度不够高,因为设置的最小区域值决定了区域分割的准确性,所以会有锯齿状的边缘,这是一个缺点。待续。。。
相关文章推荐
- 分割图像并指定多个灰度阀值,对同一幅图像进行分区域的二值化
- 灰度图像--图像分割 区域分割之分水岭算法
- 区域生长和区域分离与合并的图像分割方法
- 灰度图像的区域分割插值算法和针对彩色图像的基于Canny边缘检测的色彩融合算法
- 灰度图像--图像分割 区域分割之区域生长
- 灰度图像--图像分割 阈值处理之平均阈值
- OpenCV图像处理-区域分割-形态学操作应用
- 基于轮廓的图像分割、连通区域提取
- 【OpenCV学习笔记 016】图像分割-种子区域生长
- 图像分割-区域标记算法(实现)
- opencv实现图像分割,分离前景和背景(2)
- 图像低频高频区域分离
- 灰度图像--图像分割 Robert算子
- 灰度图像--图像分割 阈值处理综述
- opencv实现图像分割,分离前景和背景(1)
- 如何将灰度图像中大于阈值的区域标记成红色
- 冈萨雷斯数字图像处理学习7:图像分割 基于区域的分割分水岭
- 灰度图像--图像分割 Sobel算子
- 灰度图像--图像分割 Canny边缘检测
- 【图像处理】人眼区域分割(2)