空间域图像增强


title: 空间域图像增强
date: 2019-04-10 21:02:26
tags: [数字图像处理,图像增强,Digital Image]


空间域图像增强

空间域图像增强

基本概念(引用):

参考:https://www.mathworks.com/help/images/ref/imguidedfilter.html

https://blog.csdn.net/wp1603710463/article/details/50408152

https://www.zhihu.com/question/27780598

我一直怀疑我参考的是我某位学长,这跟我们学校图像方面的本科教学意料之中的一致。

​ 图像增强可分成两大类:频率域法和空间域法。前者把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。采用低通滤波(即只让低频信号通过)法,可去掉图中的噪声;采用高通滤波法,则可增强边缘等高频信号,使模糊的图片变得清晰。后者空间域法中具有代表性的算法有局部求平均值法和中值滤波(取局部邻域中的中间像素值)法等,它们可用于去除或减弱噪声。

​ 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。在图像增强过程中,不分析图像降质的原因,处理后的图像不一定逼近原始图像。图像增强技术根据增强处理过程所在的空间不同,可分为基于空域的算法和基于频域的算法两大类。基于空域的算法处理时直接对图像灰度级做运算,基于频域的算法是在图像的某种变换域内对图像的变换系数值进行某种修正,是一种间接增强的算法。

​ 基于空域的算法分为点运算算法和邻域去噪算法。点运算算法即灰度级校正、灰度变换和直方图修正等,目的或使图像成像均匀,或扩大图像动态范围,扩展对比度。邻域增强算法分为图像平滑和锐化两种。平滑一般用于消除图像噪声,但是也容易引起边缘的模糊。常用算法有均值滤波、中值滤波。锐化的目的在于突出物体的边缘轮廓,便于目标识别。常用算法有梯度法、算子、高通滤波、掩模匹配法、统计差值法等。

概念理解:图像增强?怎么才算增强了呢?
从应用角度看,怎么处理以下情况:
(1)图像太暗;
(2)图像太亮;
(3)有噪声点;
(4)对比度不明显。

空间域图像增强的方法:
1)针对每一个个像素处理
① 简单变换(取反,线性变换,指数变换,对数变换,幂次变换);
② 使用滤波器(算子)。
2)针对一组像素处理(直方图)
① 直方图均衡;
② 直方图匹配。
2.常用函数:
⑴ 取反(底片效果):imcomplement()
⑵ 二值化:~im2bw
⑶ 线性变换
⑷ 指数变换: exp()
⑸ 对数变换: log()

⑹ 幂次变换: power()
⑺ 查看直方图: imhist()
⑻ 使用直方图均衡:Histeq()
⑼ 使用平滑滤波器:(imfilter实现函数滤波)
⑽ 使用锐化滤波器
⑾ 旋转、缩放、剪切等: imrotate imresize imcrop

⑿ 对比度增强:imadjust()

实验:

  1. 用Matlab写一段程序,针对提供的图片IMG_2546.JPG,实现:

① (1)查看直方图

② (2)取反,再查看直方图

③ (3)使用直方图均衡,再查看直方图

④ (4) 通过旋转、切割,仅保留“爱丁堡花园”部分

  1. 针对图像100_3228.JPG,使用图像增强的方法使图像的效果好一点,并对比增强前后的直方图变化。

3.人脸1.jpg、2.jpg、3.jpg、4.jpg进行滤波等操作实现类似美图秀秀磨皮功能,并对比磨皮前后直方图变化。

1、图片IMG_2546.JPG

空间域图像增强

(1)查看直方图

Code:

clc
clear all
close all
subplot(3,2,1);
%查看直方图
init_Img=imread('E:\University\Digital image\IMG_2546.JPG');
%imshit()直方图的显示
%imhist需要输入一个二维的输入参数,如果输入的图像是一个彩色图像的话,
%不能直接用imhist命令,需要先将图像转成灰度图。
i=rgb2gray(init_Img);
imhist(i);
title('org hist');

直方图:

空间域图像增强

(2)取反,再查看直方图

