数字图像处理 matlab实现

文章目录

  • 1.MATLAB 相关问题
    • MATLAB:运行出现 “ 未定义函数或变量 ”
  • 2.图像的采样和量化
  • 3.图像的基本运算
    • 线性点运算
    • 图像的缩放
    • 图像的旋转
  • 4.图像变换
    • 傅里叶变换
    • 旋转傅里叶变换
    • 离散余弦变换
  • 5.图像增强
    • 1.灰度线性变换
    • 2.空间域平滑滤波器
    • 3.空间域锐化滤波器
    • 4.频域率平滑滤波器(高斯低通滤波器)
  • 6.图像复原
    • 1.基于均值滤波器的图像复原
    • 2.基于顺序统计滤波器的图像复原
    • 3.基于带阻滤波器的图像复原
  • 7. 图像的压缩编码
    • 1.游程编码
    • 2.基于离散余弦变换的图像压缩
  • 8.图像分割
    • 边缘检测
    • 图像分割
  • 9.彩色图像分割
  • 10.图像 的表示和描述

1.MATLAB 相关问题

MATLAB:运行出现 “ 未定义函数或变量 ”

先检查是不是拼写错误,详细可以看
MATLAB:运行出现 “ 未定义函数或变量 ”

2.图像的采样和量化

数字图像处理 matlab实现_第1张图片
emmm看见b站一个像素头像制作的视频,评论有说用马赛克,才意识到马赛克就是图像采样,那就可以用matlab做,但是我发现上面的这代码处理不了彩色的,会变成三个黑白的被采样的图像。具体为啥以后有兴趣再看吧。

clc 
clear all
close all
addpath C:\Users\可乐猫\Desktop\1.jpg
I=imread('1.jpg');

[row,line,z]=size(I);
J=I(1:10:row,1:10:line,:);%隔行采样,隔列采样
imwrite(J,'result.jpg'); %保存图像
figure,imshow(J);

数字图像处理 matlab实现_第2张图片
在这里插入图片描述
数字图像处理 matlab实现_第3张图片

3.图像的基本运算

线性点运算

clc
close all
clear all
addpath E:\study\数字图像处理\实验\1\ lenagray.jpg
I=imread('lenagray.jpg'); %读取图片
I=im2double(I);           %转换数据类型为double

figure(1);subplot(2,2,1);
imshow(I);title('实验人:李诗雨','fontsize',7),xlabel('(a1) 原图'); %显示原图像

figure(1);subplot(2,2,2);
a = 1.5;b = 50;             %增加对比度
o = a .* I + b/255;
imshow(o);title('实验人:李诗雨','fontsize',7),xlabel('(a2) a=1.5,b=50,增加对比度'); %显示图像1

figure(1);subplot(2,2,3);
a = 0.3;b = 50;
o = a .* I +b/255;
imshow(o);title('实验人:李诗雨','fontsize',7),xlabel('(a3) a=0.3,b=50,减小对比度'); %显示图像2

figure(1);subplot(2,2,4);
a = -1;b = 50;
o = a .* I +b/255;
imshow(mat2gray(o));title('实验人:李诗雨','fontsize',7),xlabel('(a4) a=-1,b=50,反色'); %显示图像3

数字图像处理 matlab实现_第4张图片

图像的缩放

clc
close all
clear all
addpath E:\study\数字图像处理\实验\1\ lenagray.jpg
I=imread('lenagray.jpg'); %读取图片
I=im2double(I);           %转换数据类型为double
%对图像比例放大1.5倍,比例缩小0.7倍,非比例放大到600x700像素,非比例缩小到300x400像素。
figure(1);subplot(2,3,1);
imshow(I);title('实验人:李诗雨','fontsize',7),xlabel('(b1) 原图'); %显示原图像

J1=imresize(I,1.5,'bilinear');
figure(1);subplot(2,3,2);
imshow(J1);title('实验人:李诗雨','fontsize',7),xlabel('(b2) 比例放大1.5倍'); %显示原图像

J2=imresize(I,0.7,'bilinear');
figure(1);subplot(2,3,3);
imshow(J2);title('实验人:李诗雨','fontsize',7),xlabel('(b3) 比例缩小0.7倍'); %显示原图像

J3=imresize(I,[600,700],'bilinear');
figure(1);subplot(2,3,4);
imshow(J3);title('实验人:李诗雨','fontsize',7),xlabel('(b4) 非比例放大到600x700像素 '); %显示原图像

