一、接着上次canny边缘后基于长度和面积筛选后的图形做工作。
原图:
筛选过后线段矢量化的图:
(1)调整相邻线段到同一水平或竖直位置
linesMerge(vector<Vec4i>&lines, int thresh)
(2)延长需要延长的线段
先搜索直线所在方向是否可延伸,再搜索与直线正交的方向能否延伸,
如果与直线正交的方向能延伸,除了填补与直线方向一致的像素,还填补正交方向的像素
linesExtend(Mat &img, vector<Vec4i>&lines)
(3)以节点分割线段,端点悬空的线段删除
linesSplit(Mat &img, vector<Vec4i> &lines, vector<Vec4i> &lines1)
效果还不错,得到了主要墙体,并且基本去除了干扰,
后续基于平行线找到墙体,对墙体再进行一些校正,并且去除小的干扰,效果应该更好。
但问题是,并不是每张图都能预处理到比较好的状态,基于长度和面积过滤效果并不理想。
二、换一种预处理方法,根据外轮廓找墙体特征,然后根据canny边缘做mask,提出墙体,再进行处理
(1)根据外轮廓向内搜索5个像素,找到墙体特征灰度值
findFeature(Mat &src, Mat &contours, vector<Vec4i> border, int(&a)[256])
并画出归一化吼得灰度直方图
(2)根据直方图找到峰值及应该保留的灰度值
findHistPeak(Mat &hist, vector<int> &gv)
根据墙体灰度特征,单独标注出墙体
(3)中值滤波去椒盐噪声
medianBlur(imgwall, imgmedianblur, 3);
(4)膨胀腐蚀补小洞
dilateErode(imgDilateErode, 11);
(5)会出现不同彩色有相同的灰度值进行干扰,所以改为直接操作三通道彩色图像
根据外轮廓墙体特征灰度值找到对应彩色三通道值
findRGBfeature(Mat &img, Mat &src, Mat &contours, vector<Vec4i> border, vector<int> &gv, vector <Vec3i> &rgbv)
画出彩色墙体
(6)中值滤波及腐蚀膨胀后的结果
(可以通过连通域的面积去除一些干扰物体,仅留下主要墙体)
(7)
(8)总结:根据初步结果分析可以看出,
a、此方法对单色墙体比较友好,处理双色墙体时很可能丢失一种墙体,需要解决这个问题。
b、处理三通道图像可基本解决橙色干扰问题,利用从外轮廓进行提取墙体可解决墙体与背景同色的问题,但是墙体与物体同色问题仍没解决。
c、有些奇怪的图可以忽略暂时不处理。。