Code:

%取反,查看
subplot(3,2,2);
contray_i = imcomplement(i);
imhist(contray_i);
title('contray hist');

结果:

空间域图像增强

(3)使用直方图均衡,再查看直方图

Code

%使用直方图均衡,再查看直方图
subplot(3,2,3);
banlance_i = histeq(i);
imhist(banlance_i);
title('均衡后');

结果:

空间域图像增强

(4)通过旋转,切割,仅保留“爱丁堡花园”部分

Code

%通过旋转,切割,仅保留“爱丁堡花园”部分
figure(2);
subplot(1,1,1);
%axis( [xmin xmax ymin ymax] )    设置当前坐标轴 x轴 和 y轴的限制范围
axis([50,250,50,200]);
imshow(init_Img);
grid on;    %显示网格线
axis on;    %显示坐标系
title('原图');
%旋转
figure(3);
subplot(1,1,1);
angle_i=imrotate(init_Img,-10,'bilinear','crop');
axis([50,200,50,200]);
imshow(angle_i);
grid on;
axis on;
title('旋转后');
%600 550 900 620   裁剪
figure(4);
subplot(1,1,1);
crop_i = imcrop(angle_i,[600,550,abs(600-900),abs(550-620)]);
imshow(crop_i);
title('裁剪后');

结果:

原图

空间域图像增强

旋转后:

空间域图像增强

裁剪后

空间域图像增强

2、图片100_3228.JPG,使用图像增强的方法使图像效果好一点,并对比增强前后的直方图变化

原图

空间域图像增强

1、使用中值滤波器 medfilt2

Code:

clc
clear all
close all
figure(1);
subplot(1,1,1);
init_Img=imread('E:\University\Digital image\100_3228.JPG');
init1 = imread('E:\University\Digital image\1.jpg');
init2 = imread('E:\University\Digital image\2.jpg');
init3 = imread('E:\University\Digital image\3.jpg');
init4 = imread('E:\University\Digital image\4.jpg');

imshow(init_Img);

figure(2);
subplot(1,1,1);
init_rgb = rgb2gray(init_Img);
imhist(init_rgb);
title('init hist');

%用图像增强的方法使图像的效果好一点,并对比增强前后的直方图变化。

%直方图均衡化实现
figure(3);
subplot(1,1,1);
tmp1=init_Img;
R = tmp1(:,:,1);
G = tmp1(:,:,2);
B = tmp1(:,:,3);
%medfilt2 消除噪声, 中值滤波器, 椒盐噪声
r=medfilt2(R);    %medfilt2()中值滤波 
g=medfilt2(G);
b=medfilt2(B);
o=histeq(r);  %直方图均衡
p=histeq(g);
q=histeq(b);
%cat:用来联结数组
Photo1 = cat(3,o,p,q);
imshow(Photo1,[]);
title('均衡化后的图像');

空间域图像增强

2、使用高斯滤波器

Code:

%使用imfilter滤波
%https://blog.csdn.net/u010740725/article/details/51557202
figure(4);
subplot(1,1,1);
tmp2 = init_Img;
R1 = tmp2(:,:,1);
G1 = tmp2(:,:,2);
B1 = tmp2(:,:,3);
r1 = histeq(R1);
g1 = histeq(G1);
b1 = histeq(B1);
%fspecial() 生成滤波器(也叫算子)的函数
%fspecial(type,para)
%gaussian 高斯滤波器  
gaussianFilter = fspecial('gaussian',[7,7],5);  %滤波器size:7*7 标准差:5
%imfilter() 
%函数语法:g=imfilter(f,w,filtering_mode,boundary_options,size_optinos) 
%函数功能:对任意类型数组或多维图像进行滤波 
%参数介绍:f是输入图像,w为滤波模板,g为滤波结果;表1-1总结了其他参数的含义。
o1 = imfilter(r1,gaussianFilter, 'symmetric','conv');
p1 = imfilter(g1,gaussianFilter, 'symmetric','conv');
q1 = imfilter(b1,gaussianFilter, 'symmetric','conv');
Photo2 = cat(3,o1,p1,q1);
imshow(Photo2,[]);
title('均衡化后的图像');

