【问题标题】:How to calculate the BLOB size in centimeter, millimeter in a binary image? [duplicate]如何计算二进制图像中以厘米、毫米为单位的 BLOB 大小? [复制]
【发布时间】:2017-05-08 18:43:47
【问题描述】:

我有一个二进制图像,其中包含大小不同的 BLOB。
Input Image

我可以使用 nnz() 计算面积,它计算了白色像素的数量。

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

但我想知道它们以厘米或毫米为单位的值。

有可能吗?

怎么做?

【问题讨论】:

  • 简单地,根据参考尺寸的网格校准输入并使用这种 px 尺寸直接转换为 [mm^2]。
  • 对不起。无法理解。有代码吗?还是我应该手动测量? @user3666197
  • 您需要知道物体平面中的像素有多大。获得该尺寸的最简单方法是捕获已知尺寸的东西,然后计算像素以获得转换因子...

标签: matlab image-processing


【解决方案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 厘米,使用二进制数字图像,您无能为力来消除此错误。

【讨论】:

    【解决方案2】:

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

    注意:当然,这一切都假定此标头信息已设置为适当的值,而不仅仅是默认值或在任何时候任意设置或修改。这就是为什么图像的来源很重要,以及它是否值得信赖(例如来自某些医学成像设备或软件)。

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2023-03-11
      • 1970-01-01
      • 2013-01-20
      • 2013-10-12
      • 2021-07-04
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多