【问题标题】:Image processing Low Pass Filter in MatlabMatlab中的图像处理低通滤波器
【发布时间】:2021-06-25 06:15:33
【问题描述】:

我正在尝试在 matlab 中创建低通滤波器

我有一个大小为 12x6 的矩阵

56  147 56  52  147 52;
50  146 46  56  141 53;
59  142 145 147 147 46;
60  147 147 145 145 47;
52  145 35  47  146 52;
54  142 46  50  145 45;
56  52  56  52  56  52;
54  142 146 147 145 45;
59  142 53  45  147 46;
60  147 53  45  145 47;
52  145 124 145 142 52;
35  146 50  51  53  141;

掩码为 1/25(那些矩阵值为 1)

首先我检查了矩阵到图像

M = [
56  147 56  52  147 52;
50  146 46  56  141 53;
59  142 145 147 147 46;
60  147 147 145 145 47;
52  145 35  47  146 52;
54  142 46  50  145 45;
56  52  56  52  56  52;
54  142 146 147 145 45;
59  142 53  45  147 46;
60  147 53  45  145 47;
52  145 124 145 142 52;
35  146 50  51  53  141;
];
f=uint8(M);
figure;imshow(f);title('Image from matrix');

图像看起来很小,因为矩阵大小也很小。

然后我用下面的代码做了这个迭代:

a=f;
b = size(M); % check size my matrix
n=5;
n1=ceil(n/2);

lpf=(1/n^2)*ones(n) % multiply with ones values of matrix;


c=0;
h=0;
for i=n1:b(1)-n1
    for j=n1:b(2)-n1
        p=1;
        for k=1:n
            for l=1:n
            c=c+a(i-n1+k,j-n1+l)*lpf(l,l);
            end
        end
        d(i,j)=c;
        c=0;
    end
end
e=uint8(d);
figure;imshow(e);title('low pass image');

结果存储在 e 变量中,当我检查它时,我的矩阵变得比以前更小,大小变为 9x3:

0   0   0
0   0   0
0   0   105
0   0   105
0   0   97
0   0   97
0   0   89
0   0   90
0   0   97

我错过了什么吗?

【问题讨论】:

  • 您能解释一下为什么您期望得到不同的结果吗?您的原始矩阵大小为 12x6。新矩阵由d(i,j)=c; 和n1 <= i <= 12 - n1 和n1 <= j <= 9 - n1 和n1 = ceil(n/2) = 3 创建。预期结果是一个大小为 7x1 的矩阵。您可以在从第三行开始的第三列中找到结果:105 105 97 97 89 90 97

标签: image matlab image-processing


【解决方案1】:

您正在将过滤器应用于设置了所有值的图像区域。这意味着您要裁剪左侧的两列,右侧的两列,顶部的两行和底部的两行。您的代码中有两个错误

  1. 您剪裁了多余的一行和一列。
  2. 您隐式地在左侧和顶部用零填充结果。

此外,您应该预先分配矩阵。

这是一个修复

clear;
M = [
56  147 56  52  147 52;
50  146 46  56  141 53;
59  142 145 147 147 46;
60  147 147 145 145 47;
52  145 35  47  146 52;
54  142 46  50  145 45;
56  52  56  52  56  52;
54  142 146 147 145 45;
59  142 53  45  147 46;
60  147 53  45  145 47;
52  145 124 145 142 52;
35  146 50  51  53  141;
];

f = uint8(M);

a=f;
b = size(M);

n=5;
n1=ceil(n/2);

lpf=(1/n^2)*ones(n);

c=0;
h=0;
d = zeros(b(1) - 2 * n1 + 2, b(2) - 2 * n1 + 2);
for i=n1:b(1)-n1+1
    for j=n1:b(2)-n1+1
        for k=1:n
            for l=1:n
                c=c+a(i-n1+k,j-n1+l)*lpf(l,l);
            end
        end
        d(i - n1 + 1, j - n1 + 1)=c;
        c=0;
    end
end
e=uint8(d);

如果您希望结果保持原始图像的大小,您必须选择边缘策略。常见的策略是零填充、使用最后一个值填充或循环填充,但策略很大程度上取决于用例。

Here你可以找到更多细节。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2021-03-08
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多