空间域图像增强

比较结果:

%比较效果
figure(5);
subplot(1,3,1);
imshow(init_Img);
subplot(1,3,2);
imshow(Photo1);
subplot(1,3,3);
imshow(Photo2);
title('比较');

空间域图像增强

figure(5);
subplot(1,3,1);
imhist(init_rgb);
subplot(1,3,2);
rgb1 = rgb2gray(Photo1);
imhist(rgb1);
subplot(1,3,3);
rgb2 = rgb2gray(Photo2);
imhist(rgb2);
title('直方图比较');

空间域图像增强

3、实现类似美图秀秀磨皮功能,并对比磨皮前后直方图变化

clc
clear all
close all
init_Img=imread('E:\University\Digital image\100_3228.JPG');
init1 = imread('E:\University\Digital image\1.jpg');
init2 = imread('E:\University\Digital image\2.jpg');
init3 = imread('E:\University\Digital image\3.jpg');
init4 = imread('E:\University\Digital image\4.jpg');
figure(16);
LL = double(init4);
HH= double(imguidedfilter(uint8(LL))) -LL +135;
%HH= double(imgaussfilt(uint8(LL),2)) -LL +135;
GG = imfilter(HH,fspecial('gaussian',[3,3],100));
opacity = 50;
Dest = (LL*(100-opacity) + (LL+2*GG-256)*opacity)/100;
imshow([uint8(LL) uint8(Dest)]);
title('数学公式');

空间域图像增强
空间域图像增强

空间域图像增强

空间域图像增强

最后一张直方图对比:

空间域图像增强

代码:

clc
clear all
close all
subplot(3,2,1);
%查看直方图
init_Img=imread('E:\University\Digital image\IMG_2546.JPG');
%imshit()直方图的显示
%imhist需要输入一个二维的输入参数,如果输入的图像是一个彩色图像的话,
%不能直接用imhist命令,需要先将图像转成灰度图。
i=rgb2gray(init_Img);
imhist(i);
title('org hist');
%取反,查看
subplot(3,2,2);
contray_i = imcomplement(i);
imhist(contray_i);
title('contray hist');

%使用直方图均衡,再查看直方图
subplot(3,2,3);
banlance_i = histeq(i);
imhist(banlance_i);
title('均衡后');

%通过旋转,切割,仅保留“爱丁堡花园”部分
figure(2);
subplot(1,1,1);
%axis( [xmin xmax ymin ymax] )    设置当前坐标轴 x轴 和 y轴的限制范围
axis([50,250,50,200]);
imshow(init_Img);
grid on;    %显示网格线
axis on;    %显示坐标系
title('原图');
%旋转
figure(3);
subplot(1,1,1);
angle_i=imrotate(init_Img,-10,'bilinear','crop');
axis([50,200,50,200]);
imshow(angle_i);
grid on;
axis on;
title('旋转后');
%600 550 900 620   裁剪
figure(4);
subplot(1,1,1);
crop_i = imcrop(angle_i,[600,550,abs(600-900),abs(550-620)]);
imshow(crop_i);
title('裁剪后');
clc
clear all
close all
figure(1);
init_Img=imread('E:\University\Digital image\100_3228.JPG');
init1 = imread('E:\University\Digital image\1.jpg');
init2 = imread('E:\University\Digital image\2.jpg');
init3 = imread('E:\University\Digital image\3.jpg');
init4 = imread('E:\University\Digital image\4.jpg');
%人脸1.jpg、2.jpg、3.jpg、4.jpg进行滤波等操作实现类似美图秀秀磨皮功能,并对比磨皮前后直方图变化
%可使用平滑滤波器
%常数128,其实也不一定是个定值,如果把他调大,则处理后的图像整体偏亮,调小则图像偏暗。
% 第五步的图层的不透明度参数也是一个道理,如果不透明度值越大,则图片整体的斑点可能会偏多,
%偏小,那么图像又会过于模糊,也许取个50%是个不错的选择吧,
%或者自己根据处理的纹理图的某个指标做个算法更好吧。
imshow(init_Img);

