在此图像中找到几乎圆形的亮像素带

时间:2015-07-15 14:46:48

标签: matlab image-processing

这是我遇到的问题:我有一个如下图所示的图像。我想检测一下我用红线标记的圆形区域(这个特别明亮的环)。

enter image description here

最初,这就是我现在所做的:(MATLAB)

binaryImage = imdilate(binaryImage,strel('disk',5)); 
binaryImage = imfill(binaryImage, 'holes'); % Fill holes.
binaryImage = bwareaopen(binaryImage, 20000); % Remove small blobs.
binaryImage = imerode(binaryImage,strel('disk',300));
out = binaryImage;
img_display = immultiply(binaryImage,rgb2gray(J1));
figure, imshow(img_display);

enter image description here

输出似乎在对象的一个​​部分上被剪切(对于不同的图像作为输入,而不是上面显示的图像)。我希望输出的方式是对称的(当它旋转时,它并不总是一个完美的圆形)。

我想严格避免im2bw,因为一旦我二进制化,我就会失去很多关于形状的信息。

这就是我的想法:

我可以检测到图像的最外圆(几乎圆形)轮廓(以黄色显示)。从这里,我可以找到质心,也许找到一个半径为50%的圆圈(找到红色所示的区域)。但由于物体略微倾斜,因此不会完全对称。我该如何解决这个问题?

我附加了另一个图像,其中物体略微倾斜here

1 个答案:

答案 0 :(得分:6)

我尝试使用'log'过滤器。您想要的区域基本上是二阶导数的低值(即斜率下降的位置),您可以使用对数滤波器检测这些区域并找到负值。这是您可以做的基本概要,然后根据您的需要进行调整。

img = im2double(rgb2gray(imread('wheel.png')));
img = imresize(img, 0.25, 'bicubic');

filt_img = imfilter(img, fspecial('log',31,5));
bin_img = filt_img < 0;

subplot(2,2,1);
imshow(filt_img,[]);

% Get regionprops
rp = regionprops(bin_img,'EulerNumber','Eccentricity','Area','PixelIdxList','PixelList'); 
rp = rp([rp.EulerNumber] == 0 & [rp.Eccentricity] < 0.5 & [rp.Area] > 2000);

bin_img(:) = false;
bin_img(vertcat(rp.PixelIdxList)) = true;
subplot(2,2,2);
imshow(bin_img,[]);

bin_img(:) = false;
bin_img(rp(1).PixelIdxList) = true;
bin_img = imfill(bin_img,'holes');

img_new = img;
img_new(~bin_img) = 0;

subplot(2,2,3);
imshow(img_new,[]);

bin_img(:) = false;
bin_img(rp(2).PixelIdxList) = true;
bin_img = imfill(bin_img,'holes');

img_new = img;
img_new(~bin_img) = 0;

subplot(2,2,4);
imshow(img_new,[]);

输出:

enter image description here