Matlab手动实现imfilter后输出图像变红,求故障原因
手动实现图像平滑后图像变红的原因与解决办法
这个问题我之前也碰到过,核心原因是你没有处理彩色图像的多通道(RGB)维度,导致只有红色通道被计算,绿、蓝通道一直保持初始的0值,所以显示出来的图像就会偏红。
具体问题拆解
- 你的输入图像
gambar是彩色图,size(gambar)返回的是[行数, 列数, 3](3对应RGB三个通道),但你的循环只遍历了行和列,完全没处理通道维度。 - 初始化
gambarfinal = zeros(ukuran)时,已经创建了三维的空数组,但循环里gambarfinal(i,j) = sum(temp(:))这行代码,在MATLAB里只会把计算结果赋值给第一个通道(红色通道),绿、蓝通道始终是初始的0,最终图像自然只有红色分量。
修正后的代码
我们只需要在循环里新增通道的遍历,对每个RGB通道分别做平滑处理:
% 显示平滑前的图像 gambar = imread('bird.jpg'); ukuran = size(gambar); figure imshow(gambar) % 显示平滑后的图像 gambardouble = im2double(gambar); filter = ones(3) * 1/9; gambarfinal = zeros(ukuran); % 保留三维数组结构 % 遍历行、列、RGB通道 for i = 2:ukuran(1)-1 for j = 2:ukuran(2)-1 for k = 1:ukuran(3) % 新增通道循环,处理每个颜色通道 temp = gambardouble(i-1:i+1,j-1:j+1,k) .* filter; gambarfinal(i,j,k) = sum(temp(:)); end end end figure imshow(gambarfinal);
额外提示
你当前的代码还有一个小问题:没有处理图像的边缘区域(第一行、最后一行,第一列、最后一列),这些位置的像素值始终是0,显示时会出现黑边。如果需要优化,可以考虑用边缘复制、镜像填充等方式处理边界,或者直接把边缘像素复制到结果数组中。
内容的提问来源于stack exchange,提问作者Denny Pradipta
相关产品推荐
相关产品推荐