figure(2);
subplot(1,1,1);
init_rgb = rgb2gray(init_Img);
imhist(init_rgb);
title('init hist');

%用图像增强的方法使图像的效果好一点,并对比增强前后的直方图变化。

%直方图均衡化实现
figure(3);
subplot(1,1,1);
tmp1=init_Img;
R = tmp1(:,:,1);
G = tmp1(:,:,2);
B = tmp1(:,:,3);
%https://blog.csdn.net/cy_543/article/details/41548399
%http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=537123
%medfilt2 消除噪声, 中值滤波器, 椒盐噪声
r=medfilt2(R);    %medfilt2()中值滤波 
g=medfilt2(G);
b=medfilt2(B);
o=histeq(r);  %直方图均衡
p=histeq(g);
q=histeq(b);
%cat:用来联结数组
Photo1 = cat(3,o,p,q);
imshow(Photo1,[]);
title('均衡化后的图像');


%使用imfilter滤波
%https://blog.csdn.net/u010740725/article/details/51557202
figure(4);
subplot(1,1,1);
tmp2 = init_Img;
R1 = tmp2(:,:,1);
G1 = tmp2(:,:,2);
B1 = tmp2(:,:,3);
r1 = histeq(R1);
g1 = histeq(G1);
b1 = histeq(B1);
%fspecial() 生成滤波器(也叫算子)的函数
%fspecial(type,para)
%gaussian 高斯滤波器  
%https://blog.csdn.net/chaolei3/article/details/79400658
gaussianFilter = fspecial('gaussian',[7,7],5);  %滤波器size:7*7 标准差:5
%imfilter() 
%函数语法:g=imfilter(f,w,filtering_mode,boundary_options,size_optinos) 
%函数功能:对任意类型数组或多维图像进行滤波 
%参数介绍:f是输入图像,w为滤波模板,g为滤波结果;表1-1总结了其他参数的含义。
o1 = imfilter(r1,gaussianFilter, 'symmetric','conv');
p1 = imfilter(g1,gaussianFilter, 'symmetric','conv');
q1 = imfilter(b1,gaussianFilter, 'symmetric','conv');
Photo2 = cat(3,o1,p1,q1);
imshow(Photo2,[]);
title('均衡化后的图像');

%比较效果
figure(5);
subplot(1,3,1);
imshow(init_Img);
subplot(1,3,2);
imshow(Photo1);
subplot(1,3,3);
imshow(Photo2);
title('比较');

figure(5);
subplot(1,3,1);
imhist(init_rgb);
subplot(1,3,2);
rgb1 = rgb2gray(Photo1);
imhist(rgb1);
subplot(1,3,3);
rgb2 = rgb2gray(Photo2);
imhist(rgb2);
title('直方图比较');




figure(16);
LL = double(init4);
HH= double(imguidedfilter(uint8(LL))) -LL +135;
%HH= double(imgaussfilt(uint8(LL),2)) -LL +135;
GG = imfilter(HH,fspecial('gaussian',[3,3],100));
opacity = 50;
Dest = (LL*(100-opacity) + (LL+2*GG-256)*opacity)/100;
imshow([uint8(LL) uint8(Dest)]);
title('数学公式');

figure(17);
subplot(1,2,1);
initrgb = rgb2gray(uint8(LL));
imhist(initrgb);
title('原图');
subplot(1,2,2);
tranrgb = rgb2gray(uint8(Dest));
imhist(tranrgb);
title('处理后');

%利用均值滤波对图像进行平滑处理
%M = rgb2gray(init2);
M = init4;
MR = M(:,:,1);
MG = M(:,:,2);
MB = M(:,:,3);
%添加高斯噪声 均值为0 方差w为0.02
mr = imnoise(MR,'gaussian',0,0.01);
mg = imnoise(MG,'gaussian',0,0.01);
mb = imnoise(MB,'gaussian',0,0.01);
%mr = histeq(mr);
%mg = histeq(mg);
%mb = histeq(mb);
re_Img1 = cat(3,mr,mg,mb);
% ctrl R T 注释操作

