2017-05-08 201 views
1

我有一个二进制图像,其中包含不同大小的BLOB。
Input Image
enter image description here
我可以计算使用nnz()其计算白色像素的数目的区域,。如何计算二进制图像中厘米,毫米的BLOB大小?

% my code 
C  = imread('InputImage'); 
C  = im2bw(C); 
carea = nnz(C); 
disp(carea); 
% 

但我想知道它们的厘米或毫米值。

可能吗?

怎么样?

+0

简单地说,根据参考大小的网格校准输入并使用这种px大小的直接转换为[mm^2]。 – user3666197

+0

对不起。无法理解。有没有任何代码?或者我应该手动测量它? @ user3666197 –

+1

您需要知道物体平面中像素的大小。获得该尺寸的最简单方法是捕获已知尺寸的东西,然后计算像素以获得转换因子...... – Piglet

回答

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

我不知道图像的来源是什么,但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); 

注意:当然,这一切都假设此头信息被设置为适当的值,而不仅仅是默认值或任意设置或修改任何点。这就是为什么图像的来源很重要,并且它是值得信赖的(就像它来自某些医学成像设备或软件)。