- Github主页:https://linxid.github.io/
- 知乎:https://zhuanlan.zhihu.com/p/35775368
- CSDN:https://blog.csdn.net/linxid/article/details/79973258
亮度(灰度)变换是一种非常重要的空间域内处理图像的方法,主要介绍几个亮度变换函数,以及应用。
函数简介
1.imadjust
该函数用来调整亮度,可以映射加权至更高的或更低输出值。
imadjust是亮度变换的基本IPT工具,语法为:
g = imadjust(f,[low_ in high_ in],[low_ out, high_out],gamma);
f:输入图像;
low_in,high_in,low_out,high_out:将low_ in,至high _ in之间的灰度值映射到low _ out,high_ out。low_ in以下的值和high _ in以上的值被剪切掉。空矩阵默认为[0 1];
gamma:决定曲线的形状,对gamma不同的值,如下图所示,默认参数为1.
注意:
1.除图像f外,imadjust的其他输入为[0 1],不论图像的类。若f是unit8,则函数将乘以255。
2.若是high_out小于low _out怎会输出图像反转。
2.对数和对比度拉伸变换
这两种变换时进行动态范围处理的基本工具。
对数变换
- 实现语法:
g = c*log(1+double(f));
该函数的形状类似于gamma函数,但是gamma曲线形状可变,log不可变。 - 主要应用:压缩动态范围
比如傅里叶频谱的显示范围很大,高值部分占优,通过log变换可以进行压缩,便于处理。 - 注意:期望将导致的压缩至还原为显示的全范围,以下方法实现。
gs = im2unit8(mat2gray(g));
mat2gray将值限定在[0,1]范围内,im2unit8将值限定在[0,255]范围内。
对比度拉伸变换
- 实现语法:`g = 1./(1 + (m./(double(f)+eps)).^E)
E:控制函数的斜率
m:显示的阈值,理想条件下及变成阈值函数。 - 主要应用:可以将输入值低于m的灰度级压缩为较暗灰度级范围内,同样,将高于m的灰度级压缩为较亮范围内。
变换图像如图所示:
实例分析
我们自己写一个m函数,实现多种亮度(灰度)变换的功能,同时输入变量可以放宽,通过检测输入变量的个数,来设置默认值。
function g = intrans(f,varargin)
%intrans 函数对灰度图进行变换
% g = intrans(f,'neg')计算输入图像的负片
%
% g = intrans(f,'log',c,class)计算c*log(1+f)对数拉伸变换
% 后两个参数省略,c默认为1,class用于确定输出的类型为‘unit8’和'unit16',
% 如果省略,输出类型默认和输入一样
% g = intrans(f,'ganmma',gam)对图像做伽马变换,gam为要求的输入。
%
%
error(nargchk(2, 4, nargin));
%将输入参数的个数约束在2-4个
classin = class(f);
%存储输入的类型,用以后用;
if strcmp(class(f),'double') & max(f(:)) > 1 & strcmp(varargin{1},'log')
f = mat2gray(f);
else %对于f的其他类型转换成double类型
f = im2double(f);
end
%决定转换的类型
method = varargin{1};
%varargin是个单元数组
%进行确定好的转换
switch method
case 'neg'
g = imcomplement(f);
case 'log'
if length(varargin) == 1
c = 1;
elseif length(varargin) == 2
c = varargin{2};
elseif length(varargin) == 3
c = varargin{2};
classin = varargin{3};
else
error('Incorrect number f input for the log option.')
end
g = c * log(1 + double(f));
case 'gamma'
if length(varargin) < 2
error('Not enough inputs for the gamma option.')
end
gam = varargin{2};
g = imadjust(f,[ ],[ ],gam);
case 'stretch'
if length(varargin) == 1
%使用默认值
m = mean2(f);
E = 4.0;
elseif length(varargin) == 3
m = varargin{2};
E = varargin{3};
else
error('Incorrect number of inputs for the stretch option.')
end
g = 1./(1 + (m./(f + eps)).^E)
otherwise
error('Unknown enhancement method.')
end
%图像格式转变为输入图像的类型
g = mat2gray(g);