在图像处理中逼近凸

时间:2013-12-21 20:01:53

标签: matlab image-processing computer-vision convex-hull

我正试图在[交通灯检测和识别]上实施这篇论文。到目前为止,我已在图像中找到斑点(使用regionprops),然后检查符合条件的斑点:

  1. 尺寸比率
  2. 没有洞
  3. 凸面近似
  4. 我完成了尺寸比例和无孔。

    我使用的输入图像是:Original Image。我已应用顶帽算子imtophat,使用Otsu阈值方法graythresh对其进行二值化,并使用blob获得this image(包含满足尺寸比率和无孔标准的blob)在图像中。)

    现在我坚持使用Convex Approximation,我正试图找到足够凸起的斑点,以便被接受作为红绿灯的候选者。我应该如何检查检测到的斑点是否凸出足以被接受?

1 个答案:

答案 0 :(得分:3)

我担心处理后(第2张图片链接)无法从图像中获得良好效果。我尝试使用稍微不同的方法来提取原始图像中的红光。希望它可以帮助你一点点。 首先,您可能需要将RGB转换为Lab space。实际上它非常适合处理该空间中的图像,并且一些操作可以最大化红光和绿光之间的差异。由于图像中只有红灯,我不会那么复杂。我只使用b通道进行进一步处理。

file='https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn1/1524779_10153642995125182_414999862_n.jpg';
I=imread(file);Irgb=I;

colorTransform = makecform('srgb2lab');
I = applycform(I, colorTransform);
b = I(:,:,3);
I=double(b);
Imin=min(I(:));
Imax=max(I(:));
I=(I-Imin)/(Imax-Imin);
imshow(I)

会得到你:

enter image description here

接下来,我们删除了线条/方形结构,实际上它们具有非常强的强度,可能会影响我们的进一步结果:

se = strel('line',20,0);
I = imtophat(I,se);
figure,imshow(I)

你将拥有:

enter image description here

在下一步中,我们试图找出图像中的局部最大值:

roi=20;thresh=0.5;
local_extr = ordfilt2(I, roi^2, ones(roi)); 
% Get local maxima and reject candidates below a threshold
result = (I == local_extr) & (I > thresh);
% Get indices of extrema
[r, c] = find(result);
% Show them
figure;imshow(I, []); hold on;
plot(c, r, 'r.');hold off

你会看到:

enter image description here

事实上红灯已被标记(我在原始图像中看到了另一个红点,但我认为这是一个红色指针形状的行走标志,而不是圆形红光,所以在此我不会考虑那部分。)

最后,我们使用regionprops eccentricity属性,找出偏心率最小的区域,它看起来更像圆形:

for i=1:length(c)

    I1=I(r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi);
    I1=im2bw(I1);

    labeledImage = bwlabel(I1);
    blobMeasurements = regionprops(labeledImage,'eccentricity'); 
    if isempty(blobMeasurements)
        e(i)=Inf;
    else
        e(i)=blobMeasurements.Eccentricity;
    end

end
[a,idx]=min(e);

res = zeros(size(I,1),size(I,2),3); 
i=idx;
res( r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi ,1) = Irgb(r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi,1);
res( r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi ,2) = Irgb(r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi,2);
res( r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi ,3) = Irgb(r(i)-roi:r(i)+roi,c(i)-roi:c(i)+roi,3);
figure,imshow(uint8(res))

结果:

enter image description here