matlab - 在此图像中找到一个近乎圆形的明亮像素带

标签 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

最佳答案

我会尝试使用 '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

关于matlab - 在此图像中找到一个近乎圆形的明亮像素带,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31433655/

相关文章:

algorithm - 可接受的共识集,RANSAC?

c++ - c++ 中 "Matlab besselk(x,y,1)"的确切等价物是什么?

Matlab:创建稀疏矩阵的聪明方法

c++ - Affectiva情感SDK - 调用.setLicensePath()和setClassifierPath()时抛出异常

ios - 在 IOS 中像 X-Ray 一样扫描图像

php - 通过图像上传的恶意代码

python - 如何获得 3-D 阵列中局部最大值周围的区域?

matlab - 从结构数组中删除元素

MATLAB 在 for 循环内更改变量

c - 如何从 C 调用 MATLAB 代码?