灰度变换与空间滤波 – 自定义图像“滤镜”:想怎么调就怎么调🎨

224次阅读

✨ 第一部分:对数变换实战——拯救“看不清”的傅里叶频谱

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

🧠 初学者先懂:傅里叶频谱是分析图像“频率特征”的工具,但它的数值范围能从 0 飙到 10⁶——直接显示的话,只有最亮的点能看见(像图 2.5(a)那样“黑乎乎只剩一个白点”),这就像“把太阳和萤火虫放一起,只能看见太阳”!

内容详解:

📖 课本里的代码是 g = im2uint8(mat2gray(log(1 + double(f))));,咱们拆成“新手友好版”步骤:

  1. 💻 double(f):把图像转成 浮点型(因为对数计算不能用整数);
  2. 🔢 log(1 + ...):加 1 是为了避免“log(0)”出错,对数能把10⁶的范围压缩到 14 左右(比如 log(1+10⁶)≈13.8);
  3. 🎚️ mat2gray(...):把压缩后的结果缩放到0~1 之间(方便后续转成图像格式);
  4. 🖼️ im2uint8(...):把 0~1 的数值转成0~255 的 8 位图像格式(显示器能显示的格式)。

🤖 效果对比:图 2.5(a)是“压缩前”(只有一个亮点),图 2.5(b)是“压缩后”(能看到频谱的纹理)——相当于“把太阳调暗,让萤火虫亮起来”,细节全出来了!

☁️ 复杂场景:如果频谱里有负数(比如某些复杂变换的结果),得先把数值“平移”到正数范围(比如加一个足够大的数),再做对数变换哦!

👐 第二部分:指定任意灰度变换——自定义你的“图像滤镜”

关键字:任意灰度变换、interp1 函数、线性内插

🧠 初学者再想:你有没有想过“让图像暗部变亮、亮部变暗”“把灰度 0→255、255→0”?这就是“任意灰度变换”——相当于给图像做“自定义映射”,想怎么调就怎么调!

内容详解:

📖 课本里的核心是 g = interp1(z, T, f),咱们用“查字典”类比:

  • 📚 z 是“字典的索引”:用 z = linspace(0, 1, numel(T))' 生成 0 到 1 的“刻度”(比如 T 有 2 个元素,z 就是[0;1]);
  • ✍️ T 是“字典的内容”:你想要的 变换规则 (比如 T =[1;0] 就是“反转灰度”——输入 0→输出 1,输入 1→输出 0);
  • 🔍 interp1 是“查字典的工具”:根据输入图像 f 的灰度值,去 z 里“找对应的位置”,再从 T 里取出“对应的变换结果”。

💻 实战代码(以“反转灰度”为例):

% 步骤 1:定义变换规则 T(输入 0→输出 1,输入 1→输出 0)T = [1; 0]; 
% 步骤 2:生成索引 z(和 T 长度一样,0 到 1 的刻度)z = linspace(0, 1, numel(T))'; 
% 步骤 3:把输入图像 f 转成 0~1 的浮点型
f_normal = im2double(f); 
% 步骤 4:用 interp1 做变换
g = interp1(z, T, f_normal); 
% 步骤 5:转成 8 位图像并显示
g = im2uint8(g);
imshow(g);

🤖 例子验证:课本里说“f 的像素是 0.75,T=[1;0],则 g 的像素是 0.25”——因为 0.75 在 z =[0;1]之间,interp1 会“线性内插”:0 对应 1,1 对应 0,0.75 就对应 1 -0.75=0.25,完美反转!

☁️ 现实应用:比如给老照片“上色前的灰度校准”“工业检测中突出特定灰度的瑕疵”,都可以用这个方法自定义变换规则,精准控制图像效果!

🎯 总结:这俩技能咋用?

→ 当图像“数值范围太大,细节看不见”:用 对数变换 压缩范围;

→ 当你想“自定义图像的灰度映射”:用 interp1+ T 向量 做任意变换;

就像 P 图软件里的“滤镜”——对数变换是“自动优化细节”,任意灰度变换是“手动定制效果”,掌握这俩,你就是图像的“调色大师”!

正文完
 0