如何在 MATLAB 中检测这张图片中某个角度下物体的尺寸?

How can I detect the dimensions of an object under an angle in this picture in MATLAB?

我有这张电池图片:

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

我在考虑这些算法步骤:

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

谢谢

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

1。读图

使用imread to read the image into a 3D matrix. For convenience, we convert it to double in the range [0..1] using im2double:

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

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

>> size( img )
ans =
    1024         768           3

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

2。转换为黑白(a.k.a 阈值)

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

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

有关详细信息,请参阅 max and min
还有其他方法可以对图像进行阈值处理,有关详细信息,请参阅 graythresh

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

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

通常使用 morphological operations 来改善阈值处理结果。
您可以使用 imclose:

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

结果为:

3。找到旋转角度

一个非常用于处理和处理黑白图像的有用命令是regionprops. It allows you to get all sorts of nice properties. You are going to use it to compute the '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) 像素。