【问题标题】:Matlab - Image Filtering with a 5X5 Filter without imfilter functionMatlab - 使用没有 imfilter 功能的 5X5 过滤器进行图像过滤
【发布时间】:2018-04-25 17:19:41
【问题描述】:

我尝试修改代码 (Implementing IMFILTER in matlab) 以使用 5X5 高斯过滤器过滤图像。出了点问题,但我没找到。

     gauss_kernel = fspecial('gaussian',5,2);
        function [result] = evc_filter(input, kernel)


        rsize = size(input);

        r = zeros(rsize);

        original=padarray(input,[2,2]);

        for i = 3:rsize(1)+2
            for j = 3:rsize(2)+2           
                temp = original(i-2:i+2,j-2:j+2) .* kernel;
                r(i-2,j-2) = sum(temp(:));
            end
        end
result=r;
end

如果我使用 imshow 显示图片,如果我使用 imfilter 功能,它看起来会有所不同。有人可以帮忙吗?

【问题讨论】:

  • 你的内核是如何定义的?
  • fspecial('gaussian',5,2);
  • 使用 double(original) 将图像转换为双倍,然后执行剩余过程。
  • 感谢提示,但结果图片没有任何变化
  • 你永远不会在你的函数中定义result。这是因为从您的代码复制粘贴到这篇文章吗?

标签: matlab


【解决方案1】:

首先,将您的图像转换为双倍,然后执行其余过程。请参阅下面的示例代码:

function imfilt()
img = imread('one.jpg');
img = double(img);
[r,c,z] = size(img);
pad = 4;
nimg = zeros(r+pad,c+pad,z);
nimg(pad/2+1: r+pad/2, pad/2+1: c+pad/2,:) = img;
h = fspecial('gaussian',5,2);

res = zeros(r,c,z);
for i = pad/2+1 : r+pad/2
    for j = pad/2+1 : c+pad/2
        tmp = nimg(i-pad/2:i+pad/2,j-pad/2:j+pad/2,1).*h;
        res(i-pad/2,j-pad/2,1) = sum(tmp(:));
        tmp = nimg(i-pad/2:i+pad/2,j-pad/2:j+pad/2,2).*h;
        res(i-pad/2,j-pad/2,2) = sum(tmp(:));
        tmp = nimg(i-pad/2:i+pad/2,j-pad/2:j+pad/2,3).*h;
        res(i-pad/2,j-pad/2,3) = sum(tmp(:));
    end
end

imshow(uint8(res),[]);
end

【讨论】:

  • 我已经使用您的示例代码进行了尝试,并将其更改为我的变量,但我收到一条错误消息
  • 赋值的非单件右轴维度比非单件下标多
  • 您可能没有正确初始化某些变量。
  • 我只改了这一行:img = double(input);
  • 输入和内核的大小是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2023-03-24
  • 2018-12-17
相关资源
最近更新 更多