J4=imresize(I,[300,400],'bilinear');
figure(1);subplot(2,3,5);
imshow(J4);title('实验人:李诗雨','fontsize',7),xlabel('(b5) 非比例缩小到300x400像素'); %显示原图像

数字图像处理 matlab实现_第5张图片

图像的旋转

clc
close all
clear all
addpath E:\study\数字图像处理\实验\1\ cameraman.tif
I=imread('cameraman.tif'); %读取图片
I=im2double(I);           %转换数据类型为double
%对图像旋转30度、60度、90度、135度和180度。
figure(1);subplot(2,3,1);
imshow(I);title('实验人:李诗雨','fontsize',7),xlabel('(c1) 原图'); %显示原图像

J1=imrotate(I,30,'bilinear');
figure(1);subplot(2,3,2);
imshow(J1);title('实验人:李诗雨','fontsize',7),xlabel('(c2) 旋转 30度'); 

J2=imrotate(I,60,'bilinear');
figure(1);subplot(2,3,3);
imshow(J2);title('实验人:李诗雨','fontsize',7),xlabel('(c2) 旋转 60度'); 

J3=imrotate(I,90,'bilinear');
figure(1);subplot(2,3,4);
imshow(J3);title('实验人:李诗雨','fontsize',7),xlabel('(c2) 旋转 90度'); 

J4=imrotate(I,135,'bilinear');
figure(1);subplot(2,3,5);
imshow(J4);title('实验人:李诗雨','fontsize',7),xlabel('(c2) 旋转 135度'); 

J5=imrotate(I,180,'bilinear');
figure(1);subplot(2,3,6);
imshow(J5);title('实验人:李诗雨','fontsize',7),xlabel('(c2) 旋转 180度'); 

数字图像处理 matlab实现_第6张图片

4.图像变换

傅里叶变换

  • I=im2double(I);
  • imshow(I3,[5,50])
close all
clear all
addpath E:\study\数字图像处理\实验\4\ face.jpg
addpath E:\study\数字图像处理\实验\4\ cameraman.tif
addpath E:\study\数字图像处理\实验\4\ lena.jpg
I =imread('face.jpg');I=im2double(I); 
J =imread('cameraman.tif');J=im2double(J); 
K =imread('lena.jpg');K=im2double(K); 

%求傅里叶变换
If = fft2(I);Jf = fft2(J); Kf = fft2(K);
If1 =abs(If);Jf1 = abs(Jf); Kf1 = abs(Kf);
If2 = fftshift(If1); Jf2 = fftshift (Jf1); Kf2 = fftshift(Kf1);
%显示图像
%原图
subplot(3,3,1);imshow(I);title('实验人:李诗雨'),xlabel('(a1)原图 ');  
subplot(3,3,2);imshow(J);title('实验人:李诗雨'),xlabel('(a2)原图 ');  
subplot(3,3,3);imshow(K);title('实验人:李诗雨'),xlabel('(a3)原图 ');  
%快速傅里叶变换的图
subplot(3,3,4);imshow(If,[5,30]);title('实验人:李诗雨'),xlabel('(a1)频谱图 ');  
subplot(3,3,5);imshow(Jf,[5,30]);title('实验人:李诗雨'),xlabel('(a2)频谱图 ');
subplot(3,3,6);imshow(Kf,[5,30]);title('实验人:李诗雨'),xlabel('(a3)频谱图 ');
%傅里叶变换频谱中间零频率的图
subplot(3,3,7);imshow(If2,[5,30]);title('实验人:李诗雨'),xlabel('(a1)中心移到零点的频谱图 ');
subplot(3,3,8);imshow(Jf2,[5,30]);title('实验人:李诗雨'),xlabel('(a2)中心移到零点的频谱图 ');
subplot(3,3,9);imshow(Kf2,[5,30]);title('实验人:李诗雨'),xlabel('(a3)中心移到零点的频谱图 ');

数字图像处理 matlab实现_第7张图片

旋转傅里叶变换

利用Matlab生成给定的图像,并对其进行旋转30度、90度和120度,然后对他们分别进行傅里叶变换。