M= rgb2gray(init4);
J=imnoise(M,'gaussian',0,0.02);
J = double(J);
 H1 = ones(3)/9;
 H2 = ones(7)/49;
G1 = conv2(J,H1,'same');
G2 = conv2(J,H2,'same');

%J= rgb2gray(init4);
%均值滤波
%C=conv2(A,B,shape);        %卷积滤波
%:输入图像,B:卷积核
%https://blog.csdn.net/jinv5/article/details/52874880
%只能处理灰度图像

% MR = double(MR);
% MG = double(MG);
% MB = double(MB);
% H1 = ones(3)/9;
% H2 = ones(7)/49;
% G1r = conv2(MR,H1,'same');
% G1g = conv2(MG,H1,'same');
% G1b = conv2(MB,H1,'same');
% G1 = cat(3,G1r,G1g,G1b);

% G2r = conv2(MR,H1,'same');
% G2g = conv2(MG,H1,'same');
% G2b = conv2(MB,H1,'same');
% G2 = cat(3,G2r,G2g,G2b);
figure(6);
subplot(2,2,1);
imshow(M);
title('原图像');

subplot(2,2,2);
imshow(re_Img1,[]);
title('高斯噪声');

subplot(2,2,3);
imshow(G1,[]);
title('3*3均值滤波图像');

subplot(2,2,4);
imshow(G2,[]);
title('7*7均值滤波图像');

% figure(7);
% imshow(re_Img1,[]);
% 
% figure(8);
% imshow(G1,[]);
% 
% figure(9);
% imshow(G2,[]);


%直方图均衡化实现
tmpn=init4;
Rn = tmpn(:,:,1);
Gn = tmpn(:,:,2);
Bn = tmpn(:,:,3);
%https://blog.csdn.net/cy_543/article/details/41548399
%http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=537123
rn=medfilt2(Rn);    %medfilt2()中值滤波
gn=medfilt2(Gn);
bn=medfilt2(Bn);
 %on=histeq(rn);  %直方图均衡
 %pn=histeq(gn);
 %qn=histeq(bn);
%cat:用来联结数组
Photon = cat(3,rn,gn,bn);
%Photon = cat(3,on,pn,qn);

tmp22 = init4;
R12 = tmp22(:,:,1);
G12 = tmp22(:,:,2);
B12 = tmp22(:,:,3);
r12 = R12;
g12 = G12;
b12 = B12;
%r12 = histeq(R12);
%g12 = histeq(G12);
%b12 = histeq(B12);
%fspecial() 生成滤波器(也叫算子)的函数
%fspecial(type,para)
%gaussian 高斯滤波器  
%https://blog.csdn.net/chaolei3/article/details/79400658
gaussianFilter = fspecial('gaussian',[30,30],7);  %滤波器size:7*7 标准差:5
%imfilter() 
%函数语法:g=imfilter(f,w,filtering_mode,boundary_options,size_optinos) 
%函数功能:对任意类型数组或多维图像进行滤波 
%参数介绍:f是输入图像,w为滤波模板,g为滤波结果;表1-1总结了其他参数的含义。
o12 = imfilter(r12,gaussianFilter, 'symmetric','conv');
p12 = imfilter(g12,gaussianFilter, 'symmetric','conv');
q12 = imfilter(b12,gaussianFilter, 'symmetric','conv');
Photon2 = cat(3,o12,p12,q12);

figure(10);
subplot(2,2,1);
imshow(init4);
title('原图');

subplot(2,2,2);
imshow(re_Img1);
title('高斯去噪');

subplot(2,2,3);
imshow(Photon,[]);
title('中值滤波');

subplot(2,2,4);
imshow(Photon2,[]);
title('高斯滤波');

