一、实验意义及目的
(1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。 (2)掌握各种图像增强方法。
二、实验内容
1.打开一幅彩色图像Image1,使用Matlab图像处理函数,对其进行下列变换: (1)将Image1灰度化为gray,统计并显示其灰度直方图; (2)对gray进行分段线性变换; (3)对gray进行直方图均衡化; (4)对gray进行伪彩色增强; (5)对gray添加噪声并平滑; (6)对gray利用Sobel算子锐化; (7)实验要求中的拓展内容。
2.拓展内容: (1)对以上处理变换参数,查看处理效果; (2)更改伪彩色增强方法为热金属编码或彩虹编码; (3)设计不同的平滑滤波、锐化滤波方法,查看处理效果; (4)自行设计方法,实现对彩色图像增强处理。
三、实验原理
1.灰度线性变换就是将图像中所有点的灰度按照线性灰度变换函数进行变换。 2.直方图均衡化通过点运算将输入图像转换为在每一级上都有相等像素点数的输出图像。 3.伪彩色增强:把一幅黑白域图像的不同灰度级映射为一幅彩色图像的技术手段。 4.锐化(Sharpening) :图像在传输或变换过程中(如未聚焦好)、受到各种干扰而退化,典型的是图像模糊,而图像的判读和识别中,常需突出目标的轮廓或边缘信息。 5.边缘锐化:主要增强图像的轮廓边缘、细节( 灰度跳变部分),以突出图像中景物的边缘或纹理,形成完整的物体边界,使边缘和轮廓模糊的图像清晰,又叫空域高通滤波(俗称为勾边处理)。
四、Matlab相关函数介绍
(1)imhist函数 功能:统计变显示图像的直方图。 调用格式: imhist(I):显示图像I的直方图。 imhist(I, n):显示图像I的直方图,n指定直方图中的列数。 [COUNTS,X] = imhist(…):返回直方图数据向量COUNTS和相应的色彩值向量X。 (2)histeq函数 功能:直方图均衡化 调用格式: J = histeq(I,hgram):将图像I的直方图变成用户指定的向量hgram,hgram中的各元素值域为[0,1]; J = histeq(I,N):对原始图像I进行直方图均衡化,N为输出图像的灰度技术,默认N为64。 (3)imadjust函数 功能:调整图像灰度值或颜色映射表,增加图像的对比度。 调用格式: J = imadjust(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA):调整图像I的灰度值;[LOW_IN; HIGH_IN]指定原始图像中要变换的灰度范围;[LOW_OUT; HIGH_OUT]指定变换后的灰度范围;低于LOW_IN 、高于HIGH_IN 的采取截取式;都可以使用空的矩阵[],默认值是[0 1]; GAMMA为标量,指定描述值I和值J关系的曲线形状,如果小于1,此映射偏重更高数值(明亮)输出,如果gamma大于1,此映射偏重更低数值(灰暗)输出,如果省略此参数,默认为(线性映射)。 NEWMAP = imadjust(MAP,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA):调整索引图像的颜色表map,其他参量同上。 RGB2 = imadjust(RGB1,…):对RGB图像RGB1的R、G、B分量进行调整。 (4)imnoise函数 J = imnoise(I,type,parameters):按指定类型在图像I上添加噪声;type表示噪声类型,parameters为其所对应参数,可取值如表1所示: 表1 imnoise函数参数表 (5)fspecial函数 h=fspecial(type,parameters):创建指定类型和参数的二维滤波器h,如表2所示: 表2 fspecial函数参数表 (6)filter2函数 Y = filter2(B,X,shape):使用二维FIR滤波器B对矩阵X进行滤波;shape指定返回值Y的形式,‘full’:Y的维数大于X;‘same’:Y的维数等于X;‘valid’:Y的维数小于X;默认为same。 (7)imfilter函数 B=imfilter(A,H,option1,option2,…):根据指定的属性option1,option2…等,使用多维滤波器H对图像A进行滤波,H常由函数fspecial输出得到。属性参数如表3所示: 表3 imfilter函数参数表 (8)medfilt2函数 B = medfilt2(A,[m n]]):用[m n]大小的滤波器对图像A进行中值滤波,输出图像为B,滤波器大小默认为3×3。 (9)edge函数 BW = edge(I):对灰度或二值图像I进行边缘检测,检测后图像为二值图像BW,边界处取值为1,否则为0。缺省情况下,edge函数使用Sobel算子检测边缘,也可以指定算子。 BW = edge(I,‘sobel’);BW = edge(I,‘prewitt’);BW = edge(I,‘roberts’); BW = edge(I,‘log’);BW = edge(I,‘canny’)引号内为指定算子。 BW = edge(I,‘sobel’,thresh):thresh指定保留边缘的阈值,若为0,edge函数自动选择该值。
五、代码及结果
(1)将Image1灰度化为gray,统计并显示其灰度直方图;
(2)对gray进行分段线性变换;
代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
imhist(gray),title('灰度直方图');
[h,w]=size(gray);
NewImage1=zeros(h,w);
a=80/256; b=180/256; c=30/256; d=220/256;
for x=1:w
for y=1:h
if gray(y,x)<a
NewImage1(y,x)=gray(y,x)*c/a;
elseif gray(y,x)<b
NewImage1(y,x)=(gray(y,x)-a)*(d-c)/(b-a)+c;
else
NewImage1(y,x)=(gray(y,x)-b)*(255-d)/(255-b)+d;
end
end
end
figure,imshow(NewImage1),title('分段线性变换');
结果:
(3)对gray进行直方图均衡化;
代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
NewImage2=histeq(gray);
figure,imshow(NewImage2),title('直方图均衡化');
结果:
(4)对gray进行伪彩色增强;
代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
NewImage3=zeros(h,w,3);
for x=1:w
for y=1:h
if gray(y,x)<64/256
NewImage3(y,x,1)=0;
NewImage3(y,x,2)=4*gray(y,x);
NewImage3(y,x,3)=1;
elseif gray(y,x)<128/256
NewImage3(y,x,1)=0;
NewImage3(y,x,2)=1;
NewImage3(y,x,3)=2-4*gray(y,x);
elseif gray(y,x)<192/256
NewImage3(y,x,1)=4*gray(y,x)-2;
NewImage3(y,x,2)=1;
NewImage3(y,x,3)=0;
else
NewImage3(y,x,1)=1;
NewImage3(y,x,2)=4-4*gray(y,x);
NewImage3(y,x,3)=0;
end
end
end
figure,imshow(NewImage3),title('伪彩色增强');
结果:
(5)对gray添加噪声并平滑;
代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
noiseIsp=imnoise(gray,'salt & pepper',0.1);
noiseIg=imnoise(gray,'gaussian');
result1=medfilt2(noiseIsp);
result2=medfilt2(noiseIg);
figure;
subplot(121),imshow(result1),title('椒盐噪声3×3中值滤波');
subplot(122),imshow(result2),title('高斯噪声3×3中值滤波');
结果:
(6)对gray利用Sobel算子锐化;
代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
H1=[-1 -2 -1;0 0 0;1 2 1];
H2=[-1 0 1;-2 0 2;-1 0 1];
R1=imfilter(gray,H1);
R2=imfilter(gray,H2);
edgeImage=abs(R1)+abs(R2);
sharpImage=gray+edgeImage;
figure;
subplot(121),imshow(edgeImage),title('Sobel梯度图像');
subplot(122),imshow(sharpImage),title('Sobel锐化图像');
结果:
(7)拓展内容
(1)对以上处理变换参数,查看处理效果;
代码:
Image1=im2double(imread('lotus1.bmp'));
gray=rgb2gray(Image1);
noiseIsp=imnoise(gray,'salt & pepper',0.05);
noiseIg=imnoise(gray,'gaussian',0.15);
result1=medfilt2(noiseIsp);
result2=medfilt2(noiseIg);
figure;
subplot(121),imshow(result1),title('椒盐噪声3×3中值滤波(参数0.05)');
subplot(122),imshow(result2),title('高斯噪声3×3中值滤波(参数0.15)');
结果:
(2)更改伪彩色增强方法为热金属编码或彩虹编码;
热金属编码 代码:
Image1=imread('lotus.bmp');
%转换为灰度
gray=rgb2gray(Image1);
[h,w]=size(gray);
%新图像的矩阵
NewImage4=zeros(h,w,3);
for x=1:h
for y=1:w
if gray(x,y)<64
NewImage4(x,y,1)=0;
elseif gray(x,y)<128
NewImage4(x,y,1)=255*(gray(x,y)-64)/64;
else
NewImage4(x,y,1)=255;
end
end
end
for x=1:h
for y=1:w
if gray(x,y)<128
NewImage4(x,y,2)=0;
elseif gray(x,y)<192
NewImage4(x,y,2)=255*(gray(x,y)-128)/64;
else
NewImage4(x,y,2)=255;
end
end
end
for x=1:h
for y=1:w
if gray(x,y)<64
NewImage4(x,y,3)=255*gray(x,y)/64;
elseif gray(x,y)<96
NewImage4(x,y,3)=255;
elseif gray(x,y)<128
NewImage4(x,y,3)=255*(128-gray(x,y))/32;
elseif gray(x,y)<192
NewImage4(x,y,3)=0;
else
NewImage4(x,y,3)=255*(gray(x,y)-192)/64;
end
end
end
imshow(NewImage4),title('热金属编码')
结果:
彩虹编码 代码:
Image1=imread('lotus1.bmp');
%转换为灰度
gray=rgb2gray(Image1);
[h,w]=size(gray);
%新图像的矩阵
NewImage3=zeros(h,w,3);
for x=1:h
for y=1:w
if gray(x,y)<96
NewImage3(x,y,1)=0;
elseif gray(x,y)<128
NewImage3(x,y,1)=255*(gray(x,y)-96)/32;
else
NewImage3(x,y,1)=255;
end
end
end
for x=1:h
for y=1:w
if gray(x,y)<32
NewImage3(x,y,2)=0;
elseif gray(x,y)<64
NewImage3(x,y,2)=255*(gray(x,y)-32)/32;
elseif gray(x,y)<128
NewImage3(x,y,2)=255;
elseif gray(x,y)<192
NewImage3(x,y,2)=255*(192-gray(x,y))/64;
else
NewImage3(x,y,2)=255*(gray(x,y)-192)/64;
end
end
end
for x=1:h
for y=1:w
if gray(x,y)<32
NewImage3(x,y,3)=255*gray(x,y)/32;
elseif gray(x,y)<64
NewImage3(x,y,3)=255;
elseif gray(x,y)<96
NewImage3(x,y,3)=255*(96-gray(x,y))/32;
elseif gray(x,y)<192
NewImage3(x,y,3)=0;
else
NewImage3(x,y,3)=255*(gray(x,y)-192)/64;
end
end
end
imshow(NewImage3),title('彩虹编码')
结果:
(3)设计不同的平滑滤波、锐化滤波方法,查看处理效果;
平滑滤波 代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
noisegaus=imnoise(gray,'gaussian'); %高斯噪声
figure;
subplot(121),imshow(gray),title('原图');
subplot(122),imshow(noisegaus),title('高斯噪声图');
result1=filter2(fspecial('average',3),noisegaus);
figure;
imshow(result1),title('3*3 均值滤波');
gausFilter=fspecial('gaussian',[2*3+1 2*3+1],0.6);
result2 = imfilter(noisegaus,gausFilter,'conv');
figure;
imshow(result2),title('sigmal=0.6 高斯滤波');
result3 = medfilt2(noisegaus);
figure;
imshow(result3),title('3*3 中值滤波');
image2 = imread('lotus.bmp');
image2 = imnoise(image2,'gaussian');
Fimage = fftshift(fft2(double(image2)));
[N M] = size(Fimage);
g = zeros(N,M);
r1 = floor(M/2); r2=floor(N/2);
d0 = [5 11 45 68];
for i = 1:4
for x = 1:M
for y = 1:N
d = sqrt((x-r1)^2+(y-r2)^2);
if d<=d0(i)
h=1;
else
h=0;
end
g(y,x) = h*Fimage(y,x);
end
end
g = real(ifft2(ifftshift(g)));
figure,imshow(uint8(g)),title(['理想低通滤波 D0=',num2str(d0(i))]);
end
结果: 3*3 中值滤波
锐化滤波 代码:
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
H1=[-1 -2 -1;0 0 0;1 2 1];
H2=[-1 0 1;-2 0 2;-1 0 1];
R1=imfilter(gray,H1);
R2=imfilter(gray,H2);
edgeImage=abs(R1)+abs(R2);
sharpImage=gray+edgeImage;
figure;
subplot(121),imshow(edgeImage),title('Sobel 梯度图像');
subplot(122),imshow(sharpImage),title('Sobel 锐化图像 ');
H1=[1 0;0 -1]; H2=[0 1;-1 0]; R1=imfilter(gray,H1);
R2=imfilter(gray,H2); edgeImage=abs(R1)+abs(R2);
sharpImage=gray+edgeImage;
figure; subplot(121),imshow(edgeImage),title('Roberts 梯度图像 ');
subplot(122),imshow(sharpImage),title('Roberts 锐化图像 ');
H1=[-1 -1 -1;0 0 0;1 1 1];
H2=[-1 0 1;-1 0 1;-1 0 1];
R1=imfilter(gray,H1);
R2=imfilter(gray,H2);
edgeImage=abs(R1)+abs(R2);
sharpImage=gray+edgeImage;
figure;
subplot(121),imshow(edgeImage),title('Prewitt 梯度图像 ');
subplot(122),imshow(sharpImage),title('Prewitt 锐化图像 ');
H = fspecial('laplacian',0);
R = imfilter(gray,H);
edgeImage = abs(R);
H1 = [0 -1 0;-1 5 -1;0 -1 0];
sharpImage = imfilter(gray,H1);
figure;
subplot(121),imshow(edgeImage),title('Laplacian 滤波图 像');
subplot(122),imshow(sharpImage),title('Laplacian锐化图 像');
BW = edge(gray,'log');
H = fspecial('log',7,1);
R = imfilter(gray,H);
edgeImage = abs(R);
sharpImage = gray+edgeImage;
figure;
subplot(131),imshow(BW),title('LOG 边缘检测图像');
subplot(132),imshow(edgeImage),title('LOG 梯度图像');
subplot(133),imshow(sharpImage),title('LOG 锐化图像');
BW = edge(gray,'canny');
figure;
imshow(BW),title('Canny 边缘检测');
结果: Sobel 算子效果图
Roberts 算子效果图
Prewitt 算子效果图 Laplacian 算子效果图
LOG 算子效果图
Canny 算子效果图
(4)自行设计方法,实现对彩色图像增强处理。
图像进行增强、主要增强两方面,一方面是图像的亮度,另一方面就是图像的对比度。 参考链接:https://www.jianshu.com/p/5a8d12d6c649 **第一种方法:**将RGB格式的图像转为HSV或者HSI格式,对于亮度值进行修改。主要是对V值直方图进行均衡化。 代码:
clear all;
close all;
RGB=imread('lotus.bmp');
HSV=rgb2hsv(RGB);
H=HSV(:,:,1);
S=HSV(:,:,2);
V=HSV(:,:,3);
figure;
subplot(1,3,1),imhist(H);
subplot(1,3,2),imhist(S);
subplot(1,3,3),imhist(V);
V=histeq(V);
figure,imhist(V);
HSV(:,:,1)=H;
HSV(:,:,2)=S;
HSV(:,:,3)=V;
RGB_1=hsv2rgb(HSV);
figure;
subplot(1,2,1),imshow(RGB);
subplot(1,2,2),imshow(RGB_1);
结果:
第二种方法就是对RGB三个通道直接进行直方图均衡化。 代码:
clear all;
close all;
RGB=imread('lotus.bmp');
R=double((RGB(:,:,1)))/255;
G=double((RGB(:,:,2)))/255;
B=double((RGB(:,:,3)))/255;
figure;
subplot(1,3,1),imshow(R);
subplot(1,3,2),imshow(G);
subplot(1,3,3),imshow(B);
R=histeq(R);
G=histeq(G);
B=histeq(B);
RGB_1(:,:,1)=R;
RGB_1(:,:,2)=G;
RGB_1(:,:,3)=B;
figure;
subplot(1,2,1),imshow(RGB);
subplot(1,2,2),imshow(RGB_1),brighten(0.6);
figure;
subplot(1,3,1),imhist(R);
subplot(1,3,2),imhist(G);
subplot(1,3,3),imhist(B);
结果: 第三种方法就是目前我采用的,根据HE、BBHE、DSIHE、所采用的一种图像增强方法。其原理简单介绍如下: 首先将RGB图像转为灰度图像、那么每个灰度图像像素的数值根据最大值法即:max(R,G,B)来确定, 接着处理灰度图像的直方图、找出该图像的平均值、将直方图划分为两部分、接着分别对两部分的直方图进行均衡化处理。 在处理完成之后、对图像进行恢复、即将灰度图像转化成RGB图像,找出处理之后的图像与之前图像的数值比例关系、然后将其与图像想乘,即得到R、G、B三个分量的数值。 代码:
clear all;
close all;
clc;
RGB=imread('lotus.bmp');
[row,column,n]=size(RGB);
R=RGB(:,:,1);
G=RGB(:,:,2);
B=RGB(:,:,3);
for i=1:row
for j=1:column
juzhen=[R(i,j),G(i,j),B(i,j)];
intensity_1(i,j)=0.2989*R(i,j)+0.587*G(i,j)+0.114*B(i,j);
intensity_2(i,j)=1/3*(R(i,j)+G(i,j)+B(i,j));
intensity_3(i,j)=max(juzhen);
end
end
figure,
subplot(2,2,1),imshow(rgb2gray(RGB));
subplot(2,2,2),imshow(intensity_1);
subplot(2,2,3),imshow(intensity_2);
subplot(2,2,4),imshow(intensity_3);
Pre_image=intensity_3;
figure;
subplot(2,2,1),imshow(intensity_3);
subplot(2,2,2),imhist(intensity_3);
subplot(2,2,3),imshow(Pre_image);
subplot(2,2,4),imhist(Pre_image);
Pre_image=im2uint8(Pre_image);
[height,width]=size(Pre_image);
XT=round(mean(mean(Pre_image)));
h = zeros(1,256);%统计各灰度数目,共256个灰度级
for m = 1:height
for n = 1: width
h(Pre_image(m,n) + 1) = h(Pre_image(m,n) + 1) + 1;%对应灰度值像素点数量增加一
end
end
SH1=0;
SH2=0;
for x=0:XT
SH1=SH1+h(x+1);
end
for x=(XT+1):255
SH2=SH2+h(x+1);
end
N=height*width;
RSH1=SH1/N;
RSH2=SH2/N;
SEP_P=round(255*RSH1);
DRH1_start=0;
DRH1_end=SEP_P;
DRH2_start=SEP_P+1;
DRH2_end=255;
sum1=0;
CH1=zeros(1,256);
for x_1=0:XT
sum1=sum1+h(x_1+1);
CH1(x_1+1)=sum1/SH1;
end;
sum2=0;
CH2=zeros(1,256);
for x_2=(XT+1):255
sum2=sum2+h(x_2+1);
CH2(x_2+1)=sum2/SH2;
end
for i=1:height
for j=1:width
if Pre_image(i,j)
h(Pre_image(i,j)+1)=DRH1_start+(DRH1_end-DRH1_start)*CH1(Pre_image(i,j)+1);
else
h(Pre_image(i,j)+1)=DRH2_start+(DRH2_end-DRH2_start)*CH2(Pre_image(i,j)+1);
end
end
end
for i=1:height
for j=1:width
Aft_image(i,j)=h(Pre_image(i,j)+1);
end
end
Aft_image=uint8(Aft_image);
subplot(1,2,1),imhist(Aft_image);
subplot(1,2,2),imshow(Aft_image);
for i=1:height
for j=1:width
Alpha(i,j)=double(Aft_image(i,j))./double(intensity_3(i,j));
end
end
intensity_R=Alpha.*double(R);
intensity_G=Alpha.*double(G);
intensity_B=Alpha.*double(B);
RGB_1(:,:,1)=intensity_R;
RGB_1(:,:,2)=intensity_G;
RGB_1(:,:,3)=intensity_B;
figure,
subplot(1,2,2),imshow(uint8(RGB_1));
subplot(1,2,1),imshow(RGB);
结果:
六、实验总结
1.锐化 (1)锐化(Sharpening) :图像在传输或变换过程中(如未聚焦好)、受到各种干扰而退化,典型的是图像模糊,而图像的判读和识别中,常需突出目标的轮廓或边缘信息。 (2)边缘锐化:主要增强图像的轮廓边缘、细节( 灰度跳变部分),以突出图像中景物的边缘或纹理,形成完整的物体边界,使边缘和轮廓模糊的图像清晰,又叫空域高通滤波(俗称为勾边处理)。 从数学角度看,图像模糊相当于图像被平均或者积分,为实现图像的锐化,我们需要运用它的反运算“微分”——加强高频分量,实现轮廓清晰。 这里我们使用的是matlab自带的edge函数,三种滤波的简单原理为: Sobel算子,以一个点为基准向四周取出3*3的矩阵,将其与模板矩阵[-1 -2 -1;0 0 0;1 2 1]和[-1 0 1;-2 0 2;-1 0 1]进行点乘并求和后存入该点。 Canny算子,对原图进行高斯滤波平滑图像,用一阶偏导有限差分计算梯度幅值和方向,对梯度幅值进行非极大值抑制,用双阈值算法检测和连接边缘。 拉普拉斯算子,二阶微分算子,引入模板img2(i,j,k) = img1(i+1,j,k) + img1(i-1,j,k) + img1(i,j+1,k) + img1(i,j-1,k) - 4 * img1(i,j,k)进行计算。
2.伪彩色处理 伪彩色增强:把一幅黑白域图像的不同灰度级映射为一幅彩色图像的技术手段。 空间域灰度级-彩色变换法:可以将灰度图像变为具有多种颜色渐变的连续彩色图像,变换后的图像视觉效果较好,主要色相是将灰度图像f(x,y)送入具有不同变换性质的红、绿、蓝3个变换器,相对应的产生3个不同的输入fR(x,y),fG(x,y),fB(x,y)将它们对应地作为彩色图像的红绿蓝三个色彩分量合成一副彩色图像。 彩虹编码和热金属编码是其中的两种变化函数。
3.图像增强 图像增强的目的:(1)利用一系列技术改善图像的视觉效果,提高图像清晰度。(2)将图像转换为一种更适合人或机器进行分析处理的形式,抑制无用信息,提高图像使用价值。 图像增强从作用域划分为:空间域增强、频率域增强、彩色增强。 其中,空间域增强是直接对图像像素灰度进行操作。包括:点运算和局部运算。 频率域是经过傅里叶变换后对图像频谱进行操作,最后进行逆变换得到结果。 点运算包括:灰度变换、直方图修正法和局部统计法。 1.灰度变换 灰度变换使得图像的动态范围增大,增强对比度,让图像变得更清晰,特征更明显。 其中包括:线性变换、分段线性变换、非线性灰度变换。 (1)线性变换 图像的灰度集中在较亮的区域而导致图像偏亮,这个时候可以对图像的每一个像素灰度作线性拉伸。 原图像f(i,j)的灰度范围为[a,b],线性变换后图像g(i,j)的范围为[a1,b1]
|