我有这个电池的图像:
我想确定电池的尺寸(以像素为单位) 我遇到的问题是电池旋转了一个未知的角度 如何检测此旋转电池的尺寸?
我在考虑这些算法步骤:
我有点缺乏经验,我很感激如何在Matlab中实现这些算法阶段。
由于
答案 0 :(得分:40)
将此视为Matlab图像处理的初学者教程。阅读所用命令的文档,然后尝试了解他们正在做什么以及为什么。
使用imread
将图像读入3D矩阵。为方便起见,我们使用im2double
将其转换为[0..1]范围内的double
:
>> img = im2double( imread( 'path/to/battety.jpg' ) );
您可以使用size
命令查看img
的大小:
>> size( img )
ans =
1024 768 3
您可以从结果中看到您的图片有1024行,768列和3个频道(红色,绿色和蓝色)。
正如您所看到的,电池明显比背景亮,并且是无色的。我们可以选择在最亮通道值与最暗通道值之间存在较大间隙的像素为"电池"像素:
>> 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) );
结果:
用于处理和处理bw图像的非常有用命令是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)像素。