【问题标题】:How to make a Gaussian filter in MatlabMatlab中如何制作高斯滤波器
【发布时间】:2012-10-22 23:52:53
【问题描述】:

我尝试在 Matlab 中制作高斯滤波器,而不使用 imfilter()fspecial()。 我已经尝试过了,但结果与使用 imfilter 和 fspecial 的结果不同。

这是我的代码。

function Gaussian_filtered = Gauss(image_x, sigma)

% for single axis
% http://en.wikipedia.org/wiki/Gaussian_filter
Gaussian_filtered = exp(-image_x^2/(2*sigma^2)) / (sigma*sqrt(2*pi)); 
end

对于二维高斯,

function h =  Gaussian2D(hsize, sigma)

n1 = hsize;
n2 = hsize;

for i = 1 : n2 
        for j = 1 : n1
        % size is 10;
        % -5<center<5 area is covered.
        c = [j-(n1+1)/2 i-(n2+1)/2]';                
        % A product of both axes is 2D Gaussian filtering
        h(i,j) = Gauss(c(1), sigma)*Gauss(c(2), sigma);        
        end
    end
end

最后一个是

function Filtered = GaussianFilter(ImageData, hsize, sigma)

%Get the result of Gaussian
filter_ = Gaussian2D(hsize, sigma);

%check image
[r, c] = size(ImageData);
Filtered = zeros(r, c);    

for i=1:r
    for j=1:c
        for k=1:hsize
            for m=1:hsize
                    Filtered =  Filtered + ImageData(i,j).*filter_(k,m);    
            end
        end
    end
end
end

但处理后的图像与输入图像几乎相同。不知道最后一个函数GaussianFiltered()有问题...

谢谢。

【问题讨论】:

  • 什么不只是使用fspecial 来生成你的高斯内核,然后也许imfilter 来应用它?
  • 你至少可以使用 conv2(image, gaussian_kernel, 'same'); ?

标签: image matlab gaussian


【解决方案1】:

这里有一个替代方案:

创建二维高斯:

  function f=gaussian2d(N,sigma)
  % N is grid size, sigma speaks for itself
 [x y]=meshgrid(round(-N/2):round(N/2), round(-N/2):round(N/2));
 f=exp(-x.^2/(2*sigma^2)-y.^2/(2*sigma^2));
 f=f./sum(f(:));

过滤后的图片,假设您的图片名为Im

 filtered_signal=conv2(Im,gaussian2d(N,sig),'same');

这里有一些情节:

imagesc(gaussian2d(7,2.5))

 Im=rand(100);subplot(1,2,1);imagesc(Im)
 subplot(1,2,2);imagesc(conv2(Im,gaussian2d(7,2.5),'same'));

【讨论】:

  • 好的,非常感谢。但它也使用Matlab函数meshgrid..有没有办法在不使用meshgrid()的情况下制作高斯?还是谢谢!!!
  • 我想制作一个没有任何原始matlab函数的高斯滤波器matlab代码...
  • meshgrid 矩阵可以用任何语言轻松创建。这就是为什么在许多语言中你都有网格网格(你会在 python、java 等中找到它)。
  • 没有conv2也可以吗?
  • 问题是关于高斯滤波器的。 conv2 只是一种使用它的方法,因此创建 2D 高斯矩阵不需要它。那么你的问题是什么?
【解决方案2】:

由于 for 循环,此示例代码很慢。在 matlab 中,您可以更好地使用 conv2,如 user:bla 所建议的那样,或者只使用 filter2。

I = imread('peppers.png'); %load example data
I = I(:,:,1);
N=5; %must be odd
sigma=1;
figure(1);imagesc(I);colormap gray
x=1:N;
X=exp(-(x-((N+1)/2)).^2/(2*sigma^2));
h=X'*X;
h=h./sum(h(:));
%I=filter2(h,I); %this is faster
[is,js]=size(I);
Ib = NaN(is+N-1,js+N-1); %add borders
b=(N-1)/2 +1;
Ib(b:b+is-1,b:b+js-1)=I;
I=zeros(size(I));
for i = 1:is
    for j = 1:js
        I(i,j)=sum(sum(Ib(i:i+N-1,j:j+N-1).*h,'omitnan'));
    end
end
figure(2);imagesc(I);colormap gray

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 2023-04-09
    • 1970-01-01
    • 2013-03-29
    • 2014-07-21
    • 2017-04-20
    • 2019-01-31
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多