第二章 灰度变换与空间滤波

第二章 灰度变换与空间滤波

  • 灰度变换函数
    • 函数imadjust和stretchlim
    • 对比及对比度拉伸变换
    • 指定任意灰度变换
    • 实用的M函数
  • 直方图处理与函数绘图
    • 生成并绘制图像直方图
    • 直方图均衡
    • 直方图匹配(规定化)
    • 函数adapthisteq
  • 空间滤波
    • 线性空间滤波
    • 非线性空间滤波
  • 图像处理工具箱的标准空间滤波器
    • 线性空间滤波器
    • 非线性空间滤波器

一.灰度变换函数

g(x, y) = T[f(x, y)]

(x, y)处的g值仅有f在该点的灰度决定,T也变为亮度或灰度函数。在处理单色图像时,这两个术语可以相互换用。在处理彩色图像时,亮度用于表示某些色彩空间中的一个彩色图像分量。

函数imadjust和stretchlim
  • 灰度级图像进行灰度变换

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


[low_in high_in]之间的值映射到[low_out high_out]之间。 若gamma
>> g1 = imadjust(f, [0 1], [1 0]);
>> imshow(g1);
>> g = imcomplement(f);
>> imshow(g);

图像f(原图)
这里写图片描述
图像g、g1
image

imadjust(f, [0 1], [1 0])
imcomplement(f)
两个函数都能表示图片的负片

>> g3 = imadjust(f, [], [], 0.5);
>> imshow(g3);
也可以直接改变gamma值
>> g3 = imadjust(f, stretchlim(f), []);
>> imshow(g3);

g3图片,stretchlim(f)函数实现了对比度拉伸,默认情况下提升了对比度。
这里写图片描述

对数及对比度拉伸变换
对比度拉伸就是把窄范围的输入灰度级扩展为宽范围的输出灰度级。以我自己的理解就是使对比效果更加明显,形成了一幅高对比度的图像。 - 执行对数变换的函数

gs = im2uint8(mat2gray(g));

在MATLAB中函数对浮点图像实现的方法就是借助公式*g = 1 ./ (1 + (m./f) .^ E)*
>> g = im2uint8(mat2gray(z));
>> gs = im2uint8(mat2gray(log(1 + double(z))));
>> imshow(gs);
>> figure, imshow(g);

这里写图片描述
image

指定任意灰度变换
实现灰度映射可以使用函数

g = interp1(z, T, f)

T为列向量,z是长度与T相同的列向量,使用下面方法实现

z = linspace(0, 1, numel(T));

==使用取值范围为[0 1]的浮点数来表示输入和输出图像会大大简化程序==
实用的M函数
  • 检测输入到M函数的参数数目
    n = nargin
  • 检测函数的输出参数数目
    n = nargout
  • 检测传递的参数的数量是否正确
    msg = nargchk(low, high, number)
  • 具有可变个数的输入和输出变量
    一般在写函数的时候我们时常会遇到不确定参数的时候,可以使用varargin和varargout.
function [m, n] = testhv3(varargin)
function [varargout] = testhv4(m, n)
%可以有一个固定的输入参数,后面跟随可变数量的输入参数
function [m, n] = testhv3(x, varargin)
  • 另一种用于灰度变换的M函数
    1.intrans.m
    2.gammaTransform.m
    3.stretchTransform.m
    4.spcfiedTransform.m
    5.logTransform.m
    以上五个函数结合使用
>> g = intrans(f, 'stretch', mean2(im2double(f)), 0.9);
>> figure, imshow(g);

实现灰度变换
- 灰度标定的函数

function g = gscale(f, varargin)
if length(varargin) == 0
    method = 'full8';
else
    method = varargin{1};
end

if strcmp(class(f), 'double') && (max(f(:))>1 || min(f(:))<0)
   f = mat2gray(f);
end

switch method
    case 'full8'
        g = im2uint8(mat2gray(double(f)));
    case 'full16'
        g = im2uint16(mat2gray(double(f)));
    case 'minmax'
       low = varargin{2};high = varargin{3};
       if low>1 | low<0 | high>1 | high<0
             error('Parameters low and high must be in the range [0,1]')
       end
       if strcmp(class(f), 'double')
            low_in = min(f(:));
            high_in = max(f(:));
       elseif strcmp(class(f), 'uint8')
            low_in = double(min(f(:)))./255;
            high_in = double(max(f(:)))./255;
       elseif strcmp(class(f), 'uint16')
            low_in = double(min(f(:)))./65535;
            high_in = double(max(f(:)))./65535;
       end

       g = imadjust(f,[low_in high_in],[low high]);
otherwise
       error('Unknown method')
end

调用以下语句

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

method可以的有效值是‘full8’(默认)、‘full16’和‘minmax’。

二.直方图处理与函数绘图

生成并绘制图像直方图
h(rk) = nk

rk是区间[0,G]内第k级灰度

nk是出现rk的像素数

p(rk) = h(rk) / n = nk / n

