如何在 MATLAB 中检测这张图片中某个角度下物体的尺寸?
How can I detect the dimensions of an object under an angle in this picture in MATLAB?
我有这张电池图片:
我想确定电池的尺寸(以像素为单位)。
我遇到的问题是电池旋转了一个未知角度。
如何检测这个旋转电池的尺寸?
我在考虑这些算法步骤:
- 首先,我必须将此图像转换为黑白图像(阈值处理)。
- 之后,我必须找到一个中心点并在白色像素中绘制一个矩形。
- 然后,我必须将矩形旋转 360 度并定位矩形的位置(以及尺寸)。
我有点缺乏经验,希望能得到一些关于如何在 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) 像素。
我有这张电池图片:
我想确定电池的尺寸(以像素为单位)。
我遇到的问题是电池旋转了一个未知角度。
如何检测这个旋转电池的尺寸?
我在考虑这些算法步骤:
- 首先,我必须将此图像转换为黑白图像(阈值处理)。
- 之后,我必须找到一个中心点并在白色像素中绘制一个矩形。
- 然后,我必须将矩形旋转 360 度并定位矩形的位置(以及尺寸)。
我有点缺乏经验,希望能得到一些关于如何在 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) 像素。