figure(15);
%imguide
imguide = init4;
imguided = imguidedfilter(imguide);
imshow(imguided);
title('imguidedfilter');

Matlab图像处理函数汇总:
1、图像的变换
① fft2:fft2函数用于数字图像的二维傅立叶变换,如:i=imread('104_8.tif');
j=fft2(i);
②ifft2::ifft2函数用于数字图像的二维傅立叶反变换,如:
 i=imread('104_8.tif');
 j=fft2(i);
k=ifft2(j);
2、模拟噪声生成函数和预定义滤波器
① imnoise:用于对图像生成模拟噪声,如:
 i=imread('104_8.tif');
 j=imnoise(i,'gaussian',0,0.02);%模拟高斯噪声
② fspecial:用于产生预定义滤波器,如:
h=fspecial('sobel');%sobel水平边缘增强滤波器
h=fspecial('gaussian');%高斯低通滤波器
h=fspecial('laplacian');%拉普拉斯滤波器
h=fspecial('log');%高斯拉普拉斯(LoG)滤波器
h=fspecial('average');%均值滤波器
2、图像的增强
①直方图:imhist函数用于数字图像的直方图显示,如:
i=imread('104_8.tif');
imhist(i);
②直方图均化:histeq函数用于数字图像的直方图均化,如:
i=imread('104_8.tif');
j=histeq(i);
③对比度调整:imadjust函数用于数字图像的对比度调整,如:i=imread('104_8.tif');
j=imadjust(i,[0.3,0.7],[]);
④对数变换:log函数用于数字图像的对数变换,如:
i=imread('104_8.tif');
j=double(i);
k=log(j);
⑤基于卷积的图像滤波函数:filter2函数用于图像滤波,如:i=imread('104_8.tif');
h=[1,2,1;0,0,0;-1,-2,-1];
j=filter2(h,i);
⑥线性滤波:利用二维卷积conv2滤波, 如:
i=imread('104_8.tif');
h=[1,1,1;1,1,1;1,1,1];
h=h/9;
j=conv2(i,h);
⑦中值滤波:medfilt2函数用于图像的中值滤波,如:
i=imread('104_8.tif');
j=medfilt2(i);
⑧锐化
(1)利用Sobel算子锐化图像, 如:
i=imread('104_8.tif');
h=[1,2,1;0,0,0;-1,-2,-1];%Sobel算子
j=filter2(h,i);
(2)利用拉氏算子锐化图像, 如:
i=imread('104_8.tif');
j=double(i);
h=[0,1,0;1,-4,1;0,1,0];%拉氏算子
k=conv2(j,h,'same');
m=j-k;
3、图像边缘检测
①sobel算子 如:
i=imread('104_8.tif');
j = edge(i,'sobel',thresh)

②prewitt算子 如:
i=imread('104_8.tif');
j = edge(i,'prewitt',thresh)
③roberts算子  如:
i=imread('104_8.tif');
j = edge(i,'roberts',thresh)
④log算子  如:
i=imread('104_8.tif');
j = edge(i,'log',thresh)
⑤canny算子 如:
i=imread('104_8.tif');
j = edge(i,'canny',thresh)
⑥Zero-Cross算子 如:
i=imread('104_8.tif');
j = edge(i,'zerocross',thresh)
4、形态学图像处理
①膨胀:是在二值化图像中“加长”或“变粗”的操作,函数imdilate执行膨胀运算,如:
a=imread('104_7.tif'); %输入二值图像
b=[0 1 0;1 1 1;0 1 0]; 
c=imdilate(a,b);
②腐蚀:函数imerode执行腐蚀,如:
a=imread('104_7.tif'); %输入二值图像
b=strel('disk',1);
c=imerode(a,b);
③开运算:先腐蚀后膨胀称为开运算,用imopen来实现,如:
 a=imread('104_8.tif');
b=strel('square',2);
c=imopen(a,b);
④闭运算:先膨胀后腐蚀称为闭运算,用imclose来实现,如:
 a=imread('104_8.tif');
b=strel('square',2);
c=imclose(a,b);

4.12