I am trying to segment cars from image that consist of only one car and an easy background like
but what I get from my implementation is this
and
respectively
but it works very easily on almost already segmented images like.
giving results like
The Code I am using is
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
I have tried the watershed algorithm (on matlab) too but it also doesn't help. I'm looking for a way to segment the first two images that gives a result similar to third one.
First of all, Detection and Segmentation are two different problems. First decide which one you wanna do.
If your problem is 'Car Detection From Single Image', you can't do it by segmentation. You can segment image into parts and by using another approach (take the biggest segmented region) you can find the car in the image, but I'm sure it won't work for all images. That's why watershed algorithm didn't work. Segmentation algorithms just segments the image doesn't give you particular object/region in it. For example if you look at the image shown, it is segmented into regions, but you can't know which region is which.
,
If you want to detect cars in images, you need to approach this problem as object detection problem. This link will provide you some information about car detection problem. It has two papers about it and a database to test approaches.
Hope it helps..
For car detection I would use latern svm detector with the "Car" model:
http://docs.opencv.org/modules/objdetect/doc/latent_svm.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With