clc
close all
clear all
%构造原始图像
I = zeros(256,256); I(28:228,108:148) = 1;
%旋转图像
I1=imrotate(I,30,'bilinear');
I2=imrotate(I,90,'bilinear');
I3=imrotate(I,120,'bilinear');
%傅里叶变换
If=fft2(I);F=abs(If);If=fftshift(F);
I1f=fft2(I1);F=abs(I1f);I1f=fftshift(F);
I2f=fft2(I2);F=abs(I2f);I2f=fftshift(F);
I3f=fft2(I3);F=abs(I3f);I3f=fftshift(F);
%显示图像
subplot(2,4,1);imshow(I);title('实验人:李诗雨'),xlabel('(b)原图 ');
subplot(2,4,2);imshow(I1);title('实验人:李诗雨'),xlabel('(b1)原图 旋转30度 ');
subplot(2,4,3);imshow(I2);title('实验人:李诗雨'),xlabel('(b2)原图 旋转90度');
subplot(2,4,4);imshow(I3);title('实验人:李诗雨'),xlabel('(b3)原图 旋转120度');

subplot(2,4,5);imshow(If,[5,50]);title('实验人:李诗雨'),xlabel('(b)原图像傅里叶频谱 ');
subplot(2,4,6);imshow(I1f,[5,50]);title('实验人:李诗雨'),xlabel('(b1)原图旋转30度 傅里叶图谱 ');
subplot(2,4,7);imshow(I2f,[5,50]);title('实验人:李诗雨'),xlabel('(b2)原图旋转90度 傅里叶图谱 ');
subplot(2,4,8);imshow(I3f,[5,50]);title('实验人:李诗雨'),xlabel('(b3)原图旋转120度 傅里叶图谱 ');

数字图像处理 matlab实现_第8张图片
*I = zeros(256,256); I(60:196,60:196) = 1;
**置1,是白色,0,黑色,I(行第a个像素:到行第b个像素,列第c个像素:到列第d个像素)
更改这个之后:
数字图像处理 matlab实现_第9张图片

离散余弦变换

用DCT变换对图像进行图像压缩,求经压缩、解压后的图像。

clc 
close all
clear all
addpath E:\study\数字图像处理\实验\4\ face.jpg
I =imread('face.jpg');
[M,N]=size(I);%M=512,N=512
I=im2double(I); 

