matlab - 尝试实现imfilter,但图像变成红色

标签 matlab image-processing smoothing

所以我想在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

知道哪里出了问题吗?

最佳答案

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); 

如果您觉得更舒服,您可以在其他两个频段上生成一个循环 - 但这会慢得多。

编辑

冒号运算符:返回该维度中矩阵的所有元素。例如。对于二维矩阵 A , A(:,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 矩阵。然后沿着 2. 维度也用 sum(... , 2) 求和。您将其转换为 1x1x3 向量,其中每个元素属于一个波段。

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

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

关于matlab - 尝试实现imfilter,但图像变成红色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48057528/

相关文章:

matlab - 在 MATLAB for 循环中恢复向量

image - 如何从此图像中删除此非红色和非圆形对象?把红色变成白色,其余的变成黑色

performance - 优化非常大的稀疏矩阵的秩计算

opencv - 是否有可能使两个灰度图像在统计上相等?

python - 一维数组的加权平滑 - Python

matlab - sgolay函数在Matlab R2013a中如何工作?

linux - 通过 SSH 访问 Matlab MDCS 集群

image-processing - 检查 OpenCV 中像素的透明度

image - Google 图像如何标准化每行的宽度?

objective-c - 使用 NSString drawAtPoint : 时,平滑看起来与系统不同