Matlab图像高斯卷积后显示全白空白图问题排查咨询
Matlab高斯滤波代码显示全白问题解决方案
核心错误点
- 显示逻辑适配错误:
imshow()对double类型图像默认的有效显示范围是[0,1],你将原图转成double后数值仍保持0~255的区间,所有大于1的像素都会被判定为最大值显示为白色,这是全白的直接原因。 - 变量调用逻辑错误:你计算了归一化后的高斯核
G_,但实际卷积时调用的是未归一化的G,属于逻辑疏漏。 - 高斯核坐标错误:你定义的x、y数组为
[-2,1,0,-1,2],顺序错乱不是对称的网格坐标,生成的高斯核本身不符合滤波要求。 - 卷积输出尺寸可选优化:
conv2()默认返回full卷积结果,尺寸大于原图,若需要得到和原图尺寸一致的平滑结果,可补充'same'参数。
修正后可运行代码
clc; clear all; clc; img = imread ('a.jpg'); img = rgb2gray(img); % 显示原图 figure, imshow(img); % 用im2double直接将uint8灰度图归一化到0~1的double区间,后续无需额外调整显示参数 img = im2double(img); sigma= 2; G= zeros(5,5); % 修正坐标数组顺序为对称序列 x = [-2,-1,0,1,2]; y = [-2,-1,0,1,2]; for i=1:5 for j=1:5 G(i,j)= exp(-(x(i)^2+y(j)^2)/(2*(sigma^2))); end end % 更简洁的归一化写法 G_= G / sum(G(:)); % 使用归一化核,指定same参数输出和原图尺寸一致的结果 A= conv2(img, G_, 'same'); % 此时img是0~1区间的double,卷积后数值也在0~1区间,可直接正常显示 figure, imshow(A);
补充说明
Matlab的二维卷积确实通过conv2(u,v)实现,你的代码不存在卷积函数的语法调用错误,仅为数值适配、变量调用、参数配置的逻辑问题。如果不想提前将图像归一化到0~1,也可以在显示时指定灰度范围:imshow(A, [0,255]),也能正常显示结果。
内容的提问来源于stack exchange,提问作者Hally
相关产品推荐
相关产品推荐

