matlab数字图像处理之图像增强

matlab数字图像处理之图像增强

    1. 图像处理基本目的之一是改善图像质量,而改善图像最常用的技术是图像增强的目的是为了改善图像的视觉效果,使图像更加清晰,便于人和计算机对图像进一步的分析和处理
    1. 图像质量的基本含义是指人们对一幅图像视觉感受的评价。图像增强的目的就是为了改善图像显示的主观视觉质量。图像质量包含两方面的内容,一是图像的逼真度,即被评价图像与原标准图像的偏离程度;二是图像的可懂度,指图像能向人或机器提供信息的能力。目前为止,还没有找到一种和人的主观感受一致的客观、定量的图像质量评价方法。

图像增强按作用域可分为

  • 空域内处理
  • 频域内处理

空域内处理是直接对图像进行处理,频域内处理是在图像的某个变换域内,对图像的变换系数进行运算,然后通过逆变换获得图像增强效果。

1.空域增强

空域内的图像增强就是调整灰度图像的明暗对比度,是对图像中各个像素的灰度值直接进行处理。

常用的方法包括

  • 灰度变换增强
  • 直方图增强
  • 平滑
  • 锐化

1.1 灰度变换增强

灰度变换增强是在空间域内对图像进行增强的一种简单而有效的方法。灰度变换增强不改变原图像中像素的位置,只改变像素点的灰度值,并逐点进行,和周围的其他像素点无关。为了进行灰度变换,首先需要获取图像的直方图。在MATLAB中,可以通过编写程序获取灰度图像的直方图,也可以通过函数imhist( )获取灰度图像的直方图。

I = imread('lena_color_512.tif');
I_G = rgb2gray(I);
row = size(I_G, 1);
column = size(I_G, 2);
N = zeros(1,256);
for i = 1: row
    for j = 1: column
        k = I_G(i, j);
        N(k+1) = N(k+1) + 1;
    end
end

figure
subplot(121), imshow(I_G);
subplot(122), bar(N);
axis tight;

下图为灰度图以及进行了每个像素点增强1的灰度直方图
在这里插入图片描述
图一如下:
在这里插入图片描述
当然也可以直接对灰度图使用imhist函数不进行别的操作,只绘制直方图

I = imread('lena_color_512.tif');
I_G = rgb2gray(I);
imhist(I_G);

如下图2:(与图一相比肉眼看不出差距,因为每个像素点只增加了1个灰度级)
在这里插入图片描述


1.2 直方图增强

图像的灰度直方图表示灰度图像中具有每种灰度的像素的个数,反映了图像中每种灰度级出现的频率,是图像的基本统计特征之一。直方图均衡方法因为其有效性和简单性已成为图像对比度增强的最常用方法。其基本思想是根据输入图像的灰度概率分布来确定其对应的输出灰度值,通过扩展图像的动态范围达到提升图像对比度的目的。

直方图增强是以概率论为基础,常用的直方图调整方法包括直方图均衡化和直方图规定化两方面。

  • 直方图均衡化

由上面的灰度图的直方图指导它并不均匀,主要集中在中间,故我们来考虑均衡化,直接调用函数histeq()即可

I = imread('lena_color_512.tif');
J = rgb2gray(I);

H = histeq(J);

figure(1)
subplot(121), imshow(J);
subplot(122), imshow(H);

figure(2)
subplot(121), imhist(J);
subplot(122), imhist(H)

下图中右边均为均衡化的结果

在这里插入图片描述
在这里插入图片描述

  • 直方图规定化
I = imread('lena_color_512.tif');
J = rgb2gray(I);

hgram = ones(1, 256);
H = histeq(J);
B = histeq(J, hgram);

figure(1)
subplot(121), imshow(H);
subplot(122), imshow(B);

figure(2)
subplot(121), imhist(H);
subplot(122), imhist(B);

这里的hgram为自己设定的规定化函数,这里设定了一个全是1的矩阵,用它来规定原图,规定化是一个拟合过程,变换后的直方图不会与目标图像的直方图完全一致.
右图为采用规定化的结果,即拟合的结果
在这里插入图片描述

在这里插入图片描述


1.3 平滑

平滑就是去除一些离散的噪声以及将目标里的间断点串联起来以得到一个清晰的画面,平滑一般是用滤波来实现,因为我也是刚学所以是用的现成的函数,举例(均值滤波)还有很多其他的平滑滤波如邻域平均滤波,加权平均滤波:

clc
clear all
picture=rgb2gray(imread("dream.jpg"));
way1=fspecial('average',3);
picture1=filter2(way1,picture)/255;%一定要除以255,否则是白图
figure;
subplot(121);
imshow(picture);
subplot(122);
imshow(picture1);

 

左图是原图,右图是均值滤波(处理高斯噪声好)产生的图片,还有线性滤波,中值滤波,自适应滤波;

1.4 锐化

    锐化是提取边缘的一个功能,可以将提取到的边缘图片与原图片进行叠加,可以实现图片的清晰度增加,举例:

clc
clear all
picture=rgb2gray(imread("dream.jpg"));
way2=fspecial('sobel');
picture1=filter2(way2,picture);
picture2=uint8(picture1)+picture;
figure;
subplot(131);
imshow(picture);
subplot(132);
imshow(picture1);
subplot(133);
imshow(picture2);

 左图是原图,中间是sobel算子锐化得到的图片,右图是将原图与锐化的得到的图片进行叠加,可以看出右图增加了视觉效果,除此之外还有其他多种算子;

2.图像属性

2.1 图像的标准差

直接利用std()来计算向量的标准差,通过std2()来计算矩阵的标准差,灰度图像的像素为二维矩阵A,则该图像的标准差为std2(A),用mean2()来获取图像的均值,同样对于两个大小相等的二维矩阵,可以计算起相关系数,利用corr2来实现,这里用代码和结果来展示:

I = imread('lena_color_512.tif');
J = rgb2gray(I);

gray = mean2(J);    %灰度图的均值
grb = mean2(I);      %彩色图的均值
r = mean2(I(:, :, 1))  %红色均值
g = mean2(I(:, :, 2))  %绿色均值
b = mean2(I(:, :, 3))  %蓝色均值

s1 = std2(J)           %灰度图方差
J2 = histeq(J);
s2 = std2(J2)         %均衡化后方差

F = medfilt2(J);
r = corr2(J, F)       %原图与滤波后图形的相关系数
结果如下
r =
  180.2237
g =
   99.0512
b =
  105.4103
s1 =
   47.8557
s2 =
   74.7229
r =
    0.9959

2.2 图像的等高线

在MATLAB软件中,通过函数imconlour( )可以绘制灰度图像的等高线。
该函数的简单调用格式为:

  • imcontour(I): 该函数中I为灰度图像的二维数据矩阵,绘制灰度图像的等高线。
  • imcontour(I, n): 该函数设置等高线的条数为n,如果不指定n,该函数会自动选取n。
I = imread('lena_color_512.tif');
J = rgb2gray(I);

figure(1)
subplot(121), imshow(J);
subplot(122), imcontour(J, 3);

右图为设定三条等高线的结果,图形比较的不美观,因为灰度值划分跨度太大
在这里插入图片描述

subplot(121), imshow(J);
subplot(122), imcontour(J);

不设定n的取值之后,其灰度划分比较接近原图
在这里插入图片描述

3.图像滤波

3.1 空域滤波

空域滤波是空域图像增强的常用方法。空域滤波是对图像中每个像素为中心的邻域进行一系列的运算,然后将得到的结果代替原来的像素值。空域滤波分为

  • 线性空域滤波
  • 非线性空域滤波
线性空域滤波

线性平均滤波是一种最常用的线性空域滤波。线性平均滤波实际是一种低通滤波,信号的低频部分通过,阻止高频部分通过。由于图像的边缘处于高频部分,因此线性平均滤波后,会造成图像边緣的模糊。在进行线性平均滤波时,常用的模板大小为3X3,如下所示:

T = 1/5 [ 0 1 0 ; 1 1 1; 0 1 1]

对应的函教表达式为:
f(x) = 1/5 [f(x, y-1) + f(x-1, y) + f(x,y) + f(x+1, y) + f(x, y+1)]

举个例子

I = imread('lena_color_512.tif');
J = imnoise(I, 'salt & pepper', 0.02); %添加椒盐噪声
h = ones(3,3)/5;
h(1,1) = 0; h(1,3) = 0;
h(3,1) = 0; h(3,3) = 0;  %构建线性滤波矩阵
K = imfilter(J, h);  %滤波

figure(1)
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);

% figure(2)
% subplot(121), imhist(J);
% subplot(122), imhist(B);