p(rk)是灰度级rk出现的概率估计

  • 直方图的imhist方法

处理直方图有一个核心函数

h = imhist(f, b);

b是用来形成直方图“容器”的数目(若b未包含在此参量中,其默认值为256)。

>> imhist(f);

image

==一个容器只是灰度范围的小部分,b就是将256个级别分为b个部分==

归一化直方图的方法:
p = imhist(f, b) / numel(f)
- bar方法

>> h = imhist(ff, 25);
>> horz = linspace(0, 155, 25);
>> bar(horz, h)
>> axis([0 255 0 60000])
>> set(gca, 'xtick', 0:50:255)
>> set(gca, 'ytick', 0:20000:60000)
>> figure, imshow(h);
>> figure, imshow(ff);

image

==linspace(x1,x2,N)==

功能:linspace是Matlab中的均分计算指令,用于产生x1,x2之间的N点行线性的矢量。其中x1、x2、N分别为起始值、终止值、元素个数。若默认N,默认点数为100。

==axis([horzmin horzmax vertmin vertmax])==

功能:设定水平和垂直轴的范围

set(gca, ‘xtick’, 0:50:255)

意思是将x轴设定为从0开始每次增加50,直到增加到255,设定也y轴同理。

  • stem方法
>> h = imhist(f, 25);
>> horz = linspace(0, 255, 25);
>> stem(horz, h, 'fill')

image
- plot方法

>> hc = imhist(ff);
>> plot(hc)
>> axis([0 255 0 15000])
>> set(gca, 'xtick', [0:50:255])
>> set(gca, 'ytick', [0:2000:15000])

image

==set中的gca是用来返回当前axes (坐标图)对象的句柄,也就是返回了一个坐标图像。==

ylim(‘auto’)
xlim(‘auto’)

自动设定符合条件的x, y的范围。也可以手工设定,同下。

ylim([ymin ymax])
xlim([xmin xmax])

  • 处理函数句柄的绘图函数

    fplot(fhandle, limits, ‘LineSpec’)


limits是指定函数x轴的取值范围(xmin, xmax)的一个向量,’LineSpec’是绘制图像的符号。
>> fandle = @sin

fandle =

  function_handle with value:

    @sin

>> fplot(fandlw, [0 6], ':')

image

在0到6之间绘制了一个正弦函数图像。

也可以通过其他函数来美化图像

>> fandle.LineStyle = ':';
>> fandle.Color = 'r';
>> fandle.Marker = 'x';
>> fandle.MarkerEdgeColor = 'b';

image

直方图均衡
  • 直方图均衡函数

    g = histeq(f, nlev)


nlev是为输出图像直方图设定的灰度级数
,函数中默认nlev = 64, 一般灰度级会分为256级。
>> f = Fig0208;
>> imshow(f);
>> figure, imhist(f);
>> ylim('auto')

这是原始图像及它的直方图
image

image

进行直方图均衡后

>> g = histeq(f, 256);
>> figure, imshow(g);
>> figure, imhist(g);
>> ylim('auto')

image

image

直方图累加求和列出了灰度变化的整个过程
(cumsum函数是表示累加求和,比如

A = 1:5;

B = cumsum(A)

B = 1 3 6 10 15)

>> hnorm = imhist(f) ./ numel(f);
>> cdf = cumsum(hnorm);
>> x = linspace(0, 1, 256);
>> plot(x, cdf)
>> axis([0 1 0 1])
>> set(gca, 'xtick', 0:.2:1)
>> set(gca, 'ytick', 0:.2:1)
>> xlabel('Input intensity values', 'fontsize', 9)
>> ylabel('Output intensity values', 'fontsize', 9)

image

==可以使用窗口中的Insert来修改插入图形==

直方图匹配(规定化)
  • 直方图匹配函数
    g = histeq(f, hspec)
>> imshow(f);
>> figure, imhist(f);
>> g = histeq(f, 256);
>> figure, imshow(g);
>> figure, imhist(g);

image

image

在给定工具箱函数中灰度级移到较高端,但是还是给出了一幅低对比度且有褪色的图像。从原始图中看出灰度级在0及其附近过于集中。有直方图得到的累计变换函数很陡,因此把低端过于集中的像素点映射到了灰度级的高端。

利用直方图匹配能够补救这一现象。
- 直方图匹配增强

>> g = histeq(f, p);
>> imshow(g);
>> figure, plot(p);
>> ylim('auto')
>> figure, imhist(g);

image

image

image

函数adapthisteq

这一函数执行所谓的对比度受限的自适应直方图均衡,也就是用直方图匹配的方法来逐个处理图像中的小区域(小片),再将相邻小片结合起来,从而==消除人工引入的边界==。

g = adapthisteq(f, param1, val1, param2, val2…)

param / val是表中内容

image

>> g1 = adapthisteq(f);
>> g2 = adapthisteq(f, 'NumTiles', [25 25]);
>> g3 = adapthisteq(f, 'NumTiles', [25 25], 'ClipLimit', 0.05);

