我按照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并且无法绘制。答案 0 :(得分:1)
正如其他人在评论中指出的那样,规范化图像,因为它确保每个通道的范围为0到255都是不好的。
使用适当的滤波器内核,在每个值被钳位在0到255之间的意义上归一化图像。但在实践中,由于way floating point numbers work,它可能是必要的或有用的。浮点数不能代表每个可能的实数,并且每个计算都会引入一些不准确性。这可能是255.00000003作为其中一个值的原因。
与许多信号处理算法一样,这个算法假定离散的时间/空间,但是连续的值。对这些算法进行推理并以数学方式描述它们要容易得多。
在计算机上,您没有连续值。图像使用离散值,通常为每个通道0到255之间的整数(每通道8位)。声音通常以每通道16位编码。
在绝大多数情况下,这是完全可以接受的,但它实际上是高斯滤波器输出后的另一个滤波器(尽管是非线性滤波器)。所以是的,从严格意义上讲,您可以在保存图像或在屏幕上显示时修改高斯滤镜的输出。