灰度变换与空间滤波 – 像调奶茶一样调图像:对数&对比度拉伸魔法🔮

227次阅读

✨ 第一部分:对数变换——把“爆炸”的亮度压缩成“温柔”的范围

关键字:对数变换、动态范围压缩、傅里叶频谱

🧠 初学者先想:你有没有见过一张图“亮的地方太亮,暗的地方啥也看不见”?比如拍夜景时,路灯亮得刺眼,周围黑成一片——这就是“动态范围太大”的问题。

内容详解:

📖 课本里说对数变换的公式是 g = c·log(1 + f)(f 是输入图像的灰度,c 是常数)。咱们类比一下:就像把“1000ml 的大桶奶茶”倒进“500ml 的杯子”,得先“压缩”——对数能把 超大的数值范围(比如 0 到 10⁶)缩小到很小的范围(比如 0 到 14)

🤖 举个实践例子:傅里叶频谱(一种图像分析工具)的数值范围经常是 0 到 10⁶,直接显示的话,只有最亮的点能看见(像图 2.5(a)那样黑乎乎只剩一个白点)。但用对数变换后,就能把细节都“挤”出来(图 2.5(b)能看到纹理啦)!

💻 代码怎么写?课本里给了 MATLAB 代码,咱们拆解给初学者:

% 步骤 1:把图像转成浮点型(因为对数计算需要小数)f_double = double(f);
% 步骤 2:做对数变换(+ 1 是避免 log(0)出错)log_result = log(1 + f_double);
% 步骤 3:把结果缩放到 0 - 1 之间(mat2gray 的作用),再转成 8 位图像(0-255)g = im2uint8(mat2gray(log_result));
% 步骤 4:显示结果
imshow(g);

☁️ 复杂情况:如果图像里有负数(比如某些处理后的结果),得先把数值“平移”到正数范围,再做对数变换哦!

👐 第二部分:对比度拉伸变换——让“模糊”的图像变“通透”

关键字:对比度拉伸、阈值化、S 型曲线

🧠 初学者再想:你有没有拍过“灰蒙蒙”的照片,人像和背景糊在一起?对比度拉伸就是给图像“开美颜”——让暗的更暗、亮的更亮,把细节分开!

内容详解:

📖 课本里的对比度拉伸公式是 s = T(r) = 1 / [1 + (m/r)^E](r 是输入灰度,m 是中间灰度,E 控制曲线斜率)。看一下图 2.4(a)的 S 型曲线:

→ 当 r 比 m 小(暗部):(m/r)很大,分母很大,s 接近 0(更暗);

→ 当 r 比 m 大(亮部):(m/r)很小,分母接近 1,s 接近 1(更亮);
这样就把“挤在一起的灰度”拉开了,图像对比度直接拉满!

🤖 极端情况:如果 E 特别大(比如 E =20),曲线会变成“直角”——这就是 阈值化(图 2.4(b)):暗部直接变 0,亮部直接变 1,图像变成黑白二值图(比如把文字从背景里抠出来)。

💻 代码实践(MATLAB):

% 假设 m 是图像的平均灰度,E 设为 5(可调整)m = mean2(double(f)); % 计算图像平均灰度
E = 5;
% 做对比度拉伸(注意 f 不能为 0,否则 m / r 会出错)g = 1 ./ (1 + (m ./ double(f)).^E);
% 转成 8 位图像并显示
g = im2uint8(mat2gray(g));
imshow(g);

☁️ 现实应用:拍医学影像(比如 X 光片)时,经常用对比度拉伸让病灶(暗的或亮的区域)更明显;监控摄像头的“夜视增强”功能,核心也是类似的变换!

🎯 总结:这俩变换咋选?

→ 当图像“数值范围太大,细节挤在一起”:用对数变换压缩范围;

→ 当图像“灰蒙蒙,对比度低”:用对比度拉伸拉开层次;

就像调奶茶:太甜了加冰(对数压缩),没味道了加糖(对比度拉伸)——最终都是为了“好喝”(好看)!

正文完
 0