由图中可以看出,局部增强方法好于全局增强,但是额外的代价是函数的复杂性增加。

image

三.空间滤波

线性空间滤波
线性操作理解:对于一个3 x 3的滤波器,所有滤波器上的系数乘以对应点的像素,所有结果求和,得到的就是图像中3 x 3的中心的响应。 图像和模板在处理的时候有一些点是没有重叠的,要对f填充足够且必要的0,以保证模板w再通过f的全过程中,都有相对应的点。 ==奇数尺寸的模板会更加直观,有一个明确的中心点。==
  • 相关和卷积

相关:按照上面理解的方式处理图像数组。

卷积:模板旋转180度后再以相同的方式处理图像数组。
- full和same

‘full’:填充图像,进行相关计算。
‘same’:产生一个大小与f相同的相关。这种计算同样用0填充,但是开始的位置位于f的原点与模板的中心的对准的位置。
- 实现线性空间滤波

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

w为滤波模板,filtering_mode相关完成滤波为‘corr’,对卷积规定为‘conv’;boundary_options处理边界填充问题,边界大小有滤波器尺寸确定;size_option不是‘same’就是‘full’。

>> f = im2double(f);
>> subplot(231), imshow(f), title('f');
>> w = ones(31);
>> gd = imfilter(f, w);
>> subplot(232), imshow(gd, []), title('gd');
>> gr = imfilter(f, w, 'replicate');
>> subplot(233), imshow(gr, []), title('gr');
>> gs = imfilter(f, w, 'symmetric');
>> subplot(234), imshow(gs, []), title('gs');
>> gc = imfilter(f, w, 'circular');
>> subplot(235), imshow(gc, []), title('gc');
>> f8 = im2uint8(f);
>> g8r = imfilter(f, w, 'replicate');
>> subplot(236), imshow(g8r, []), title('g8r');

image

非线性滤波

线性滤波是基于计算乘积和,而非线性滤波则基于涉及滤波器包围的邻域内像素的非线性操作。
- 非线性滤波器处理函数

g = colifilt(f, [m n], ‘sliding’, fun)

‘sliding’表明处理过程中m x n区域在输入图像f中逐像素滑动,fun是函数句柄。

>> f = Fig0216;
>> subplot(121), imshow(f);
>> gmean = @(A)prod(A, 1) .^ 1/size(A, 1);
>> g = colfilt(f, [5 5], 'sliding', gmean);
>> subplot(122), inshow(g);

image

  • 边界填充

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


image

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

线性空间滤波
  • 线性空间滤波实现函数

    w = fspecial(‘type’, parameters)


‘type’定义滤波器的类型,parameters进一步规定滤波器。
image
  • 实现拉普拉斯滤波器
>> f = Fig0217;
>> w = [0 1 0; 1 -4 1; 0 1 0];
>> g1 = imfilter(f, w, 'replicate');
>> f2 = im2double(f);
>> g2 = imfilter(f2, w, 'replicate');
>> g = f2 - g2;
>> subplot(141), imshow(f)
>> subplot(142), imshow(g1, [ ])
>> subplot(143), imshow(g2, [ ])
>> subplot(144), imshow(g)

image

用原图减去拉普拉斯图像就是增强后的图像。

  • 手工指定滤波器及增强技术比较
>> f = Fig0217;
>> w4 = fspecial('laplacian', 0);
>> w8 = [1 1 1; 1 -8 1; 1 1 1];
>> f = im2double(f);
>> g4 = f - imfilter(f, w4, 'replicate');
>> g8 = f - imfilter(f, w8, 'replicate');
>> subplot(131), imshow(f);
>> subplot(132), imshow(g4);
>> subplot(133), imshow(g8);

image

图片清晰度逐渐增加,使用中心系数为-8的拉普拉斯滤波器为三张图片中最清晰的一个。

非线性空间滤波器

这些非线性空间滤波器的响应基于对图像邻域中所包含像素的排序,然后使排序结果确定的值替换邻域中的中心像素。

g = ordfilt2(f, order, domain)

使用order个元素去替代f中的每个元素,domain是一个由0和1组成的大小为m x n的矩阵。


  • 中值滤波器

g = ordfilt2(f, (m * n + 1) / 2, ones(m, n))
g = medfilt2(f, [m n], padopt)

[m n]定义一个大小为m x n的邻域,padopt指定三个可能的边界填充选项:‘zeros’(默认值),‘symmetric’指出f按照镜像反射方式对称地沿边界扩展,‘indexed’表示若f是double类则用1填充,否则用0填充。

>> f = Fig0219;
>> fn = imnoise(f, 'salt & pepper', 0.2);
>> subplot(141), imshow(f);
>> subplot(142), imshow(fn);
>> gm = medfilt2(fn);
>> subplot(143), imshow(gm);
>> gms = medfilt2(fn, 'symmetric');
>> subplot(144), imshow(gms);

image

猜你喜欢

转载自blog.csdn.net/qq_39227338/article/details/80108544