数字图像处理实验课
实验02 图像采样与量化
图像采样
image1 = imread('face.jpg');
image2 = image1(1:2:end,1:2:end);%每2位采1位
image3 = image1(1:4:end,1:4:end);%每4位采1位
image4 = image1(1:8:end,1:8:end);%每8位采1位
figure;
%subplot前两个参数代表两行两列
%subplot第三个参数为位置
subplot(2,2,1),imshow(image1),title('刘守元'),xlabel('(a)512x512');
subplot(2,2,2),imshow(image2),title('刘守元'),xlabel('(b)256x256');
subplot(2,2,3),imshow(image3),title('刘守元'),xlabel('(c)128x128');
subplot(2,2,4),imshow(image4),title('刘守元'),xlabel('(d)64x64');
图像量化
image1 = imread('face.jpg');
image2 = histeq(image1,64);%把图片的灰度级改为64
image3 = histeq(image1,32);%把图片的灰度级改为32
image4 = histeq(image1, 8);%把图片的灰度级改为 8
figure;
subplot(2,2,1),imshow(image1),title('刘守元'),xlabel('(a)');
subplot(2,2,2),imshow(image2),title('刘守元'),xlabel('(b) 64级');
subplot(2,2,3),imshow(image3),title('刘守元'),xlabel('(c) 32级');
subplot(2,2,4),imshow(image4),title('刘守元'),xlabel('(d) 8级');
实验03 图像基本运算
线性点运算
image1 = imread('lenagray.jpg');%读取图片
image1 = im2double(image1);%转换数据类型为double
figure(1);subplot(2,2,1);
imshow(image1);title('刘守元','fontsize',7),xlabel('(a1)原图');%显示原图像
a=1.5;b=50;
image2 = a .* image1 + b/255;%增加对比度
figure(1);subplot(2,2,2);
imshow(image2);title('刘守元','fontsize',7),xlabel('(a2)a=1.5,b=50,增加对比度');%显示图像1
a=0.3;b=50;
image3 = a .* image1 + b/255;%降低对比度
figure(1);subplot(2,2,3);
imshow(image3);title('刘守元','fontsize',7),xlabel('(a3)a=0.3,b=50,减小对比度');%显示图像2
a=-1;b=50;
image4 = a .* image1 +b/255;%图像反色
figure(1);subplot(2,2,4);
imshow(mat2gray(image4));title('刘守元','fontsize',7),xlabel('(a4)a=-1,b=50,反色');%显示图像3
缩放
image1 = imread('lenagray.jpg');%读取原始图片
image1 = im2double(image1);%转换数据类型为double
figure(1);subplot(2,3,1);
imshow(image1);title('刘守元','fontsize',7),xlabel('(b1)原图');%显示原图像
image2 = imresize(image1,1.5,'bilinear');%双线性插值法比例放大1.5倍
figure(1);subplot(2,3,2);
imshow(image2);title('刘守元','fontsize',7),xlabel('(b2)放大1.5倍');%显示双线性插值法比例放大1.5倍
image3 = imresize(image1,0.7,'bilinear');%双线性插值法比例缩小0.7倍
figure(1);subplot(2,3,3);
imshow(image3);title('刘守元','fontsize',7),xlabel('(b3)缩小0.7倍');%显示双线性插值法比例缩小0.7倍
image4 = imresize(image1,[600,700],'bilinear');%双线性插值法非比例放大到600x700像素
figure(1);subplot(2,3,4);
imshow(image4);title('刘守元','fontsize',7),xlabel('(b4)缩小0.7倍');%显示双线性插值法非比例放大到600x700像素
image5 = imresize(image1,[300,400],'bilinear');%双线性插值法非比例放大到300x400像素
figure(1);subplot(2,3,5);
imshow(image5);title('刘守元','fontsize',7),xlabel('(b5)放大到300x400像素');%显示双线性插值法非比例放大到300x400像素
旋转
image1 = imread('cameraman.tif');%读取原始图片
image1 = im2double(image1);%转换数据类型为double
figure(1);subplot(2,3,1);
imshow(image1);title('刘守元','fontsize',7),xlabel('(c1)原图');%显示原图像
image2 = imrotate(image1,30,'bilinear');%旋转29度
figure(1);subplot(2,3,2);
imshow(image2);title('刘守元','fontsize',7),xlabel('(c2)旋转30度图像');%显示旋转30度图像
image3 = imrotate(image1,60,'bilinear');%旋转60度
figure(1);subplot(2,3,3);
imshow(image3);title('刘守元','fontsize',7),xlabel('(c3)旋转60度图像');%显示旋转60度图像
image4 = imrotate(image1,90,'bilinear');%旋转90度
figure(1);subplot(2,3,4);
imshow(image4);title('刘守元','fontsize',7),xlabel('(c4)旋转90度图像');%显示旋转90度图像
image5 = imrotate(image1,135,'bilinear');%旋转135度
figure(1);subplot(2,3,5);
imshow(image5);title('刘守元','fontsize',7),xlabel('(c5)旋转135度图像');%显示旋转135度图像
image6 = imrotate(image1,180,'bilinear');%旋转180度
figure(1);subplot(2,3,6);
imshow(image6);title('刘守元','fontsize',7),xlabel('(c6)旋转180度图像');%显示旋转180度图像
实验04 图像变换
对图像lena、cameraman和face进行傅里叶变换,观察图像能量在频谱图中的分布情况。
%读取图片
image1=imread('lena.jpg'); image1=im2double(image1);
image2=imread('cameraman.tif'); image2=im2double(image2);
image3=imread('face.jpg'); image3=im2double(image3);
%傅里叶变换
image1f=fft2(image1);
image2f=fft2(image2);
image3f=fft2(image3);
%观察图像能量在频谱分布情况
image1f1=abs(image1f); image1f2=fftshift(image1f1);
image2f1=abs(image2f); image2f2=fftshift(image2f1);
image3f1=abs(image3f); image3f2=fftshift(image3f1);
%显示原图
figure(1);subplot(3,3,1);imshow(image1);title('实验人:刘守元'),xlabel('(a1)原图');
figure(1);subplot(3,3,2);imshow(image2);title('实验人:刘守元'),xlabel('(a2)原图');
figure(1);subplot(3,3,3);imshow(image3);title('实验人:刘守元'),xlabel('(a3)原图');
%显示快速傅里叶变换的图
figure(1);subplot(3,3,4);imshow(image1f,[5,30]);title('实验人:刘守元'),xlabel('(a1)频谱图');
figure(1);subplot(3,3,5);imshow(image2f,[5,30]);title('实验人:刘守元'),xlabel('(a2)频谱图');
figure(1);subplot(3,3,6);imshow(image3f,[5,30]);title('实验人:刘守元'),xlabel('(a3)频谱图');
%显示傅里叶变换频谱中间频率为零的图
figure(1);subplot(3,3,7);imshow(image1f2,[5,30]);title('实验人:刘守元'),xlabel('(a1)中心移到零点的频谱图');
figure(1);subplot(3,3,8);imshow(image2f2,[5,30]);title('实验人:刘守元'),xlabel('(a2)中心移到零点的频谱图');
figure(1);subplot(3,3,9);imshow(image3f2,[5,30]);title('实验人:刘守元'),xlabel('(a3)中心移到零点的频谱图');
利用Matlab生成下列图像,并对其进行旋转30度、90度和120度,然后对他们分别进行傅里叶变换。
%生成图片
image1=zeros(256,256); image1(28:228, 108:148)=1;
image2=zeros(256,256); image2(48:208, 48:208)=1;
%旋转图片
image1_1=imrotate(image1,30,'bilinear');
image1_2=imrotate(image1,90,'bilinear');
image1_3=imrotate(image1,120,'bilinear');
image2_1=imrotate(image2,30,'bilinear');
image2_2=imrotate(image2,90,'bilinear');
image2_3=imrotate(image2,120,'bilinear');
%傅里叶变换
image1f=fft2(image1);F=abs(image1f);image1f=fftshift(F);
image1f1=fft2(image1_1);F=abs(image1f1);image1f1=fftshift(F);
image1f2=fft2(image1_2);F=abs(image1f2);image1f2=fftshift(F);
image1f3=fft2(image1_3);F=abs(image1f3);image1f3=fftshift(F);
image2f=fft2(image2);F=abs(image2f);image2f=fftshift(F);
image2f1=fft2(image2_1);F=abs(image2f1);image2f1=fftshift(F);
image2f2=fft2(image2_2);F=abs(image2f2);image2f2=fftshift(F);
image2f3=fft2(image2_3);F=abs(image2f3);image2f3=fftshift(F);
%显示图像
figure(1);subplot(4,4,1);imshow(image1);title('实验人:刘守元'),xlabel('(b1)原图');
figure(1);subplot(4,4,2);imshow(image1_1);title('实验人:刘守元'),xlabel('(b2)原图 旋转30度');
figure(1);subplot(4,4,3);imshow(image1_2);title('实验人:刘守元'),xlabel('(b3)原图 旋转90度');
figure(1);subplot(4,4,4);imshow(image1_3);title('实验人:刘守元'),xlabel('(b4)原图 旋转120度');
figure(1);subplot(4,4,5);imshow(image1f,[5,50]);title('实验人:刘守元'),xlabel('(b1)傅里叶频谱图');
figure(1);subplot(4,4,6);imshow(image1f1,[5,50]);title('实验人:刘守元'),xlabel('(b2)傅里叶频谱图 旋转30度');
figure(1);subplot(4,4,7);imshow(image1f2,[5,50]);title('实验人:刘守元'),xlabel('(b3)傅里叶频谱图 旋转90度');
figure(1);subplot(4,4,8);imshow(image1f3,[5,50]);title('实验人:刘守元'),xlabel('(b4)傅里叶频谱图 旋转120度');
figure(1);subplot(4,4,9);imshow(image2);title('实验人:刘守元'),xlabel('(b1)原图');
figure(1);subplot(4,4,10);imshow(image2_1);title('实验人:刘守元'),xlabel('(b2)原图 旋转30度');
figure(1);subplot(4,4,11);imshow(image2_2);title('实验人:刘守元'),xlabel('(b3)原图 旋转90度');
figure(1);subplot(4,4,12);imshow(image2_3);title('实验人:刘守元'),xlabel('(b4)原图 旋转120度');
figure(1);subplot(4,4,13);imshow(image2f,[5,50]);title('实验人:刘守元'),xlabel('(b1)傅里叶频谱图');
figure(1);subplot(4,4,14);imshow(image2f1,[5,50]);title('实验人:刘守元'),xlabel('(b2)傅里叶频谱图 旋转30度');
figure(1);subplot(4,4,15);imshow(image2f2,[5,50]);title('实验人:刘守元'),xlabel('(b3)傅里叶频谱图 旋转90度');
figure(1);subplot(4,4,16);imshow(image2f3,[5,50]);title('实验人:刘守元'),xlabel('(b4)傅里叶频谱图 旋转120度');
对图像lena、cameraman和face用DCT变换进行图像压缩,舍掉的变换系数分别小于0.01、0.03、0.05,求经压缩、解压后的图像。
%读取图片
image1=imread('lena.jpg'); image1=im2double(image1);
%image2=imread('cameraman.tif'); image2=im2double(image2);
%image3=imread('face.jpg'); image3=im2double(image3);
%预处理图片
[M,N]=size(image1);%M=512,N=512
image1=im2double(image1);
%生成标准DCT变化中的矩阵(8x8)
n=8;[cc,rr]=meshgrid(0:n-1);
C=sqrt(2/n)*cos(pi*(2*cc+1).*rr/(2*n));
C(1,:)=C(1,:)/sqrt(2);
%光亮度量化表
a=[16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99 ];
%分块做DCT变换(8x8) DCT变换公式 正变换Y=CIC' 0.03
for i=1:8:M
for j=1:8:N
P=image1(i:i+7,j:j+7);
K=C*P*C';
image1_1(i:i+7,j:j+7)=K;
K=K./a; %量化(按位除)
K(abs(K)<0.03)=0;
%K(abs(K)<0.01)=0;
%K(abs(K)<0.05)=0;
image1_2(i:i+7,j:j+7)=K;
end
end
%分块做DCT反变换(8x8),逆变换 P=C'YC
for i=1:8:M
for j=1:8:N
P=image1_2(i:i+7,j:j+7).*a;%反量化
K=C'*P*C;
image1_3(i:i+7,j:j+7)=K;
end
end
%分块做DCT变换(8x8) DCT变换公式 正变换Y=CIC' 0.01
for i=1:8:M
for j=1:8:N
P=image1(i:i+7,j:j+7);
K=C*P*C';
image1_4(i:i+7,j:j+7)=K;
K=K./a; %量化(按位除)
%K(abs(K)<0.03)=0;
K(abs(K)<0.01)=0;
%K(abs(K)<0.05)=0;
image1_5(i:i+7,j:j+7)=K;
end
end
%分块做DCT反变换(8x8),逆变换 P=C'YC
for i=1:8:M
for j=1:8:N
P=image1_5(i:i+7,j:j+7).*a;%反量化
K=C'*P*C;
image1_6(i:i+7,j:j+7)=K;
end
end
%分块做DCT变换(8x8) DCT变换公式 正变换Y=CIC' 0.05
for i=1:8:M
for j=1:8:N
P=image1(i:i+7,j:j+7);
K=C*P*C';
image1_7(i:i+7,j:j+7)=K;
K=K./a; %量化(按位除)
%K(abs(K)<0.03)=0;
%K(abs(K)<0.01)=0;
K(abs(K)<0.05)=0;
image1_8(i:i+7,j:j+7)=K;
end
end
%分块做DCT反变换(8x8),逆变换 P=C'YC
for i=1:8:M
for j=1:8:N
P=image1_8(i:i+7,j:j+7).*a;%反量化
K=C'*P*C;
image1_9(i:i+7,j:j+7)=K;
end
end
subplot(3,4,1);imshow(image1);title('实验人:刘守元'),xlabel('(c1)原图 变换系数0.03');
subplot(3,4,2);imshow(image1_1);title('实验人:刘守元'),xlabel('(c2)DCT变换后的频域图像 ');
subplot(3,4,3);imshow(image1_2);title('实验人:刘守元'),xlabel('(c3)量化后的频域图像 ');
subplot(3,4,4);imshow(image1_3);title('实验人:刘守元'),xlabel('(c4) 复原图像 ');
subplot(3,4,5);imshow(image1);title('实验人:刘守元'),xlabel('(c1)原图 变换系数0.01');
subplot(3,4,6);imshow(image1_4);title('实验人:刘守元'),xlabel('(c2)DCT变换后的频域图像 ');
subplot(3,4,7);imshow(image1_5);title('实验人:刘守元'),xlabel('(c3)量化后的频域图像 ');
subplot(3,4,8);imshow(image1_6);title('实验人:刘守元'),xlabel('(c4) 复原图像 ');
subplot(3,4,9);imshow(image1);title('实验人:刘守元'),xlabel('(c1)原图 变换系数0.05');
subplot(3,4,10);imshow(image1_7);title('实验人:刘守元'),xlabel('(c2)DCT变换后的频域图像 ');
subplot(3,4,11);imshow(image1_8);title('实验人:刘守元'),xlabel('(c3)量化后的频域图像 ');
subplot(3,4,12);imshow(image1_9);title('实验人:刘守元'),xlabel('(c4) 复原图像 ');
有时候在matlab中使用比较大的矩阵需要预先分配空间,不然会报错,这一点在一些实验中有体现。
实验05 图像增强
对曝光不足的图像采用灰度线性变换对图像每一个像素灰度做线性拉伸。
image=imread('figure51.jpg');
image=im2double(image);
a=1.5;b=-150;
image1=a .* image + b/255;
figure(1);
subplot(1,2,1);imshow(image);title('实验人:刘守元'),xlabel('(a1)原图');
figure(1);
subplot(1,2,2);imshow(image1);title('实验人:刘守元'),xlabel('(a2)灰度线性变换')
利用空间域平滑滤波器对图像进行平滑。
image1=imread('lena.jpg');
image1_noise=double(imnoise(image1, 'gaussian', 0.05));
image1_smoothed1=imfilter(image1_noise, fspecial('average', 3));
image1_smoothed2=imfilter(image1_noise, fspecial('average', 5));
image1_smoothed3=imfilter(image1_noise, fspecial('average', 7));
figure(1);subplot(2,3,1);imshow(image1);title('实验人:刘守元'),xlabel('(b1)原图');
figure(1);subplot(2,3,2);imshow(image1_noise, []);title('实验人:刘守元'),xlabel('(b2)加入噪声的图像');
figure(1);subplot(2,3,3);imshow(image1_smoothed1, []);title('实验人:刘守元'),xlabel('(b3)3x3 邻域平滑的图像');
figure(1);subplot(2,3,4);imshow(image1_smoothed2, []);title('实验人:刘守元'),xlabel('(b4)5x5 邻域平滑的图像');
figure(1);subplot(2,3,5);imshow(image1_smoothed3, []);title('实验人:刘守元'),xlabel('(b5)7x7 邻域平滑的图像');
利用Prewitt、Sobel对图像进行锐化。
image=imread('lena.jpg');
image_sharpening1=imfilter(image,fspecial('Prewitt'));
image_sharpening2=imfilter(image,fspecial('Sobel'));
figure(1);subplot(2,2,1);imshow(image);title('实验人:刘守元'),xlabel('(c1)原图');
figure(1);subplot(2,2,2);imshow(image_sharpening1,[]);title('实验人:刘守元'),xlabel('(c2)Prewitt锐化的图像');
figure(1);subplot(2,2,3);imshow(image_sharpening2,[]);title('实验人:刘守元'),xlabel('(c3)Sobel锐化的图像');
利用高斯低通滤波对图像进行平滑。
image=imread('lena.jpg');
figure(1);subplot(2,2,1);imshow(image);title('实验人:刘守元'),xlabel('(d1)原图');
image1=fftshift(fft2(image));
[M,N]=size(image1);
n=2;sig=10;%sig2=100
n1=floor(M/2);n2=floor(N/2);
image2=zeros(512,512);%预分配内存
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
H=exp(-((d^2/(2*sig^2))));%e的指数函数
image2(i,j)=H*image1(i,j);
end
end
image2=ifftshift(image2);
image3=real(ifft2(image2));
figure(1);subplot(2,2,2);imshow(image3,[]);title('实验人:刘守元'),xlabel('(d2)高斯低通滤波器 sig^2=100');
sig=20;%sig2=400
n1=floor(M/2);n2=floor(N/2);
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
H=exp(-((d^2/(2*sig^2))));%e的指数函数
image2(i,j)=H*image1(i,j);
end
end
image2=ifftshift(image2);
image3=real(ifft2(image2));
figure(1);subplot(2,2,3);imshow(image3,[]);title('实验人:刘守元'),xlabel('(d3)高斯低通滤波器 sig^2=400');
sig=40;%sig2=1600
n1=floor(M/2);n2=floor(N/2);
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
H=exp(-((d^2/(2*sig^2))));%e的指数函数
image2(i,j)=H*image1(i,j);
end
end
image2=ifftshift(image2);
image3=real(ifft2(image2));
figure(1);subplot(2,2,4);imshow(image3,[]);title('实验人:刘守元'),xlabel('(d4)高斯低通滤波器 sig^2=1600');
实验06 图像复原
基于均值滤波器的图像复原。
image=imread('cameraman.tif');%原图片
figure(1);subplot(2,3,1);imshow(image);title('实验人:刘守元'),xlabel('(a1)原图');
image_noise=double(imnoise(image,'gaussian',0.06));%添加高斯噪声
figure(1);subplot(2,3,2);imshow(image_noise,[]);title('实验人:刘守元'),xlabel('(a2)高斯噪声污染的图片');
image_calculate=imfilter(image_noise,fspecial('average',3));%算术均值滤波器
figure(1);subplot(2,3,3);imshow(image_calculate,[]);title('实验人:刘守元'),xlabel('(a3)3x3算术均值滤波器滤波');
image_geometry=exp(imfilter(log(image_noise),fspecial('average',3)));%几何均值滤波器
figure(1);subplot(2,3,4);imshow(image_geometry,[]);title('实验人:刘守元'),xlabel('(a4)3x3几何均值滤波器滤波');
Q=-1.5;
image_inverse1=imfilter(image_noise.^(Q+1),fspecial('average',3))./imfilter(image_noise.^Q,fspecial('average',3));%逆谐波滤波器滤波
figure(1);subplot(2,3,5);imshow(image_inverse1,[]);title('实验人:刘守元'),xlabel('(a5)Q=-1.5的逆谐波滤波器滤波');
Q=1.5;
image_inverse2=imfilter(image_noise.^(Q+1),fspecial('average',3))./imfilter(image_noise.^Q,fspecial('average',3));%逆谐波滤波器滤波
figure(1);subplot(2,3,6);imshow(image_inverse2,[]);title('实验人:刘守元'),xlabel('(a6)Q=1.5的逆谐波滤波器滤波');
基于顺序统计滤波器的图像复原。
image=imread('cameraman.tif');%图像读取
figure(1);subplot(2,2,1);imshow(image);title('实验人:刘守元'),xlabel('(b1)原图');
image_noise=double(imnoise(image,'salt & pepper',0.06));%椒盐噪声污染
figure(1);subplot(2,2,2);imshow(image_noise,[]);title('实验人:刘守元'),xlabel('(b3)椒盐噪声污染的图像');
image_calculate=imfilter(image_noise,fspecial('average',5));%算术均值滤波器
figure(1);subplot(2,2,3);imshow(image_calculate,[]);title('实验人:刘守元'),xlabel('(b3)算术均值滤波器滤波');
image_middle=medfilt2(image_noise);%中值滤波器滤波
figure(1);subplot(2,2,4);imshow(image_middle,[]);title('实验人:刘守元'),xlabel('(b4)中值滤波器滤波');
基于带阻滤波器的图像复原。
image=imread('lenazhouqizaosheng.jpg');%读取图片
[M,N]=size(image);%得到图像的高度和宽度数据
figure(1);subplot(2,2,1);imshow(image);title('实验人:刘守元'),xlabel('(c1)带周期噪声的图像');
image_f=fftshift(fft2(image));%对带周期噪声的图像做傅里叶变换,并将原点移至图像中心
image_f_v=log(1+abs(image_f));%含噪声的图像的频谱
figure(1);subplot(2,2,2);imshow(image_f_v,[]);title('实验人:刘守元'),xlabel('(c2)含噪声的图像的频谱');
freq=90;%带阻滤波器中心频率
width=5;%带阻滤波器频带宽度
ff=ones(M,N);
for i=1:M
for j=1:N
ff(i,j)=1-exp(-0.5*((((i-M/2)^2+(j-N/2)^2)-freq^2)/(sqrt(i.^2+j.^2)*width))^2);%高斯带阻滤波器
end
end
figure(1);subplot(2,2,3);imshow(ff,[]);title('实验人:刘守元'),xlabel('(c3)高斯带阻滤波器');
image_out=image_f.*ff;%矩阵点乘实现频域滤波
image_out=ifftshift(image_out);%原点移回左上角
image_out=ifft2(image_out);%傅里叶变换
image_out=abs(image_out);%取绝对值
image_out=image_out/max(image_out(:));%除以image_out中像素点最大值->归一化
figure(1);subplot(2,2,4);imshow(image_out,[]);title('实验人:刘守元'),xlabel('(c4)基于带阻滤波器的图像复原效果图');
实验07 图像压缩编码
基于游程编码的图像压缩。
%主程序
image=imread('lena.jpg');%读取图片
if ndims(image)>2 %对非单通道图像转换为灰度图像
image=rgb2gray(image);
end
BW=im2bw(image,0.2);%对图像二值化,二值化阈值为0.2
[zipped,info]=RLEencode(BW);%调用RLEcode函数对zipped进行游程编码
unzipped=RLEdecode(zipped,info);%调用RLEencode函数对zipped进行游程编码
figure(1);subplot(3,3,1);imshow(image);title('实验人:刘守元'),xlabel('(a1)原图');%显示原图像
figure(1);subplot(3,3,2);imshow(BW);title('实验人:刘守元'),xlabel('(a2)二值化阈值为0.2,二值化后的图像');
figure(1);subplot(3,3,3);imshow(uint8(unzipped)*255);title('实验人:刘守元'),xlabel('(a3)经游程编码和解码后的图像');%显示二值化图像经游程编码解码后的图像
cr=info.ratio %显示压缩比
whos BW unzipped zipped %显示二值图像,压缩解压图像,压缩图像的信息
BW=im2bw(image,0.4);%对图像二值化,二值化阈值为0.4
[zipped,info]=RLEencode(BW);%调用RLEcode函数对zipped进行游程编码
unzipped=RLEdecode(zipped,info);%调用RLEencode函数对zipped进行游程编码
figure(1);subplot(3,3,4);imshow(image);title('实验人:刘守元'),xlabel('(a4)原图');%显示原图像
figure(1);subplot(3,3,5);imshow(BW);title('实验人:刘守元'),xlabel('(a5)二值化阈值为0.4,二值化后的图像');
figure(1);subplot(3,3,6);imshow(uint8(unzipped)*255);title('实验人:刘守元'),xlabel('(a6)经游程编码和解码后的图像');%显示二值化图像经游程编码解码后的图像
cr=info.ratio %显示压缩比
whos BW unzipped zipped %显示二值图像,压缩解压图像,压缩图像的信息
BW=im2bw(image,0.6);%对图像二值化,二值化阈值为0.6
[zipped,info]=RLEencode(BW);%调用RLEcode函数对zipped进行游程编码
unzipped=RLEdecode(zipped,info);%调用RLEencode函数对zipped进行游程编码
figure(1);subplot(3,3,7);imshow(image);title('实验人:刘守元'),xlabel('(a7)原图');%显示原图像
figure(1);subplot(3,3,8);imshow(BW);title('实验人:刘守元'),xlabel('(a8)二值化阈值为0.6,二值化后的图像');
figure(1);subplot(3,3,9);imshow(uint8(unzipped)*255);title('实验人:刘守元'),xlabel('(a9)经游程编码和解码后的图像');%显示二值化图像经游程编码解码后的图像
cr=info.ratio %显示压缩比
whos BW unzipped zipped %显示二值图像,压缩解压图像,压缩图像的信息
%游程编码函数
function [zipped,info]=RLEencode(vector)
[m,n]=size(vector);%获取图像的高度和宽度
vector=uint8(vector(:));%转换成整型
L=length(vector); %得到元素个数
c=vector(1);%获取第一个像素值
e(1,1)=double(c);%游程矩阵第一列为值
e(1,2)=0;%游程矩阵第二列为游程长度
t1=1;%游程矩阵下标变量
for j=1:L %对图像所有元素循环处理
if(vector(j)==c) %如果值不变
e(t1,2)=(e(t1,2))+1; %将游程长度加1
else
c=vector(j); %记录新的值
t1=t1+1; %游程矩阵行下标变量加1
e(t1,1)=c; %游程矩阵新1行第1列的值
e(t1,2)=1; %游程矩阵新1行第2列的值(游程长度)
end
end
zipped=e; %游程矩阵
info.rows=m;info.cols=n; %记录原图像的宽度和高度
[m,n]=size(e); %获取游程矩阵的高度和宽度
info.ratio=(info.rows*info.cols)/(m*n); %显示压缩比
end
%游程编码的解码函数程序
function unzipped=RLEdecode(zip,info)
%zip=uint8(zip); %将游程矩阵转换成整型
[m,n]=size(zip); %获取游程矩阵的高度和宽度
unzipped=[]; %解压矩阵初始化
for i=1:m %对游程矩阵的每一行都进行循环处理
section=repmat(uint8(zip(i,1)),1,zip(i,2)); %第i行复制还原
unzipped=[unzipped section]; %与矩阵前面的部分进行拼接
end
%按原图像形式重新安排矩阵
unzipped=reshape(unzipped,info.rows,info.cols);
end
注意reshape函数可能会遇到参数不对应的问题,这种报错可能是代码中一些变量的定义写错了。
基于离散余弦变换的图像压缩。
image=imread('lena.jpg');%读取图片
image=im2double(image);
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(image,[8 8], 'P1*x*P2',T,T');%对原图像分块进行DCT变换
mask1 = [1 1 1 1 1 0 0 0;1 1 1 1 0 0 0 0;
1 1 1 0 0 0 0 0;1 1 0 0 0 0 0 0;
1 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];%设置模板矩阵mask1
B2=blkproc(B,[8 8],'P1.*x',mask1);%数据压缩,丢弃右下角高频数据
image2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像
e=sqrt(mse(abs(image2-image)));%计算压缩编码图像之间的均方误差
figure(1);subplot(2,2,1);imshow(image);title('实验人:刘守元'),xlabel('(b1)原图');%显示原图像
figure(1);subplot(2,2,2);imshow(image);title('实验人:刘守元'),xlabel('(b2)用mask1矩阵压缩后的图像');
mask2 = [1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;
1 1 0 0 0 0 0 0;1 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];%设置模板矩阵mask2
B2=blkproc(B,[8 8],'P1.*x',mask2);%数据压缩,丢弃右下角高频数据
image2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像
e=sqrt(mse(abs(image2-image))) %计算压缩编码图像之间的均方误差
figure(1);subplot(2,2,3);imshow(image);title('实验人:刘守元'),xlabel('(b3)用mask2矩阵压缩后的图像');
mask3 = [1 1 1 0 0 0 0 0;1 1 0 0 0 0 0 0;
1 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];%设置模板矩阵mask3
B2=blkproc(B,[8 8],'P1.*x',mask3);%数据压缩,丢弃右下角高频数据
image2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像
e=sqrt(mse(abs(image2-image))) %计算压缩编码图像之间的均方误差
figure(1);subplot(2,2,4);imshow(image);title('实验人:刘守元'),xlabel('(b4)用mask3矩阵压缩后的图像');
实验08 图像分割
采用sobel、prewitt、roberts和log对图像及其加上噪声后的图像进行边缘检测。
image=imread('chair.jpg');%读取图像
bw1=edge(image, 'sobel');
bw2=edge(image, 'prewitt');
bw3=edge(image, 'roberts');
bw4=edge(image, 'log',[],4);
figure(1);subplot(2,5,1);imshow(image);title('实验人:刘守元'),xlabel('(a1)原图');%显示原图像
figure(1);subplot(2,5,2);imshow(bw1);title('实验人:刘守元'),xlabel('(a2)sobel算子');
figure(1);subplot(2,5,3);imshow(bw2);title('实验人:刘守元'),xlabel('(a3)prewitt算子');
figure(1);subplot(2,5,4);imshow(bw3);title('实验人:刘守元'),xlabel('(a4)roberts算子');
figure(1);subplot(2,5,5);imshow(bw4);title('实验人:刘守元'),xlabel('(a5)log算子');
image=imnoise(image, 'gaussian', 0.05);
bw1=edge(image, 'sobel');
bw2=edge(image, 'prewitt');
bw3=edge(image, 'roberts');
bw4=edge(image, 'log',[],4);
figure(1);subplot(2,5,6);imshow(image);title('实验人:刘守元'),xlabel('(a6)加上噪声后图像');%显示加上噪声后的图像
figure(1);subplot(2,5,7);imshow(bw1);title('实验人:刘守元'),xlabel('(a7)sobel算子');
figure(1);subplot(2,5,8);imshow(bw2);title('实验人:刘守元'),xlabel('(a8)prewitt算子');
figure(1);subplot(2,5,9);imshow(bw3);title('实验人:刘守元'),xlabel('(a9)roberts算子');
figure(1);subplot(2,5,10);imshow(bw4);title('实验人:刘守元'),xlabel('(a10)log算子');
采用迭代式阈值选择法和最大类间方差阈值选择法进行图像分割。
image=imread('cell.jpg');
image=im2double(image);
[m,n]=size(image);
figure(1);subplot(1,3,1);imshow(image);title('实验人:刘守元'),xlabel('(b1)原图');%显示原图像
level=graythresh(image);
bw=im2bw(image,level);
figure(1);subplot(1,3,2);imshow(bw);title('实验人:刘守元'),xlabel('(b2)最大类方差阈值选择法');
image=double(image);
t=(min(image(:))+max(image(:)))/2;
done=false;
i=0;
while ~done
r1=find(image<=t);
r2=find(image>t);
tnew=(mean(image(r1))+mean(image(r2)))/2;
done=abs(tnew-t)<1;
t=tnew;
i=i+1;
end
image(r1)=0;
image(r2)=1;
figure(1);subplot(1,3,3);imshow(image);title('实验人:刘守元'),xlabel('(b3)迭代法');
实验09 彩色图像处理
利用边界盒分割方法对彩色图像进行分割。
image=imread('honghua.jpg');%读取原图像
figure(1);subplot(2,2,1);imshow(image);title('实验人:刘守元'),xlabel('(a1)原图');%显示原图像
image1=im2double(image);
r=image1(:,:,1);%图像的红色分量
g=image1(:,:,2);%图像的绿色分量
b=image1(:,:,3);%图像的蓝色分量
r1=r(130:195,86:170);%在红分量中选择一块矩形区域,由输入可知size(r)=(195 ,218),改变选择的行列可以改变标准偏差的标准值
r1_u=mean(mean(r1(:)));%计算该矩形区域的均值
[m,n]=size(r1);%得到该矩形区域的高度和宽度
sd1=0.0;%该区域标准偏差变量
for i=1:m
for j=1:n
sd1=sd1+(r1(i,j)-r1_u)*(r1(i,j)-r1_u);%二重循环对差值的平均进行累加
end
end
r1_d=sqrt(sd1/(m*n));%计算得到该区域的标准偏差
r2=zeros(size(image1,1),size(image1,2));
ind=find((r>r1_u-1.10*r1_d)&(r<r1_u+1.10*r1_d));%找到符合条件的点
I1=r2;
I1(ind)=1;%将符合条件的点的灰度值赋值为1
figure(1);subplot(2,2,2);imshow(I1);title('实验人:刘守元'),xlabel('(a2)标准差为1.10');
ind=find((r>r1_u-1.20*r1_d)&(r<r1_u+1.20*r1_d));
I2=r2;
I2(ind)=1;
figure(1);subplot(2,2,3);imshow(I2);title('实验人:刘守元'),xlabel('(a3)标准差为1.20');
ind=find((r>r1_u-1.30*r1_d)&(r<r1_u+1.30*r1_d));
I3=r2;
I3(ind)=1;
figure(1);subplot(2,2,4);imshow(I3);title('实验人:刘守元'),xlabel('(a4)标准差为1.30');
实验10 图像表示与描述
percent=[];%正确率数组
for n=1:10
train=[];
test=[];
index=0;%测试集下标
for i=1:8
P=randperm(8);%随机序列
for j=1:4
train{i,j}=strcat(int2str(i),int2str(P(j)),'.jpg');%随机训练集
end
for j=5:8
index=index+1;
test{index}=strcat(int2str(i),int2str(P(j)),'.jpg');%随机测试集
end
end
[M,N]=size(train);%训练集大小
X=[];
for i=1:M
for j=1:N
name=char(train(i,j));
img_train=imread(name);%读取训练集图片
glcm=graycomatrix(img_train, 'Offset', [-1 -1], 'NumLevels', 4);%计算灰度共生矩阵,135度方向,d=1,量化级数4
stats=graycoprops(glcm, 'all');%计算对比度、相关、能量、均匀度
out=entropy(img_train);%计算出整幅图的熵
X(i,j,:)=[stats.Contrast,stats.Correlation,stats.Energy,stats.Homogeneity,out];%训练集特征向量
end
end
truenum=0;
for i=1:index
x=[];
name=char(test(i));
img_train=imread(name);%读取训练集图片
glcm=graycomatrix(img_train, 'Offset', [-1 -1], 'NumLevels', 4);%计算灰度共生矩阵,135度方向,d=1,量化级数4
stats=graycoprops(glcm, 'all');%计算对比度、相关、能量、均匀度
out=entropy(img_train);%计算出整幅图的熵
x=[stats.Contrast,stats.Correlation,stats.Energy,stats.Homogeneity,out];%测试集特征向量
gix=[];
for j=1:M
odist=[];%第j类的欧氏距离数组
for k=1:N
a=X(j,k,:);
a=a(:)';%训练集特征向量
odist(k)=norm(a-x);%求欧氏距离
end
gix(j)=min(odist);%第j类中最小欧氏距离
end
[gjx,mindex]=min(gix);%最小欧式距离及其类别
fprintf('%s属于第%d类 ',name,mindex);
if mod(i,4)==0
fprintf('\n');%每四个换一次行
end
num=str2num(name(1));%正确的类别
if num==mindex
truenum=truenum+1;%求分类正确的数量
end
end
percent(n)=truenum/32;%求分类正确的数量
fprintf('正确率为:%f\n',percent(n));
end
fprintf('10次平均正确率为:%f\n',mean(percent));%求平均分类正确率
训练集图片的路径放到与代码文件相同路径下,或者直接用addpath函数把训练集图片的路径添加到程序中。
另外这里控制台输出用了fprintf,实际上matlab的输出只需要去掉代码行末尾的分号;就会在控制台输出了。