%生成标准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'
for i=1:8:M
    for j=1:8:N
        P=I(i:i+7,j:j+7);
        K=C*P*C';
        I1(i:i+7,j:j+7)=K;
        K=K./a; %量化(按位除)
        K(abs(K)<0.03)=0;
        I2(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=I2(i:i+7,j:j+7).*a;%反量化
        K=C'*P*C;
        I3(i:i+7,j:j+7)=K;     
    end
end

subplot(2,2,1);imshow(I);title('实验人:李诗雨'),xlabel('(c1)原图 ');
subplot(2,2,2);imshow(I1);title('实验人:李诗雨'),xlabel('(c2)DCT变换后的频域图像 ');
subplot(2,2,3);imshow(I2);title('实验人:李诗雨'),xlabel('(c3)量化后的频域图像 ');
subplot(2,2,4);imshow(I3);title('实验人:李诗雨'),xlabel('(c4) 复原图像 ');





数字图像处理 matlab实现_第10张图片
使用face图像做实验,DCT压缩时,舍掉的变换系数分别小于0.01、0.03、0.05

   K(abs(K)<0.01)=0;

数字图像处理 matlab实现_第11张图片

   K(abs(K)<0.05)=0;

数字图像处理 matlab实现_第12张图片

5.图像增强

1.灰度线性变换

对曝光不足的图像采用灰度线性变换对图像每一个像素灰度做线性拉伸。

clc
close all
clear all
addpath E:\study\数字图像处理\实验\5\ figure51.jpg
I=imread('figure51.jpg'); %读取图片
I=im2double(I);           %转换数据类型为double

figure(1);subplot(1,2,1);
imshow(I);title('实验人:李诗雨'),xlabel('(a1) 原图'); %显示原图像

figure(1);subplot(1,2,2);
a = 1.5;b = -150;             %增加对比度
o = a .* I + b/255;
imshow(o);title('实验人:李诗雨'),xlabel('(a2) a=1.5,b=-150,增加对比度'); 

数字图像处理 matlab实现_第13张图片

2.空间域平滑滤波器

添加均值为0,方差为0.05的高斯噪声,进行3x3、5x5邻域平滑,参考课本85页程序


clc
close all
clear all
addpath E:\study\数字图像处理\实验\5\ lena.jpg
I=imread('lena.jpg'); %读取图片
subplot(2,2,1);imshow(I);title('实验人:李诗雨'),xlabel('(b1) 原图'); %显示原图像

I_noise=double(imnoise(I,'gaussian',0.05));
subplot(2,2,2);imshow(I_noise,[]);title('实验人:李诗雨'),xlabel('(b2) 加入噪声后图像'); 

I_smoothed1=imfilter(I_noise,fspecial('average',3));
subplot(2,2,3);imshow(I_smoothed1,[]);title('实验人:李诗雨'),xlabel('(b3) 3x3 邻域平滑的图像');

I_smoothed2=imfilter(I_noise,fspecial('average',5));
subplot(2,2,4);imshow(I_smoothed2,[]);title('实验人:李诗雨'),xlabel('(b4) 5x5 邻域平滑的图像'); 

数字图像处理 matlab实现_第14张图片

3.空间域锐化滤波器

利用Prewitt、Sobel对图像进行锐化。

clc
close all
clear all
addpath E:\study\数字图像处理\实验\5\ lena.jpg
I=imread('lena.jpg'); %读取图片
subplot(2,2,1);imshow(I);title('实验人:李诗雨'),xlabel('(c1) 原图'); %显示原图像

I_sharpening1=imfilter(I,fspecial('Prewitt'));
subplot(2,2,2);imshow(I_sharpening1,[]);title('实验人:李诗雨'),xlabel('(c2)  Prewitt锐化的图像');

I_sharpening2=imfilter(I,fspecial('Sobel'));
subplot(2,2,3);imshow(I_sharpening2,[]);title('实验人:李诗雨'),xlabel('(c3)  Sobel锐化的图像'); 

数字图像处理 matlab实现_第15张图片

4.频域率平滑滤波器(高斯低通滤波器)

实验(4)使用给定的图像lena做实验,参考课本92页的巴特沃斯低通滤波器程序和课本93页的(5.31)式子,取n=2即为高斯低通滤波器,sig2=100,sig2=400,sig^2=1600

clc
close all
clear all
addpath E:\study\数字图像处理\实验\4\ lena.jpg
I=imread('lena.jpg');
subplot(2,2,1);imshow(I);title('实验人:李诗雨'),xlabel('(d1)原图 ');

I1=fftshift(fft2(I));
[M,N]=size(I1);
n=2;sig=10;
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的指数函数
        I2(i,j)=H*I1(i,j);
    end
end
I2=ifftshift(I2);
I3=real(ifft2(I2));
subplot(2,2,2);
imshow(I3,[]);
title('实验人:李诗雨'),xlabel('(d2)高斯低通滤波器 sig^2=100 ');

n=2;sig=20;
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的指数函数
        I2(i,j)=H*I1(i,j);
    end
end
I2=ifftshift(I2);
I3=real(ifft2(I2));
subplot(2,2,3);
imshow(I3,[]);
title('实验人:李诗雨'),xlabel('(d3)高斯低通滤波器 sig^2=400 ');

n=2;sig=40;
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的指数函数
        I2(i,j)=H*I1(i,j);
    end
end
I2=ifftshift(I2);
I3=real(ifft2(I2));
subplot(2,2,4);
imshow(I3,[]);
title('实验人:李诗雨'),xlabel('(d4)高斯低通滤波器 sig^2=1600 ');

数字图像处理 matlab实现_第16张图片
书上公式错的。。。。
正确公式:
数字图像处理 matlab实现_第17张图片

6.图像复原

1.基于均值滤波器的图像复原

clc
close all
clear all
addpath E:\study\数字图像处理\实验\6\ cameraman.tif

I=imread('cameraman.tif'); %读取图片 
subplot(2,3,1); imshow(I);title('实验人:李诗雨'),xlabel('(a1)原图 ');  

I_noise=double(imnoise(I,'gaussian',0.06));
subplot(2,3,2); imshow(I_noise,[]);title('实验人:李诗雨'),xlabel('(a2)高斯噪声污染的图像 ');  

I_mean=imfilter(I_noise,fspecial('average',3));
subplot(2,3,3);imshow(I_mean,[]);title('实验人:李诗雨'),xlabel('(a3)用3x3算数均值滤波器滤波 '); 

I_mean=exp(imfilter(log(I_noise),fspecial('average',3)));
subplot(2,3,4);imshow(I_mean,[]);title('实验人:李诗雨'),xlabel('(a4)用3x3几何均值滤波器滤波 '); 

Q=-1.5;
I_mean=imfilter(I_noise.^(Q+1),fspecial('average',3))./imfilter(I_noise.^Q,fspecial('average',3));
subplot(2,3,5);imshow(I_mean,[]);title('实验人:李诗雨'),xlabel('(a5)Q=-1.5的逆谐波滤波器滤波 '); 

Q=1.5;
I_mean=imfilter(I_noise.^(Q+1),fspecial('average',3))./imfilter(I_noise.^Q,fspecial('average',3));
subplot(2,3,6);imshow(I_mean,[]);title('实验人:李诗雨'),xlabel('(a6)Q=1.5的逆谐波滤波器滤波 '); 

数字图像处理 matlab实现_第18张图片

2.基于顺序统计滤波器的图像复原

clc
close all
clear all
addpath E:\study\数字图像处理\实验\6\ cameraman.tif

I=imread('cameraman.tif'); %读取图片 
subplot(1,4,1); imshow(I);title('实验人:李诗雨'),xlabel('(b1)原图 ');  

I_noise=double(imnoise(I,'salt & pepper',0.06));
subplot(1,4,2); imshow(I_noise,[]);title('实验人:李诗雨'),xlabel('(b2)椒盐噪声污染的图像 ');  

I_mean=imfilter(I_noise,fspecial('average',5));
subplot(1,4,3);imshow(I_mean,[]);title('实验人:李诗雨'),xlabel('(b3)算数均值滤波器滤波 '); 

I_mean=medfilt2(I_noise);
subplot(1,4,4);imshow(I_mean,[]);title('实验人:李诗雨'),xlabel('(b4)中值滤波器滤波 '); 


数字图像处理 matlab实现_第19张图片

3.基于带阻滤波器的图像复原

clc
close all
clear all
addpath E:\study\数字图像处理\实验\6\ lenazhouqizaosheng.jpg

I=imread('lenazhouqizaosheng.jpg'); %读取图片 
[M,N]=size(I);%得到图像的高度和宽度
subplot(1,4,1); imshow(I);title('实验人:李诗雨'),xlabel('(c1)含有周期噪声的图像 ');  

IF=fftshift(fft2(I));%对含噪图像作傅里叶变换,并将原定啊移至图像中心
IFV=log(1+abs(IF));%含噪图像的频谱
subplot(1,4,2); imshow(IFV,[]);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

subplot(1,4,3);imshow(ff,[]);title('实验人:李诗雨'),xlabel('(c3)高斯带阻滤波器 '); 

out=IF.*ff;%矩阵点乘实现频域滤波
out=ifftshift(out);%原点移回左上角
out=ifft2(out);%傅里叶逆变换
out=abs(out);%取绝对值
out=out/max(out(:));%归一化

subplot(1,4,4);imshow(out,[]);title('实验人:李诗雨'),xlabel('(c4)滤波效果图 '); 


数字图像处理 matlab实现_第20张图片

7. 图像的压缩编码

1.游程编码

clc
close all
clear all
addpath E:\study\数字图像处理\实验\7\ lena.jpg



%主程序
I=imread('lena.jpg'); %读取图片
BW=im2bw(I,0.2);       %对图像二值化,二值化阈值为0.2
[zipped,info]=RLEencode(BW); %调用RLEcode函数对BW进行游程编码
unzipped=RLEdecode(zipped,info);%调用RLEencode函数对zipped进行游程编码
subplot(1,3,1);imshow(I);title('实验人:李诗雨'),xlabel('(a1) 原图'); %显示原图像
subplot(1,3,2);imshow(BW);title('实验人:李诗雨'),xlabel('(a2) 二值化阈值为0.2,二值化后的图像'); 
subplot(1,3,3);imshow(uint8(unzipped)*255);title('实验人:李诗雨'),xlabel('(a3) 经游程编码和解码后的图像'); %显示二值图像经编解码后的图像
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)=double(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

2.基于离散余弦变换的图像压缩

根据公式 ,编写程序计算原图像和上述三种模板下得到不同的压缩编码图像之间的均方误差。
在这里插入图片描述
数字图像处理 matlab实现_第21张图片
e=sqrt(mse(abs(I2-I))); %计算压缩编码图像之间的均方误差。

clc
close all
clear all
addpath E:\study\数字图像处理\实验\7\ lena.jpg
I=imread('lena.jpg'); %读取图片
I=im2double(I);
T=dctmtx(8);  %离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T'); %对原图像分块进行DCT变换
mask = [1 1 1 0 0 0 0 0;1 1 1 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];%设置模板矩阵mask1
B2=blkproc(B,[8 8],'P1.*x',mask);%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像

e=sqrt(mse(abs(I2-I))); %计算压缩编码图像之间的均方误差。
subplot(1,2,1);imshow(I);title('实验人:李诗雨'),xlabel('(b5) 原图'); %显示原图像
subplot(1,2,2);imshow(I2);title('实验人:李诗雨'),xlabel('(b6) 经过压缩解压后的图像'); 

8.图像分割

边缘检测

采用sobel、prewitt、roberts和log对图像及其加上噪声后的图像进行边缘检测。

clc
close all
clear all
addpath E:\study\数字图像处理\实验\8\ chair.jpg
a=imread('chair.jpg');
% a=imnoise(a,'gaussian',0.05);
bw1=edge(a,'sobel');
bw2=edge(a,'prewitt');
bw3=edge(a,'roberts');
bw4=edge(a,'log',[],4);
subplot(2,3,1);imshow(a);title('实验人:李诗雨'),xlabel('(a1) 原图'); %显示原图像
subplot(2,3,2);imshow(bw1);title('实验人:李诗雨'),xlabel('(a2) sobel 算子'); 
subplot(2,3,3);imshow(bw2);title('实验人:李诗雨'),xlabel('(a3) prewitt 算子'); 
subplot(2,3,4);imshow(bw3);title('实验人:李诗雨'),xlabel('(a4) robrtts 算子'); 
subplot(2,3,5);imshow(bw4);title('实验人:李诗雨'),xlabel('(a5) log 算子'); 

数字图像处理 matlab实现_第22张图片
加噪声后:

 a=imnoise(a,'gaussian',0.05);

数字图像处理 matlab实现_第23张图片

图像分割

clc,close all,clear all
addpath E:\study\数字图像处理\实验\8\ cell.jpg
x=imread('cell.jpg');
x=im2double(x);
[m,n]=size(x); 
subplot(1,3,1);imshow(x);title('实验人:李诗雨'),xlabel('(b1) 原图'); %显示原图像
level=graythresh(x);bw=im2bw(x,level); 
subplot(1,3,2);imshow(bw);title('实验人:李诗雨'),xlabel('(b2) 最大类间方差阈值选择法'); 
x=double(x);t=(min(x(:))+max(x(:)))/2;done=false;
i=0;
while ~done
    r1=find(x<=t);
    r2=find(x>t);
    tnew=(mean(x(r1))+mean(x(r2)))/2;
    done=abs(tnew-t)<1;
    t=tnew;
    i=i+1;
end
x(r1)=0;
x(r2)=1;
subplot(1,3,3);imshow(x);title('实验人:李诗雨'),xlabel('(b3) 迭代法'); 

数字图像处理 matlab实现_第24张图片

9.彩色图像分割

clc,close all,clear all
addpath E:\study\数字图像处理\实验\9\ honghua.jpg
rgb=imread('honghua.jpg');
subplot(2,2,1);imshow(rgb);title('实验人:李诗雨'),xlabel(' 原图'); %显示原图像
rgb1=im2double(rgb);
r=rgb1(:,:,1);%图像的红色分量
g=rgb1(:,:,2);%图像的绿色分量
b=rgb1(:,:,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(rgb1,1),size(rgb1,2));

ind=find((r>r1_u-1.10*r1_d)&(r<r1_u+1.10*r1_d));%找到符合条件的点
I1=r2;
I1(ind)=1;%将符合条件的点的灰度值赋值为1
subplot(2,2,2);imshow(I1);title('实验人:李诗雨'),xlabel(' 标准差为1.10'); 

ind=find((r>r1_u-1.20*r1_d)&(r<r1_u+1.20*r1_d));
I2=r2;
I2(ind)=1;
subplot(2,2,3);imshow(I2);title('实验人:李诗雨'),xlabel(' 标准差为1.20'); 

ind=find((r>r1_u-1.30*r1_d)&(r<r1_u+1.30*r1_d));
I3=r2
I3(ind)=1;
subplot(2,2,4);imshow(I3);title('实验人:李诗雨'),xlabel(' 标准差为1.30'); 

数字图像处理 matlab实现_第25张图片
标准差为1.3效果比较好(但是把绿色也分割进去了)。

10.图像 的表示和描述

clc,clear,close all;
addpath E:\study\大二下\数字图像处理\实验\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_test=imread(name);%读取测试集图片
        glcm=graycomatrix(img_test,'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));%求平均分类正确率

你可能感兴趣的:(课程)