我正在尝试从仅包含一辆车和简单背景的图像中分割汽车,如
但是我从我的实现中得到的是这个
和
分别
但它非常容易处理几乎已经分割的图像,例如。
给出类似
的结果
我使用的代码是
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 上),但它也无济于事。 我正在寻找一种方法来分割前两张图像,以提供类似于第三张图像的结果。
最佳答案
首先,检测和分割是两个不同的问题。首先决定你想做什么。
如果您的问题是“从单个图像检测汽车”,则无法通过分割来完成。您可以将图像分割成多个部分,并通过使用另一种方法(采用最大的分割区域)可以在图像中找到汽车,但我敢肯定它不适用于所有图像。这就是分水岭算法不起作用的原因。分割算法只是分割图像,不会为您提供其中的特定对象/区域。例如,如果您查看显示的图像,它被分割成多个区域,但您无法知道哪个区域是哪个区域。
,
如果你想检测图像中的汽车,你需要将这个问题作为目标检测问题来处理。这link将为您提供有关汽车检测问题的一些信息。它有两篇关于它的论文和一个测试方法的数据库。
希望对你有帮助..
关于matlab - 物体(汽车)检测与分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590444/