【问题标题】:Converting an image double to logical using a 5x5 window. MATLAB使用 5x5 窗口将图像双精度转换为逻辑图像。 MATLAB
【发布时间】:2014-12-07 01:37:12
【问题描述】:

我有一个双重图像,我的目标是将其转换为合乎逻辑的。我想创建 5x5 窗口并将其放在图像中的每个像素上。然后,我计算这 25 个像素的平均值。如果中心像素值大于平均值,则为 1,否则为 0。

我该怎么做?

附:我不想这样做:

IM[i - 2, j - 2]
IM[i - 1, j - 2]
IM[i, j - 2]
IM[i + 1, j - 2]
IM[i + 2, j - 2]
      .
      .

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    几种方法(运行时间可能按降序排列):

    1. nlfilter:

      result = nlfilter(im, [5 5], @(x) x(3,3)>mean(x(:)));
      
    2. blockproc:

      result = blockproc(im, [1 1], @(x) x.data(3,3)>mean(x.data(:)), ...
          'Bordersize', [2 2], 'Trimborder', 0);
      

      请注意,blockproc 我们需要指定大小为 1x1 的块(以便块在每个方向上从一个像素“移动”到另一个像素),每个方向上围绕 wach 像素的大小为 2 的边框(以获得 5x5 块) ,并防止函数结果被修剪,因为结果只是1个值。

    3. conv2:

      result = im > conv2(im, ones(5,5)/25, 'same');
      

    【讨论】:

    • 终于用上了!不错。
    • 是的!我的第二个回答是nlfilter :-D
    • 哪个是第一个?
    • 它是this one。诚然,nlfilter 的使用不是很自然
    • 所有这些都很好,但我有一个问题。我不明白第三种方法。你创建了一个 5*5 的矩阵,但我不明白这个矩阵怎么能成为我们的窗口?
    【解决方案2】:

    如果我是对的,这似乎是一种异常方法。下面的代码可能是你想要的:

    mask   = 0.04 * ones(5); mask(3, 3) = 0; % // mask is for average the double image
    avgIm  = filter2(mask, imd); % // imd is your double image.
    output = imd > avgIm;
    

    【讨论】:

    • 在此代码中,我正在计算所有邻居的平均值(除当前像素外的 24 个像素)。可以注释掉“mask(3, 3) = 0;”部分
    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多