【发布时间】: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 度)。