我正试图在[交通灯检测和识别]上实施这篇论文。到目前为止,我已在图像中找到斑点(使用regionprops
),然后检查符合条件的斑点:
我完成了尺寸比例和无孔。
我使用的输入图像是:Original Image。我已应用顶帽算子imtophat
,使用Otsu阈值方法graythresh
对其进行二值化,并使用blob获得this image(包含满足尺寸比率和无孔标准的blob)在图像中。)
现在我坚持使用Convex Approximation
,我正试图找到足够凸起的斑点,以便被接受作为红绿灯的候选者。我应该如何检查检测到的斑点是否凸出足以被接受?
答案 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)
会得到你:
接下来,我们删除了线条/方形结构,实际上它们具有非常强的强度,可能会影响我们的进一步结果:
se = strel('line',20,0);
I = imtophat(I,se);
figure,imshow(I)
你将拥有:
在下一步中,我们试图找出图像中的局部最大值:
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
你会看到:
事实上红灯已被标记(我在原始图像中看到了另一个红点,但我认为这是一个红色指针形状的行走标志,而不是圆形红光,所以在此我不会考虑那部分。)
最后,我们使用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))
结果: