3

Я пытаюсь сегмента автомобилей с изображения, состоящие только из одного автомобиля и простой фон, как
enter image description hereобъект (автомобиль) Обнаружение и сегментация


enter image description here


но что я получаю от моей реализации это
enter image description here


и
enter image description here


соответственно

, но она работает очень легко на почти уже сегментированные изображения нравится. enter image description here


дает такие результаты
enter image description here


код, я использую

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) тоже, но это также не помогает. Я ищу способ сегментировать первые два изображения, которые дают результат, похожий на третий.

+0

не забудьте проверить мой профайл и отправить мне по электронной почте. Я решил еще одну из ваших проблем, но вчера вы взяли ее, когда я отправлял решение! (проблема с подстрокой) – Michael

+0

@michael Я не могу найти ваш адрес электронной почты ... если вы не разместите его здесь? – adil

+0

[email protected] – Michael

ответ

14

Прежде всего, Обнаружение и Сегментация - две разные проблемы. Сначала решите, какой из них вы хотите сделать.

Если ваша проблема в 'Обнаружение автомобиля с одного изображения', вы не можете сделать это путем сегментации. Вы можете сегментировать изображение на части и используя другой подход (взять самый большой сегментированный регион), вы можете найти автомобиль на изображении, но я уверен, что он не будет работать для всех изображений. Вот почему алгоритм водораздела не сработал. Алгоритмы сегментации просто сегментируют изображение, которое не дает вам конкретного объекта/области в нем. Например, если вы посмотрите на показанное изображение, оно сегментируется в регионы, но вы не можете знать, какая именно область.

image,

Если вы хотите, чтобы обнаружить автомобили в изображениях, вы должны подойти к этой проблеме, как проблема обнаружения объекта. Это link предоставит вам некоторую информацию о проблеме обнаружения автомобиля. В нем есть две статьи об этом и база данных для тестирования подходов.

Надеюсь, это поможет.

+0

спасибо @guneykayi. Нет ли простого способа найти решение, не читая исследовательскую работу, а затем изучая все упомянутые там алгоритмы, потому что сейчас я больше концентрируюсь на машинах (из-за моего проекта)? – adil

+1

Жизнь не так проста! Если вы концентрируетесь на машинах, вы должны прочитать эти статьи и узнать все алгоритмы! – guneykayim

+0

Хорошо, тогда я прочту эти бумаги. спасибо за помощь – adil

3

Для обнаружения автомобиля я бы использовать Latern детектор SVM с моделью «Car»:

http://docs.opencv.org/modules/objdetect/doc/latent_svm.html

+0

На самом деле мне придется использовать нейронные сети в моей системе для классификации автомобилей (седаны, супы, хэтчбеки). Я ищу какой-то алгоритм кодирования, а не для обучения своей системы сначала для обнаружения объекта, а затем для классификации, но я посмотрю на это спасибо. – adil

2

Я думаю, как @GilLevi говорит, как только вы узнали набор глобальных функций для автомобилей для задачи обнаружения , можно произвести подклассу классов автомобилей на основе более конкретных функций: например, распределение цветов, шаблоны форм, логотипы и т. д., и станет еще одним классом сегментации семантического изображения. Вы по-прежнему в значительной степени выиграете от учебной части, чем сосредоточитесь на конкретном сегментированном подходе, который потребует много переменных для настройки. Другой набор данных с автомобилями: http://lear.inrialpes.fr/people/marszalek/data/ig02/

 Смежные вопросы

  • Нет связанных вопросов^_^