在这里插入图片描述
当然也可以添加高斯噪声,其滤波的模板是不同的

下面是对灰度图像加高斯噪声再进行滤波的处理

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
J = imnoise(I, 'gaussian', 0, 0.01); %添加高斯噪声
h = ones(3,3)/9;
K = conv2(J, h);  %滤波

subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);

在这里插入图片描述
当然也可以直接对彩色图像进行处理,代码复杂一些,因为这里的卷积函数是对二维来操作的,故

I = imread('lena_color_512.tif');
I = im2double(I);
[h, w, c] = size(I);

J = zeros(h, w, c, 'double');
J(:, :, 1) = imnoise(I(:, :, 1), 'gaussian', 0, 0.1); %添加高斯噪声
J(:, :, 2) = imnoise(I(:, :, 2), 'gaussian', 0, 0.1); %添加高斯噪声
J(:, :, 3) = imnoise(I(:, :, 3), 'gaussian', 0, 0.1); %添加高斯噪声

P = ones(6, 6)/36;
img = zeros(h, w, c, 'double');
img(:, :, 1) = conv2(J(:, :, 1), P, 'same');
img(:, :, 2) = conv2(J(:, :, 2), P, 'same');
img(:, :, 3) = conv2(J(:, :, 3), P, 'same');

figure(1)
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(img);

这里每个图层都增加了0.1倍的高斯噪声
在这里插入图片描述


非线性空域滤波

非线性空域滤波主要包括中值滤波,顺序统计滤波和自适应滤波等。

  • 中值滤波
    一种保护边缘的非线性平滑方法,在图像增强中应用非常广泛
  1. 一维中值滤波:对于一维数据,按照从大到小的顺序排列
  2. 二维中值滤波:用于图像增强,可以去除图像中的椒盐噪声,平滑效果优于均值滤波,在抑制噪声的同时还能保持图像的边缘清晰,常用medfilt2()进行图像的二维中值滤波

顺序统计滤波例子:

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);

J1 = ordfilt2(I, 1, true(5)); %构造一个5*5的模板,取最小值1作为输出
J2 = ordfilt2(I, 25, true(5)); %构造一个5*5的模板,取最大值25作为输出

figure(1)
subplot(131), imshow(I);
subplot(132), imshow(J1);
subplot(133), imshow(J2);

可以看到取最小值图像暗一些,而最大值图像显得白一些
在这里插入图片描述
二维中值滤波例子:

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
J = imnoise(I, 'salt & pepper',  0.03); %添加椒盐噪声
K = medfilt2(J);

figure(1)
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);

在这里插入图片描述

  • 自适应滤波
    可通过调整图像局部的方差来调整滤波器的输出
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
J = imnoise(I, 'gaussian', 0,  0.01); %添加椒盐噪声
K = wiener2(J, [5 5]);

figure(1)
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);

在这里插入图片描述


3.2 频域滤波

频率域图像增强首先通过傅立叶变换将图像从空间域转换为频率域,然后在频率域内对图像进行处理,最后通过傅立叶反变换转换到空间域。频率域内的图像增强通常包括低通滤波、高通滤波和同态滤波等。

设为原始图像函数,为滤波器脉冲响应函数,则空域内的滤波是基于卷积运算的,如下所示:
g(x,y)= f(x, y)*h(x, y)

其中可以是低通或高通滤波,为空域滤波的输出图像函数。根据卷积定理,上式的傅立叶变换如下:
G(u,v)= F(u, v)H(u, v)

低通滤波器

  • 低通滤波器
    低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频中的噪声。所以低通滤波的效果是图像的去噪声平滑增强,但同时也抑制了图像的边界,造成图像不同程度上的模糊。对于大小为M*N的图像,频率点与频域中心的距离为D,其表达式为:
    D(u,v)=[(u - M/2)^2 + (v - N/2)^2 ]^(1/2)

代码如下:

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);

M = 2*size(I, 1);
N = 2*size(I, 2);
u = -M/2 : (M/2-1);
v = -N/2 : (N/2-1);
[U, V] = meshgrid(u, v);
D = sqrt(U.^2 + V.^2);  %构造D
D0 = 80;  %D0为截止频率
H = double(D <= D0);
J = fftshift(fft2(I, size(H, 1), size(H, 2))); %转换为频域再用fftshift进行平移
K = J.*H;   %频域内滤波
L = ifft2(ifftshift(K));   %逆变换回到空域
L = L(1: size(I, 1), 1: size(I, 2));

