我有一个二进制图像,其中包含不同大小的BLOB
Input Image
我可以使用 nnz()
计算区域,计算出白色像素的数量。
% my code
C = imread( 'InputImage' );
C = im2bw( C );
carea = nnz( C );
disp( carea );
%
但我想知道它们的厘米或毫米值。
有可能吗?
如何?
答案 0 :(得分:1)
有一种方法可以估算/计算图像中对象的大小。
如果数字图像本身是您拥有的唯一信息,那么您无法知道。否则,您需要获得“空间校准系数”,不久之后,您将与具有已知大小的相机具有相同距离的对象成像并获得每厘米的像素,可以找到长答案:
https://www.mathworks.com/matlabcentral/answers/56087-how-can-i-find-the-spatial-calibration-factor
通常,这样的任务需要对象的分割和定位,但是,我认为,在你的问题图像中,它总是二进制的,只有一个白色对象。现在,您还需要知道,您的测量精度将受到离散化误差的限制。例如,如果您拍摄10.49米到10.49平方米的照片相对于相机位置,物体的照片,分辨率非常低(例如100像素,10像素),最多会出现0.5米误差,您可能会错过每2个维度49厘米,并使用二进制数字图像,你可以做很多事情摆脱这个错误。
答案 1 :(得分:1)
我不知道图像的来源是什么,但PNG文件具有编码分辨率的标题字段。您可以使用函数imfinfo
来获取此信息。对于你的形象,这就是我得到的:
>> info = imfinfo('czYGP.png')
info =
struct with fields:
Filename: 'czYGP.png'
FileModDate: '08-May-2017 15:00:13'
FileSize: 1275
Format: 'png'
FormatVersion: []
Width: 266
Height: 280
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: [137 80 78 71 13 10 26 10]
Colormap: []
Histogram: []
InterlaceType: 'none'
Transparency: 'none'
SimpleTransparencyData: []
BackgroundColor: []
RenderingIntent: 'perceptual'
Chromaticities: [0.3127 0.3290 0.6400 0.3300 0.3000 0.6000 0.1500 0.0600]
Gamma: 0.4545
XResolution: 3779
YResolution: 3779
ResolutionUnit: 'meter'
XOffset: []
YOffset: []
OffsetUnit: []
SignificantBits: []
ImageModTime: []
Title: []
Author: []
Description: []
Copyright: []
CreationTime: []
Software: []
Disclaimer: []
Warning: []
Source: []
Comment: []
OtherText: []
这里有趣的字段是'XResolution'
和'YResolution'
,每个'ResolutionUnit'
的像素都是'meter'
。使用此信息,我们可以计算图像的像素大小:
pixelSize = 100./[info.XResolution info.YResolution]; % In cm/pixel
pixelSize = 1000./[info.XResolution info.YResolution]; % In mm/pixel
现在,您所要做的就是将像素区域所获得的任何面积测量值相乘,如下所示:
carea = nnz(C)*prod(pixelSize);
注意:当然,这一切都假设此标头信息已设置为正确的值,而不仅仅是默认值或在任何位置任意设置或修改。这就是为什么图像的来源很重要,以及它是否值得信赖(如果它来自某些医学成像设备或软件)。