需求突然转换到,识别有背景的户型图:
具体效果参考空间大师,首先提出墙体,然后识别门窗、家具。
空间大师对实现思路几乎没有帮助,绝望之际找到一篇论文,看结果还不错,于是我们就开始根据论文一步步实现。
论文为:基于形状与边缘特征的户型图识别研究_江州,有两种方法:
一、基于形状特征的户型图识别
1、墙体线分割
彩色图-->灰度图-->统计灰度直方图,最大值即为背景灰度。
墙体的几何特征,平直度:
若某灰度值的平直度越高,则代表该灰度值的整体分布越趋于平直化。
墙体分割算法的主要流程为:
(1)统计全局图像的灰度值,(2)计算分布图中峰值灰度的平直度,(3)平直度最高的灰度值即为墙体线的灰度,(4)二值化阈值(通常取灰度域)。
2、墙体线降噪
观察发现,噪声部分连图片连通区大小远小于墙体线构成的连通区,且峰值连通区的数目决定了墙体的数量。
提出,基于连通区的快速去噪算法,主要思路:(1)统计全局的连通区大小,(2)找到能分割出所有峰值连通区对应的最小阈值,(3)以该阈值的1/2作为分割阈值,对图像中的连通区进行分割。
3、墙体线矫正与分析
4、门窗的分割与识别
窗:平行线的纹理特征
门:圆弧所分割两个区域的面积比
二、基于边缘特征的户型图识别(我们进行了代码实现)
1、像素级边缘提取
对于边缘提取,canny算子的效果最好,保留了图像更多的细节,且对部分破损边缘进行修补,但处理时间长;
sobel算子,能较好地保持边缘细节,速度快,但自动过滤掉了一部分不关注的边缘。
选择了sobel算子进行边缘检测。
(1)去标尺,得到处理图像的边界(灰度值投影找峰值的方法)
imageWithoutRuler(image, imageWithoutR, border);
(2)边缘梯度的计算,计算四个方向的sobel梯度模板,选取最大的作为其梯度值及方向。
采用四个方向的梯度模板的好处在于充分利用8邻域内像素灰度信息的同时,判断方向快速且只涉及到加法。
sobelGrad(src_gray, gradImage, thetaImage, ShowthetaImage, border);
梯度图:
方向图:
(3)阈值分割及非极大值抑制
阈值分割,对感兴趣的图像进行分离,提取出梯度较高的像素点,这些像素点灰度值变化剧烈,为边缘的候选点。
非极大值抑制,保证该店为局部范围内梯度最大的点,保证边缘为单像素宽度,方便进行后续的边缘追踪。
方法:在该梯度上,该像素点大于等于相邻的两个像素点的梯度值。
threshold_nms(gradImage, thetaImage, gradImage1, border, 0.3);
(4)去冗余点与毛刺
(冗余点的定义没看懂。)
毛刺,即分支点的特征为:在像素的八邻域内,有不超过一个像素点。
removeBurr(gradImage1, gradImage2, border);
(5)边缘跟踪
为了方便后续对边缘数据进行参数化,必须对提取的边缘进行编码。其编码算法的步骤如下:
步骤 1:从左到右,从上到下,检索出所有连续边界的起始点,记下起始点坐标,并将该点的灰度值,置为背景灰度 0;
步骤 2:以该点的梯度方向为搜索方向,不断循环检索下一个顶点。若找到,则加下该检索方向,并将该点的灰度值置为背景灰度 0;若没找到,说明该点是孤立点,即边缘的终点,跳出循环;
步骤 3:以像素数目门限对跟踪结果进行过滤,低于门限的边缘被滤除。
该边缘编码方案与传统的编码方法进行比较,一方面,直接对源图像内的像素点进行置零操作,极大地减少了遍历次数;另一方面,在检索下一个边界点时,把上一个检索方向作为优先检索方向,检索效率得到了较大的提升。
edgeTracking(gradImage2, thetaImage, border, lines_before);
2、亚像素级边缘提取
。。。。。。
我们的困境在于不知道怎么去除干扰项,实现了部分代码后,发现论文中是手动去除干扰。。放弃。