对象(汽车)检测和分割

时间:2013-10-25 12:52:50

标签: matlab opencv image-processing edge-detection image-segmentation

我正在尝试从仅包含一辆汽车的图像中划分汽车,并使用简单的背景(例如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上),但它也无济于事。 我正在寻找一种方法来分割前两个图像,结果类似于第三个图像。

3 个答案:

答案 0 :(得分:14)

首先,检测细分是两个不同的问题。首先决定你想做哪一个。

如果您的问题是“从单张图片检测汽车”,则无法通过细分来实现。您可以将图像分割成零件并使用另一种方法(采用最大的分割区域),您可以在图像中找到汽车,但我确信它不适用于所有图像。这就是分水岭算法不起作用的原因。分割算法只是对图像进行分割,而不会为其提供特定的对象/区域。例如,如果您查看显示的图像,它会被分割成区域,但您无法知道哪个区域是哪个。

image

如果要检测图像中的汽车,则需要将此问题作为对象检测问题处理。这个link将为您提供有关汽车检测问题的一些信息。它有两篇关于它的论文和一个测试方法的数据库。

希望有所帮助......

答案 1 :(得分:3)

对于汽车检测,我会使用latern svm探测器和“Car”型号:

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

答案 2 :(得分:2)

我想@GilLevi说,一旦你学会了一套针对检测问题的汽车的全局特征,就可以根据更具体的特征产生汽车类别的子标题:颜色分布,形状模板,徽标等,并成为另一类语义图像分割。您仍然可以从学习部分获得大量收益,而不是专注于需要调整许多变量的分段特定方法。汽车的另一个​​数据集:http://lear.inrialpes.fr/people/marszalek/data/ig02/