可以看出,结果不太尽如人意,尤其是天空和水面的部分,存在着大量纹理信息,而实际的水墨画中,这些部分应该为留白,或少量纹理信息。为了对这一现象进行解决,我们决定将图像的前景与后景进行分离,分别训练,测试其效果。
借鉴了论文Sky Region Detection in a Single Image for Autonomous Ground Robot Navigation中的一些方法,下面我将介绍具体的步骤:
这篇论文有三个前提假设:
1,天空区域的平均亮度要比地面区域的平均亮度要亮
2,天空区域在地面区域的上方
3,天空区域比较平滑
算法的大体思想是:
1,从上向下一行一行的扫描像素,并设定一个阈值,由此可以得到一个边界,通过设定不同的阈值可以得到不同的边界,
2,设定一个能量函数,不同的边界对应不同的能量函数的值,能量函数最大的则为最优边界
3,如果临时最优边界跳变过大,则认为是误检,这时,需要用K-means将天空(S)的像素分成两个集合,分别计算两类天空与地面(G)的马氏距离,马氏距离大的认为是真正天空(S1),另一类标记为地面(S2)。
4,再计算S中每一个像素与S1和G的马氏距离,与哪个距离近就将其标记为什么。
5,对S的每一列进行扫描,如果有一半的像素是天空则认为这一列都是天空,否则认为是地面
从文章的假设中就可以看出,本算法存在着很大的不足(只能识别出最上面的天空),于是按照一篇图片天空区域识别的博客对上述算法进行了改进:
我们对图片其他区域(step3处理后的s2和G)的每个像素进行扫描,如果其他区域的像素满足以下两个条件则认为也是天空:
<1> 弱纹理区域
<2> 像素值和Strue区域的平均像素值 相差很小。
测试结果如下:
可以看出,对天空部分的识别还是较好的
根据原图和模板图,将前后景分离后的效果图:
我已经向组里提交图片,等待训练结果