尝试实现imfilter,但是图片变红了
Trying to implement imfilter, but the image turns red
所以我想在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);
现在,正常图像就可以了。但是输出像这样变成红色:
知道哪里出了问题吗?
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);
如果你觉得更舒服,你可以在其他两个波段上生成一个循环 - 但那样会慢得多。
编辑
冒号运算符 :
return 是该维度中矩阵的所有元素。例如。对于二维矩阵 A
,A(:,2)
将 return A
的第二列。同样,对于 3 维矩阵 A(2,5,:)
将 return 沿 3. 维度(向量)的所有元素。另请注意 A(2,5)
与 A(2,5,1)
.
隐式相同
在您的情况下,gambardouble(i-1:i+1,j-1:j+1)
将 return 是 3 维矩阵的第 1 层(红色)的 3x3 window。通过将其更改为 gambardouble(i-1:i+1,j-1:j+1,:)
您会喜欢上面的示例,并且在其他图层中也会获得相同的像素。因此,在您的情况下,temp
将是一个 3x3x3 立方体。
sum(temp,1)
沿 1. 维度对立方体求和,return 形成一个 1x3x3 矩阵。然后,通过使用 sum(... , 2)
沿 2. 维度求和,将其转换为 1x1x3 向量,其中每个元素属于一个波段。
gambarfinal(i,j,:)
是位置 (i,j)
的 RGB 值,我们将其替换为新值。
有关详细信息,请阅读 colon documentation
所以我想在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);
现在,正常图像就可以了。但是输出像这样变成红色:
知道哪里出了问题吗?
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);
如果你觉得更舒服,你可以在其他两个波段上生成一个循环 - 但那样会慢得多。
编辑
冒号运算符 :
return 是该维度中矩阵的所有元素。例如。对于二维矩阵 A
,A(:,2)
将 return A
的第二列。同样,对于 3 维矩阵 A(2,5,:)
将 return 沿 3. 维度(向量)的所有元素。另请注意 A(2,5)
与 A(2,5,1)
.
在您的情况下,gambardouble(i-1:i+1,j-1:j+1)
将 return 是 3 维矩阵的第 1 层(红色)的 3x3 window。通过将其更改为 gambardouble(i-1:i+1,j-1:j+1,:)
您会喜欢上面的示例,并且在其他图层中也会获得相同的像素。因此,在您的情况下,temp
将是一个 3x3x3 立方体。
sum(temp,1)
沿 1. 维度对立方体求和,return 形成一个 1x3x3 矩阵。然后,通过使用 sum(... , 2)
沿 2. 维度求和,将其转换为 1x1x3 向量,其中每个元素属于一个波段。
gambarfinal(i,j,:)
是位置 (i,j)
的 RGB 值,我们将其替换为新值。
有关详细信息,请阅读 colon documentation