4

1台の車と簡単な背景で構成される画像から車をセグメント化しようとしています
ここに画像の説明を入力


ここに画像の説明を入力


しかし、私の実装から得られるのはこれです
ここに画像の説明を入力



ここに画像の説明を入力


それぞれ

しかし、ほとんどすでにセグメント化されている画像では非常に簡単に機能します。 ここに画像の説明を入力


のような結果を与える
ここに画像の説明を入力


私が使用しているコードは

import cv2
import numpy as np

THRESH_TYPE=cv2.THRESH_BINARY_INV

def show(name,obj):
    cv2.imshow(name,obj)
    cv2.moveWindow(name, 100, 100) 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def process_end(new):
    drawing = np.zeros(o.shape,np.uint8)     # Image to draw the contours
    contours,hierarchy =cv2.findContours(new,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#find connected borders
    for cnt in contours:
        color = np.random.randint(0,255,(3)).tolist()  # Select a random color
        cv2.drawContours(drawing,[cnt],0,color,2)
    print "processing done"
    return drawing

def process(name,path):
    global o
    print "Started!!! processing "+name
    ratio=1#change according to image size
    o=cv2.imread(path+name)#open image
    print type(o)
    show("original",o)
    w,h=o.shape[1]/ratio,o.shape[0]/ratio#resize ratio for width and height
    new=cv2.resize(o,(w,h))#resize image
    #show("Resized",new)
    new=cv2.cvtColor(new,cv2.COLOR_RGB2GRAY)#grey scale image
    show("grey",new)
    cv2.imwrite("grey.jpg",new)
    new1 = cv2.GaussianBlur(new,(5,5),0)#gaussians Blurs Image
    show("blurred1",new1)
    cv2.imwrite("gblur_"+name,new1)#save image
    new2 = cv2.medianBlur(new,7)#Median Blurs Image
    show("blurred2",new1)
    cv2.imwrite("mblur_"+name,new2)#save image
    #new=cv2.equalizeHist(new,)#do image histogram equalisation to better the contrast
    #show("hist equal otsu",new)
    ##cv2.imwrite("otsu_"+name,new)#save image

    a,new=cv2.threshold(new,0,255,THRESH_TYPE | cv2.THRESH_OTSU)#OTSU thresholding
    show("otsu",new)
    cv2.imwrite("otsu_"+name,new)#save image
    return new,name



new,name=process("car9.jpg","C:\\Users\\XOR\\Desktop\\file\\")#Change the Name and path accordingly
new=cv2.Canny(new, 100,200)#canny edge detection technique
show("canny",new)
cv2.imwrite("canny_"+name,new)#save image
new=process_end(new)
show("blobed",new)
cv2.imwrite("blob_"+name,new)#save image
new=cv2.Sobel(new,-1,1,0,3,BORDER_WRAP)
show("sobel",new)
cv2.imwrite("sobel_"+name,new)#save image

私も(matlabで)流域アルゴリズムを試しましたが、それも役に立ちません。最初の 2 つの画像をセグメント化して、3 番目の画像と同様の結果を得る方法を探しています。

4

3 に答える 3

15

まず、検出セグメンテーションは 2 つの異なる問題です。まずは自分がやりたいことを決めてください。

問題が「単一画像からの車の検出」である場合、セグメンテーションでは実行できません。画像を部分に分割し、別のアプローチ (最大の分割領域を取る) を使用して、画像内の車を見つけることができますが、すべての画像で機能するとは限りません。それが流域アルゴリズムが機能しなかった理由です。セグメンテーションアルゴリズムは、画像をセグメント化するだけで、特定のオブジェクト/領域を提供しません。たとえば、表示されている画像を見ると、領域に分割されていますが、どの領域がどれであるかはわかりません。

画像

画像内の車を検出したい場合は、この問題をオブジェクト検出問題としてアプローチする必要があります。このリンクは、車の検出の問題に関する情報を提供します。それに関する 2 つの論文と、アプローチをテストするためのデータベースがあります。

それが役に立てば幸い..

于 2013-10-25T13:51:24.630 に答える
2

@GilLeviが言っているように、検出問題のために車の一連のグローバル機能を学習したら、色分布、形状テンプレート、ロゴなど、より具体的な機能に基づいて車のクラスのサブラベルを作成でき、セマンティック イメージ セグメンテーションの別のクラス。調整に多くの変数を必要とするセグメンテーション固有のアプローチに焦点を当てるよりも、学習部分から大きな利益を得ることができます。車の別のデータセット: http://lear.inrialpes.fr/people/marszalek/data/ig02/

于 2013-10-31T17:23:31.737 に答える