【问题标题】:Normalizing an image after (gaussian) filtering在(高斯)滤波后对图像进行归一化
【发布时间】:2017-08-21 09:09:27
【问题描述】:

我按照 Nixon Aguado 的算法实现了一个高斯滤波器。 算法(在找到此处描述的模板后gaussian template)如下。

我相信伪代码是 MATLAB 风格的。

function convolved=convolve(image,template)
%New image point brightness convolution of template with image
%Usage:[new image]=convolve(image,template of point values)
%Parameters:image-array of points
% template-array of weighting coefficients
%Author: Mark S. Nixon
%get image dimensions
[irows,icols]=size(image);
%get template dimensions
[trows,tcols]=size(template);
%set a temporary image to black
temp(1:irows,1:icols)=0;

%half of template rows is
trhalf=floor(trows/2);
%half of template cols is
tchalf=floor(tcols/2);
%then convolve the template
for x=trhalf+1:icols-trhalf %address all columns except border
    for y=tchalf+1:irows-tchalf %address all rows except border
        sum=0;
        for iwin=1:trows %address template columns
            for jwin=1:tcols %address template rows
                sum=sum+image(y+jwin-tchalf-1,x+iwin-trhalf-1)* template(jwin,iwin);
            end
        end
        temp(y,x)=sum;
    end
end

%finally, normalise the image
convolved=normalise(temp); 

无论如何,让我担心的是最后一部分“正常化”。 我已经尝试过我的算法(用 C# 编写),一些像素的值是 255.00000003(显然大于 255)。我应该将结果“标准化”以将其扩大到 0-255 范围吗? 那不会修改图像(高斯除外) 我只是不希望这个操作涉及高斯滤波器,仅此而已。


编辑:我已经消除了“规范化”,它似乎运作良好,所以我不知道为什么这本书的作者推荐它。尽管如此,我还是担心如果由于某种原因出现 > 255 的某个值并且无法绘制,我的程序会崩溃。

【问题讨论】:

  • 我不确定您的目的是什么,但通常 MATLAB 支持强大的索引和数学运算,因此在大多数情况下您几乎可以完全摆脱手动循环。您通常不应该尝试在 MATLAB 中实现 C 风格的算法,因为您可以在较少的代码中高效地执行相同的操作。
  • 不幸的是,我被要求在 C# 中实现算法。我发布了 matlab 代码,因为这是作者使用的。我不为此使用 matlab 甚至 OpenCV。
  • @KansaiRobot 2 件重要的事情:1)人们不会对应用内核的结果进行规范化,人们会对内核进行规范化。如果内核 (template) 的所有值的总和等于 1,则输出已经归一化。 2)使用FFT来应用内核,不要用4个循环编码卷积。
  • @Wolfie 来自信号处理文献:OP 需要对内核进行规范化。只要 kenrel 不改变输入的规模,它就很好。 OP 并不真正想要规范化,就好像图像是 [0-156] 因为数据,他们不希望将其更改为 [0-255]。他们唯一想要的是内核不扩展输出
  • @AnderBiguri 同意,我在回答中错误地建议了这一点(我已将其删除)。如果 OP 想要将值 clip 到范围内,而不进行任何缩放,如果他们对自己的算法有信心,我只是提倡使用 min(max(temp,0),255)。正如你所说,不要标准化图像值!

标签: c# algorithm matlab gaussianblur


【解决方案1】:

正如 cmets 中的其他人所指出的那样,规范化图像以确保每个通道的范围为 0 到 255 是不好的。

归一化图像的每个值都被限制在 0 到 255 之间,这对于适当的过滤器内核来说是不必要的。但在实践中,由于way floating point numbers work,它可能是必要的或有用的。浮点数不能代表所有可能的实数,而且每次计算都会引入一些不准确性。这可能是 255.00000003 作为值之一的原因。

与许多信号处理算法一样,该算法假设时间/空间离散,但值连续。对这些算法进行推理并以数学方式描述它们要容易得多。

在计算机上,您没有连续值。图像使用离散值,通常是每个通道的 0 到 255 之间的整数(每个通道 8 位)。声音通常以每通道 16 位编码。

在绝大多数情况下,这是完全可以接受的,但它实际上是高斯滤波器输出之后的另一个滤波器(尽管是非线性滤波器)。所以是的,从严格意义上讲,您确实会修改高斯滤波器的输出,无论是在保存图像时还是在屏幕上显示时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2012-06-04
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2011-03-10
    相关资源
    最近更新 更多