【问题标题】:How can I detect the dimensions of an object under an angle in this picture in MATLAB? [closed]如何在 MATLAB 中检测这张图片中某个角度下物体的尺寸? [关闭]
【发布时间】:2015-11-20 12:51:18
【问题描述】:

我有这张电池图片:

我想确定电池的尺寸(以像素为单位)。
我遇到的问题是电池旋转了一个未知的角度。
如何检测这个旋转电池的尺寸?

我正在考虑这些算法步骤:

  • 首先,我必须将此图像转换为黑白图像(阈值处理)。
  • 之后,我必须找到一个中心点并在白色像素中绘制一个矩形。
  • 然后,我必须将矩形旋转 360 度并定位矩形的位置(以及尺寸)。

我有点缺乏经验,希望能得到一些关于如何在 Matlab 中实现这些算法阶段的指导。

谢谢

【问题讨论】:

  • 删除问题。在 Matlab 中阅读一些图像处理代码。尝试一些代码。如果它不起作用,请来这里,发布代码并向我们展示您尝试了什么以及为什么它不起作用。
  • 我认为这里的反对意见有点过于苛刻,尤其是考虑到答案的质量。在类似的情况下,我写了这个答案:stackoverflow.com/questions/29127181/… - OP 没有表现出太多的努力,但这个问题和答案一样得到了高度评​​价。对于那些投反对票的人,您至少应该考虑删除投反对票。这里有一个我不喜欢的明显的双重标准。
  • @rayryeng,恕我直言,这个问题值得一票否决,现在仍然如此。我可以对另一个说同样的话,我只能假设它在你出色的回答之后得到了大部分的支持。根据我的经验,一个糟糕的问题通常会因为一个很好的答案而得到很多不应该的支持。 IMO,答案应该被赞成,而不是问题......话虽如此,8个反对票似乎有点过分了。但是话又说回来,8 次投反对票意味着 8 人认为它很糟糕,并不是说它是只有 1 次投反对票的帖子的 8 倍。只是我的两分钱......
  • 还有 Shai:你的回答太棒了! =)
  • @StewieGriffin - 我倾向于同意你的评论。我现在可以看到了!

标签: matlab image-processing computer-vision image-segmentation edge-detection


【解决方案1】:

将此视为 Matlab 图像处理的初学者教程。阅读所用命令的文档并尝试了解它们在做什么以及为什么。

1。阅读图片

使用imread 将图像读入 3D 矩阵。为方便起见,我们使用im2double将其转换为[0..1]范围内的double:

>> img = im2double( imread( 'path/to/battety.jpg' ) );

您可以使用size 命令查看img 的大小:

>> size( img )
ans =
    1024         768           3

您可以从结果中看到,您的图像有 1024 行、768 列和 3 个通道(红色、绿色和蓝色)。

2。转换为黑白(也称为阈值)

如您所见,电池明显比背景亮且无色。我们可以选择最亮通道值与最暗通道值之间差距较大的像素作为“电池”像素:

>> bw = (max(img,[],3)-min(img,[],3)) > 0.2;

有关详细信息,请参阅 max 和 min。
还有其他方法可以对图像进行阈值处理,请参阅graythresh 了解更多详情。

使用imshow我们可以看到我们得到了什么:

>> imshow(bw,[],'border','tight');

通常使用morphological operations 来提高阈值结果。
你可以使用imclose:

>> bw = imclose( bw, ones(25) );

结果为:

3。求旋转角度

一个非常有用的用于处理和处理黑白图像的命令是regionprops。它允许您获得各种不错的属性。您将使用它来计算图像的“白色”/电池区域的'Orientation'

>> st = regionprops( bw, 'Orientation' )
st = 
Orientation: 52.8694

如您所见,电池旋转了 52.8 度。
使用imrotate“拉直”电池

>> rbw = imrotate( bw, -st.Orientation );

电池轴对齐后,您可以使用any 将白色像素“投影”到水平和垂直轴上:

>> pc = any( rbw, 2 ); %// project all rows into a single column 
>> pr = any( rbw, 1 ); %// project all columns into a single row

现在您需要找到投影中设置为 1 的第一个和最后一个像素。为此使用find:

>> fx = find( pr, 1, 'first');  %// first x coordinate
>> tx = find( pr, 1, 'last');   %// last x coordinat
>> fy = find( pc, 1, 'first');  %// first y coordinate
>> ty = find( pc, 1, 'last');   %// last y coordinate  

一旦有了角的 x,y 坐标,就可以在旋转后的图像上绘制它们:

>> imshow(rbw,[],'border','tight');
>> hold on; 
>> plot( [fx tx tx fx fx], [fy fy ty ty fy], ':r', 'LineWidth',3);

产量:

坐标是:

>> [fx fy tx ty]
ans =
406   608   866   733

如您所见,您的电池长 (866-406) 像素,宽 (733-608) 像素。

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 2017-06-07
    • 2017-04-06
    • 2017-11-12
    • 1970-01-01
    • 2013-02-05
    • 2019-09-29
    相关资源
    最近更新 更多