亮度变换与空间滤波

《数字图像处理》 – 冈萨雷斯 读书笔记

亮度变换函数

s = T(r)

​ r表示图像f中相应点(x,y)的亮度,s表示图像g中相依点(x,y)的亮度

函数imadjust

​ 此函数是对灰度图像进行亮度转换的基本IPT工具

​ 语法:

g = imadjust(f,[low_in high_in]n [low_out high_out], gamma)

对数和对比度拉伸变换

g = c*log(1 + double(f))

>>g = im2uint8(mat2gray(log(1 + double(f))));

亮度变换的一些M函数

​ g = changeclass(newclass, f)

亮度标度的M函数

g = gscale(f, method, low, high)

​ f 是将被标度的图像,method的有效值为 ‘full8’ 和 ‘full16’,若使用这两个有效 值其中一个,则可以在两种表换中省略参数low 和high,method 的第三个有效值为 ‘minmax’ 此时必须给出 low与high 在范围 [0, 1]内

直方图处理与函数绘图

生成并绘制直方图

​ h($r_k$) = $n_k$

​ 归一化直方图:

​ p($r_k$) = $\tfrac{h(r_k)}{n}$ = $\tfrac{n_k}{n}$

imhist函数

h = imhist(f, b)

​ 其中, f 为输入图像, h为其直方图 $h(r_k)$ ,b 是用于形式直方图的“收集箱”的个数

  • 函数 bar(horz, v, width)

    ​ v 是一个行向量, 它包含将被绘制的点;horz 是一个与v有着相同维数的向量,它包含水平标度值得增量;width 是一个值在 0 ~ 1 之间的数

    img

  • 函数 stem(horz, v, 'color_linestyle_marker', 'fill')

    ​ 生成一幅杆状图,类似于条形图

  • 函数plot(horz, v, 'color_linestyle_market')

    ​ 该函数将一组点用直线连起来

    直方图均衡化

    ​ 通常使用直方图并调用直方图均衡化技术来处理离散灰度级

    g = histeq(f, nlev)

    ​ f 为输入图像,nlev 是为输出图像指定的灰度级数

    直方图匹配(规定化)

    g = histeq(f, hspec)

    ​ f 为输入图像,hspec 为指定的直方图,g 为输出图像,其直方图近似于指 定的 直方图hspec

空间滤波

线性空间滤波

​ 一维相关和卷积操作的不同是:卷积颠倒函数顺序会产生相同的结果,而一维相关不同;但是若函数对称移动,则卷积和相关操作会产生相同的结果。

使用旋转后的滤波掩模时,卷积就是相关

imfilter

​ 工具箱使用该函数来实现线性空间滤波

g = imfilter(f, w, filtering_mode, boundary_options, size_options)

​ 其中,f 是输入图像、w为滤波掩模、g为滤波结果

​ filtering_mode 用于指定在滤波过程中是使用相关还是卷积

​ boundart_options 用于处理边界充零问题,边界的大小由滤波器的大小确定

​ size_options 可以是 ‘same’ 或 ‘full’

两种使用卷积运算的方法

​ 一、 g = imfilter(f, w, 'conv', 'replicate')

​ 二、rot90(w, 2)将w旋转$180^。$

​ 然后使用 imfilter(f, w, 'replicate')

非线性空间滤波

​ 非线性空间滤波基于非线性操作,这种操作包含了一个邻域的像素。

colfilt函数

g = colfilt(f, [m n], 'sliding', @fun, parameters)

​ @成为函数句柄,它是一种MATLAB数据类型,它包含有引用函数用到的一些信息。

padarray函数

fp = padarray(f, [r c], method, direction)

图像处理工具箱的标准空间滤波器

线性空间滤波器

fspecial函数

w = fspecial('type', parameters)

​ type为滤波器类型,parameters 进一步定义了指定的滤波器

​ 使用imfilter滤波后的输出图像与输入图像是同类图像,所以负值将被截掉,

​ 因此可以通过在滤波前将f转换为double类图像

非线性空间滤波器

ordfilt2函数

​ 该函数可以生成 排序滤波器

g = ordfilt2(f, order, domain)

medfilt2函数

​ 利用函数medfilt2进行中值滤波

​ 中值滤波是降低图像椒盐噪声的有效工具

​ 使用默认设置的中值滤波很好地降低了噪声,但在图片边界可能会出现黑色的斑点,跟图像本身的属性有关,此时用函数 symmetric来减弱即可

intrans.m文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function g = intrans(f, varargin)
error(nargchk(2, 4, nargin))
classin = class(f);
if strcmp(class(f), 'double') & max(f(:)) > 1 & ~strcmp(varargin{1}, 'log')
f = mat2gray(f);
else % Convert to double, regardless of class(f).
f = im2double(f);
end
method = varargin{1};
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 of inputs 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 = changeclass(classin, g);

twomodegauss.m文件

1
2
3
4
5
6
7
8
9
function p = twomodegauss(m1, sig1, m2, sig2, A1, A2, k)
c1 = A1 * (1 / ((2 * pi) ^ 0.5) * sig1);
k1 = 2 * (sig1 ^ 2);
c2 = A2 * (1 / ((2 * pi) ^ 0.5) * sig2);
k2 = 2 * (sig2 ^ 2);
z = linspace(0, 1, 256);
p = k + c1 * exp(-((z - m1) .^ 2)./k1) + c2 * exp(-((z - m2) .^ 2) ./ k2);
p = p ./ sum(p(:));

manualhist.m文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function p = manualhist
repeats = true;
quitnow = 'x';
p = twomodegauss(0.15, 0.05, 0.75, 0.05, 1, 0.07, 0.002);
while repeats
s = input('Enter m1, sig1, m2, sig2, A1, A2, k OR x to quit:','s');
if s == quitnow
break
end
v = str2num(s);
if numel(v) ~= 7
disp('Incorrect number of inputs')
continue
end
p = twomodegauss(v(1), v(2), v(3), v(4), v(5), v(6), v(7));
figure, plot(p)
xlim([0 255])
end