一、接着上次canny边缘后基于长度和面积筛选后的图形做工作。

原图:

复杂户型图处理(外轮廓颜色) — 20180718-20180721

筛选过后线段矢量化的图:

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(1)调整相邻线段到同一水平或竖直位置

linesMerge(vector<Vec4i>&lines, int thresh)

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(2)延长需要延长的线段
    先搜索直线所在方向是否可延伸,再搜索与直线正交的方向能否延伸,
    如果与直线正交的方向能延伸,除了填补与直线方向一致的像素,还填补正交方向的像素   

    linesExtend(Mat &img, vector<Vec4i>&lines)

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(3)以节点分割线段,端点悬空的线段删除

linesSplit(Mat &img, vector<Vec4i> &lines, vector<Vec4i> &lines1)

复杂户型图处理(外轮廓颜色) — 20180718-20180721

效果还不错,得到了主要墙体,并且基本去除了干扰,

后续基于平行线找到墙体,对墙体再进行一些校正,并且去除小的干扰,效果应该更好。

但问题是,并不是每张图都能预处理到比较好的状态,基于长度和面积过滤效果并不理想。

二、换一种预处理方法,根据外轮廓找墙体特征,然后根据canny边缘做mask,提出墙体,再进行处理

(1)根据外轮廓向内搜索5个像素,找到墙体特征灰度值

       findFeature(Mat &src, Mat &contours, vector<Vec4i> border, int(&a)[256])

         并画出归一化吼得灰度直方图

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(2)根据直方图找到峰值及应该保留的灰度值

   findHistPeak(Mat &hist, vector<int> &gv)

   根据墙体灰度特征,单独标注出墙体

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(3)中值滤波去椒盐噪声

medianBlur(imgwall, imgmedianblur, 3);

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(4)膨胀腐蚀补小洞

dilateErode(imgDilateErode, 11);

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(5)会出现不同彩色有相同的灰度值进行干扰,所以改为直接操作三通道彩色图像

  根据外轮廓墙体特征灰度值找到对应彩色三通道值

findRGBfeature(Mat &img, Mat &src, Mat &contours, vector<Vec4i> border, vector<int> &gv, vector <Vec3i> &rgbv)

画出彩色墙体

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(6)中值滤波及腐蚀膨胀后的结果

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(可以通过连通域的面积去除一些干扰物体,仅留下主要墙体)

(7)

复杂户型图处理(外轮廓颜色) — 20180718-20180721

(8)总结:根据初步结果分析可以看出,

a、此方法对单色墙体比较友好,处理双色墙体时很可能丢失一种墙体,需要解决这个问题。

b、处理三通道图像可基本解决橙色干扰问题,利用从外轮廓进行提取墙体可解决墙体与背景同色的问题,但是墙体与物体同色问题仍没解决。

c、有些奇怪的图可以忽略暂时不处理。。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-23
  • 2022-12-23
  • 2021-12-13
  • 2022-12-23
  • 2022-01-07
  • 2022-12-23
猜你喜欢
  • 2021-10-16
  • 2021-09-18
  • 2021-11-19
  • 2021-12-02
  • 2021-10-06
  • 2021-09-24
  • 2021-08-26
相关资源
相似解决方案