我目前正在Matlab上编写一个用于图像处理的程序。我正在使用图像(下方)来尝试计算图像中的白色汽车数量。我使用过滤命令,strel(磁盘,2),并设法检测图像中的两辆白色汽车,但由于二进制图像(下图)显示汽车的方式,它将一辆汽车计为两辆。
是否有任何解决方案可以解决这个问题,或者我是否应该使用任何特定的方法来替代下面的代码?
a = imread('Cars2.jpg'); %Read the image Car1.jpg
subplot(3,3,1), imshow (a); %Display RGB image Car1.jpg
b = rgb2gray(a); %Turn Car1 from RGB to greyscale
subplot(3,3,2), imshow (b); %Display greyscale image Car1.jpg
c = graythresh (a); %Automatically set appropriate threshold for foreground & background (Otsu's Method)
d = im2bw (b,0.8); %Convert from greyscale to binary image
subplot (3,3,3), imshow(d); %Display binary image Car1.jpg
subplot(3,3,4), imhist (b,256); %Display histogram for greyscale values (image, samples)
SE = strel ('disk',2); %Set Disk radius for filtering unnecessary pixels
e = imopen (d,SE); %Erode then Dilate image with Disk radius
subplot (3,3,5), imshow(e); %Display openned/filtered image Car1.jpg
B = bwboundaries(e);
imshow(e)
text(10,10,strcat('\color{red}Objects Found:',num2str(length(B))))
hold on
编辑:因为我有10个以下的声誉,我无法发布代码中显示的图像,但理论非常通用,所以我希望你能理解我遇到的情况。图像类似于http://www.mathworks.co.uk/help/images/examples/detecting-cars-in-a-video-of-traffic.html
答案 0 :(得分:1)
我会使用bwboundaries
而不是regionprops(e)
。然后,您可以通过查看对象的区域和边界框的形状来使用一些额外的逻辑来推断对象是一个还是两个汽车。
如果您只对检测白色汽车感兴趣,可以通过将图像转换为HSV色彩空间并在饱和度和值通道上进行阈值处理而不是使用im2bw来改善整体算法。如果您有视频序列,我会使用vision.ForegroundDetector
或其他高斯混合模型分割技术进行分割。