我正在尝试制作一个能够识别场景中道路的程序,然后继续使用形态滤波和分水岭算法。然而,该计划产生平庸或不好的结果。如果道路占据了大部分场景,它似乎没有问题(不够好)。然而在其他图片中,事实证明天空变得分段(与云层分水岭)。
我试着看看我是否可以预先形成更多图像处理以改善结果,但这是我迄今为止最好的,并且不知道如何继续改进我的程序。
如何改进我的计划?
代码:
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)
答案 0 :(得分:3)
首先,细分问题很难解决。您希望解决方案越普遍,它就越难。 Road segemntation是一个众所周知的问题,我相信你可以找到许多从各个方向解决这个问题的论文。
有助于我了解计算机视觉问题的一些方法就是试着想一想是什么让我能够轻松地检测到它并对计算机如此困难。
例如,让我们看一下您图像的道路。是什么让它在背景中独一无二?
现在,在我们找到一些独特的功能之后,我们需要找到量化它们的方法,因此对于我们来说,这对于算法来说是显而易见的。
我知道这些只是想法,我并不认为它们很容易实现,但如果你想改进你的算法,你必须给它更多的“知识”,就像你一样。
答案 1 :(得分:0)
利用一些领域知识;换句话说,做一些简化的假设。即使是“相机不倒置”和“人行道都有均匀色调”等基本内容,也会改善常见情况。
如果您可以将十字路口视为一种特殊情况,那么找到道路的边缘可能比找到道路本身更简单,更有用。