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. 再び、白い領域 (灰色の領域内) を見つけてみましょう。肩線の特定の向きでエッジ検出を試すことができます。画像の高さの約半分の線を探しています。等...
  3. 画像の上半分を削除してみましょう。そこに道路があることはほとんどなく、アルゴリズムの多くのノイズを取り除くことができます。
  4. 2を参照してください...
  5. ローカル標準偏差、またはその他の滑らかさの特徴を確認してみましょう。
  6. 形状が見つかったら、それが期待どおりかどうかを確認します。

これらは単なるアイデアであり、実装が簡単であるとは言いませんが、アルゴリズムを改善したい場合は、あなたが持っているのと同じように、より多くの「知識」を与える必要があります.

于 2015-10-19T17:05:10.810 に答える
0

いくつかのドメイン知識を活用します。言い換えれば、いくつかの単純化した仮定を行います。「カメラが逆さまにならない」「舗装の色合いが均一である」などの基本的なことでも、よくあるケースが改善されます。

交差点を特別なケースとして扱うことができる場合、道路の端を見つけることは、道路自体を見つけるよりも簡単で便利な作業になる可能性があります。

于 2015-10-19T16:15:24.720 に答える