matlab - 物体(汽车)检测与分割

标签 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 上),但它也无济于事。 我正在寻找一种方法来分割前两张图像,以提供类似于第三张图像的结果。

最佳答案

首先,检测分割是两个不同的问题。首先决定你想做什么。

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

image ,

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

希望对你有帮助..

关于matlab - 物体(汽车)检测与分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590444/

相关文章:

linux - MATLAB 无法使用网络摄像头

image - 将图像上传到 S3,然后在 node.js 中调整大小

math - 如何标准化图像?

Matlab,fread,加速读取多种数据类型和多种采样率的文件

matlab - 对矩阵中特定列的数据进行分组和绘图

matlab - 从帧生成较小的视频文件大小

c++ - 用图像或视频填充 OpenCV (OpenFrameworks) 中的 Blob

python - 如何使用 OpenCV 确定对象是浮雕还是凹陷?

opencv - 如何在 opencv python 中将 rgb 图像转换为 ycrcb 颜色空间

image-processing - Julia 的索贝尔算子