【问题标题】:Find a nearly circular band of bright pixels in this image在这张图片中找到一个近乎圆形的明亮像素带
【发布时间】:2015-07-16 10:32:26
【问题描述】:

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

最初,这就是我现在所做的:(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);

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

我想严格避免使用 im2bw,因为一旦我二值化,就会丢失很多关于形状的信息。

这就是我的想法:

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

我附上了另一张图片,其中物体略微倾斜here

【问题讨论】:

  • 您的 Dropbox 上的图片与您在帖子中显示的图片不匹配。此外,您为圆阈值编写的代码,其输出与提取轮心不对应。事实上,它略微旋转并且是灰度的。在阈值并提取对象后,您是否进行了某种旋转?你也可以提供那个代码吗?
  • 你试过imfindcircles吗?
  • 另外,图像是否曾经有过很大程度的倾斜?如果是这种情况,那么 Rafael 对imfindcircles 的建议将不起作用,因为由于形状相对于相机方向的单应性,圆圈将更像椭圆形。 imfindcircles 假设圆圈非常“扁平”。
  • @rayryeng 是的,我已经尝试过 imfindcircles,即使通过降低“灵敏度”参数也是如此。它没有检测到该区域中的任何圆圈。另外,我在 Dropbox 上发布了一张不同的图片(抱歉忘了提),算法也必须适用。我显示的图像似乎很好(几乎是圆形的)。获得的输出相当不错。我显示的输出是另一个倾斜的图像(大约 +/- 20 度)。

标签: matlab image-processing


【解决方案1】:

我会尝试使用'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,[]);

输出:

【讨论】:

  • 在 Log 过滤器上非常好用!你会在图像处理标签中为我的钱而竞争:)
  • @jucestain 哇!非常感谢!这似乎完成了我的工作。我首先想对其他图像(倾斜的)进行测试并回复您。再次,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2017-08-05
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多