试图实现imfilter,但图像变红

问题描述 投票:2回答:1

所以我想在matlab中实现imfilter,而不使用函数本身。这是我到现在为止所做的事情:

   % Menampilkan gambar sebelum di smoothing
    gambar = imread('bird.jpg');
    ukuran = size(gambar);
    figure
    imshow(gambar)

    % Menampilkan gambar setelah di smoothing
    gambardouble = im2double(gambar);
    filter = ones(3) * 1/9;
    gambarfinal = zeros(ukuran);

for i = 2:ukuran(1)-1
    for j = 2:ukuran(2)-1
        temp= gambardouble(i-1:i+1,j-1:j+1) .* filter;
        gambarfinal(i,j) = sum(temp(:));
    end
end

disp(gambarfinal);
figure
imshow(gambarfinal);

现在,正常的图像很好。但输出变成这样的红色:enter image description here

出了什么问题?

matlab image-processing smoothing
1个回答
2
投票

gambar似乎是一个RGB图像,大小为NxMx3。在gambarfinal = zeros(ukuran);中,您生成一个大小为NxMx3的零矩阵。但是,您只将滤镜应用于红色波段,将其他两个波段设为零=黑色,从而产生红色图像。

要将过滤器应用于其他波段,您可以例如立即对所有3个波段应用滤波器:

...

% generate 3-d filter
filter = ones(3,3,3) * 1/9;

...

% extract a 3x3x3 cube instad of a 3x3 patch
temp= gambardouble(i-1:i+1,j-1:j+1,:) .* filter;

% sum first along 1. dimension, then along the 2.dimension. This gives a 1x1x3 column.
gambarfinal(i,j,:) = sum(sum(temp,1),2); 

如果你觉得它更舒服,你可以在其他两个乐队上产生一个循环 - 但这会慢得多。

Edit

冒号运算符:返回该维度中矩阵的所有元素。例如。对于二维矩阵AA(:,2)将返回第二列A。同样,对于3维矩阵,A(2,5,:)将返回沿3.维度(向量)的所有元素。另请注意,A(2,5)隐含与A(2,5,1)相同。

在你的情况下,gambardouble(i-1:i+1,j-1:j+1)将返回3维矩阵的1层(红色)的3x3窗口。通过将其更改为gambardouble(i-1:i+1,j-1:j+1,:),您将希望上面的示例在其他图层中获得相同的像素。因此,在您的情况下,temp将是一个3x3x3立方体。

sum(temp,1)沿着1.维度对立方体求和,返回1x3x3矩阵。然后通过使用sum(... , 2)沿着2.维度获取总和,将其转换为1x1x3向量,其中每个元素属于一个带。

gambarfinal(i,j,:)(i,j)位置的RGB值,我们用新值替换它们。

有关更多信息,请阅读colon documentation

© www.soinside.com 2019 - 2024. All rights reserved.