试图在OpenCV

时间:2015-10-17 17:56:05

标签: python opencv image-segmentation watershed mathematical-morphology

我正在尝试制作一个能够识别场景中道路的程序,然后继续使用形态滤波和分水岭算法。然而,该计划产生平庸或不好的结果。如果道路占据了大部分场景,它似乎没有问题(不够好)。然而在其他图片中,事实证明天空变得分段(与云层分水岭)。

enter image description here

enter image description here

enter image description here

enter image description here

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

如何改进我的计划?

代码:

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)

2 个答案:

答案 0 :(得分:3)

首先,细分问题很难解决。您希望解决方案越普遍,它就越难。 Road segemntation是一个众所周知的问题,我相信你可以找到许多从各个方向解决这个问题的论文。

有助于我了解计算机视觉问题的一些方法就是试着想一想是什么让我能够轻松地检测到它并对计算机如此困难。

例如,让我们看一下您图像的道路。是什么让它在背景中独一无二?

  1. 鲜明的灰色。
  2. 总是有2条白色肩线
  3. 始终位于图片的底部
  4. 中间始终有一条分隔线(黄色/白色)
  5. 非常流畅
  6. 在底部更宽阔,消失在地平线上。
  7. 现在,在我们找到一些独特的功能之后,我们需要找到量化它们的方法,因此对于我们来说,这对于算法来说是显而易见的。

    1. 处理RGB(甚至更好的 - HSV)图像,不要在开始时将其转换为灰色并丢失所有颜色数据。寻找灰色区域!
    2. 再次,让我们找到白色区域(灰色区域内)。您可以尝试在肩线的特定方向进行边缘检测。您正在寻找占据图像高度一半的线。等...
    3. 让我们删除图像的上半部分。你几乎没有道路,你将摆脱算法中的大量噪音。
    4. 见2 ...
    5. 让我们检查当地标准偏差或其他一些平滑度功能。
    6. 如果我们找到了某种形状,请检查它是否符合我们的预期。
    7. 我知道这些只是想法,我并不认为它们很容易实现,但如果你想改进你的算法,你必须给它更多的“知识”,就像你一样。

答案 1 :(得分:0)

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

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