figure
subplot(121), imshow(I);
subplot(122), imshow(L);

可看到高频部分被截止,图像边缘变得模糊
在这里插入图片描述

巴特沃斯滤波器

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);

M = 2*size(I, 1);
N = 2*size(I, 2);
u = -M/2 : (M/2-1);
v = -N/2 : (N/2-1);
[U, V] = meshgrid(u, v);
D = sqrt(U.^2 + V.^2);
D0 = 50;  %D0为截止频率
n = 6;      %阶数为6
H = 1./(1+(D./D0).^(2*n));
J = fftshift(fft2(I, size(H, 1), size(H, 2))); %转换为频域再用fftshift进行平移
K = J.*H;   %频域内滤波
L = ifft2(ifftshift(K));   %逆变换回到空域
L = L(1: size(I, 1), 1: size(I, 2));

figure
subplot(121), imshow(I);
subplot(122), imshow(L);

同样去除了边缘部分,图像变得模糊
在这里插入图片描述

巴特沃斯高通滤波器


代码与前面巴特沃斯的相同,只是改变了截止频率,下图为D0=30的结果
在这里插入图片描述

高斯高通滤波器

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);

M = 2*size(I, 1);
N = 2*size(I, 2);
u = -M/2 : (M/2-1);
v = -N/2 : (N/2-1);
[U, V] = meshgrid(u, v);
D = sqrt(U.^2 + V.^2);
D0 = 20;  %D0为截止频率
H = 1-exp(-(D.^2)./(2*(D0^2)));
J = fftshift(fft2(I, size(H, 1), size(H, 2))); %转换为频域再用fftshift进行平移
K = J.*H;   %频域内滤波
L = ifft2(ifftshift(K));   %逆变换回到空域
L = L(1: size(I, 1), 1: size(I, 2));

figure
subplot(121), imshow(I);
subplot(122), imshow(L);

可观察到图像的边缘得到了增强,即低频部分被滤去
在这里插入图片描述

带阻滤波器

I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = imnoise(I, 'gaussian', 0, 0.01);
I = im2double(I);

M = 2*size(I, 1);
N = 2*size(I, 2);
u = -M/2 : (M/2-1);
v = -N/2 : (N/2-1);
[U, V] = meshgrid(u, v);
D = sqrt(U.^2 + V.^2);
D0 = 50;  %D0为中心频率
W = 30;   %带宽
H = double(or(D<(D0-W/2), D>(D0+W/2)));  %阻带为50-30/2到50+30/2;   
J = fftshift(fft2(I, size(H, 1), size(H, 2))); %转换为频域再用fftshift进行平移
K = J.*H;   %频域内滤波
L = ifft2(ifftshift(K));   %逆变换回到空域
L = L(1: size(I, 1), 1: size(I, 2));

figure
subplot(121), imshow(I);
subplot(122), imshow(L);

左图加了高斯噪声,右图为阻隔了一定频率的滤波图形
在这里插入图片描述

同态滤波


同态滤波是一种特殊的滤波技术,可用于压缩图像灰度的动态范围,且增强对比度。这种处理方法与其说是一种数学技巧,倒不如说因为人眼视觉系统对图像亮度具有类似于对数运算的非线性特性。

I = imread('lena_color_512.tif');
I = rgb2gray(I);
J = log(im2double(I)+1);
K = fft2(J);
n = 5;
D0 = 0.1*pi;
rh = 0.7;
rl = 0.4;
[row, column] = size(J);

for i = 1: row
    for j = 1: column
        D1(i, j) = sqrt(i^2+j^2);
        H(i, j) = rl + (rh/(1+(D0/D1(i, j))^(2*n)));
    end
end
L = K.*H;
M = ifft2(L);
N = exp(M)-1;

figure
subplot(121), imshow(I);
subplot(122), imshow(N);

在这里插入图片描述
注意如果运行代码的时候没有别的问题,却有些矩阵维度不一样啥的,或者别的变量问题,j极大可能是没有清空变量和工作区,加入这些代码

clear all
close all


图像增强部分内容比较多,一定要好好掌握哇~

重点参考

1. Matlab之图像增强技术
2. 数字图像处理——频域滤波基础

猜你喜欢

转载自blog.csdn.net/yohnyang/article/details/128875902