2

我正在尝试制作一个能够识别场景中的道路并继续使用形态过滤和分水岭算法的程序。但是,该程序会产生平庸或糟糕的结果。如果道路占据了大部分场景,它似乎还可以(通过不够好)。然而在其他图片中,事实证明天空被分割了(云的分水岭)。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我试图看看我是否可以进行更多的图像处理以改善结果,但这是我迄今为止最好的,不知道如何继续改进我的程序。

如何改进我的程序?

代码:

import numpy as np
import cv2
from matplotlib import pyplot as plt
import imutils

def invert_img(img):
    img = (255-img)
    return img


#img = cv2.imread('images/coins_clustered.jpg')
img = cv2.imread('images/road_4.jpg')
img = imutils.resize(img, height = 300)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

thresh = invert_img(thresh)

# noise removal
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 4)

# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations=3)

#sure_bg = cv2.morphologyEx(sure_bg, cv2.MORPH_TOPHAT, kernel)

# Finding sure foreground area
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)

# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers+1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0
'''
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgray = cv2.GaussianBlur(imgray, (5, 5), 0)
img = cv2.Canny(imgray,200,500)
'''
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]


cv2.imshow('background',sure_bg)
cv2.imshow('foreground',sure_fg)
cv2.imshow('threshold',thresh)
cv2.imshow('result',img)
cv2.waitKey(0)
4

2 回答 2

3

首先,分割问题很难。您希望解决方案越通用,就越难。道路分割是一个众所周知的问题,我相信你可以找到许多从各个方向解决这个问题的论文。

帮助我获得有关计算机视觉问题的想法的东西是尝试思考是什么让我如此容易地检测到它而对计算机来说却如此困难。

例如,让我们看一下图像上的道路。是什么让它从背景中脱颖而出?

  1. 独特的灰色。
  2. 始终有 2 条白色肩线
  3. 始终位于图像的底部
  4. 中间总是有一条分隔线(黄色/白色)
  5. 很顺滑
  6. 底部更宽,消失在地平线上。

现在,在我们找到了一些独特的特征之后,我们需要找到量化它们的方法,所以它对算法来说是显而易见的,因为它对我们来说是显而易见的。

  1. 处理 RGB(甚至更好 - HSV)图像,不要在开始时将其转换为灰色并丢失所有颜色数据。寻找灰色地带!
  2. 再次,让我们找到白色区域(灰色区域内)。您可以尝试在肩线的特定方向进行边缘检测。您正在寻找大约占图像高度一半的线条。ETC...
  3. 让我们删除图像的上半部分。几乎没有一条路,您将摆脱算法中的大量噪音。
  4. 见 2...
  5. 让我们检查局部标准偏差或其他一些平滑特征。
  6. 如果我们找到了一些形状,让我们检查它是否符合我们的预期。

我知道这些只是想法,我并不声称它们很容易实现,但是如果你想改进你的算法,你必须像你一样给它更多的“知识”。

于 2015-10-19T17:05:10.810 回答
0

利用一些领域知识;换句话说,做一些简化的假设。即使是“相机没有倒置”和“人行道有统一色调”之类的基本内容也会改善常见情况。

如果您可以将十字路口视为一种特殊情况,那么寻找道路边缘可能比寻找道路本身更简单、更有用。

于 2015-10-19T16:15:24.720 回答