先检查是不是拼写错误,详细可以看
MATLAB:运行出现 “ 未定义函数或变量 ”
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);
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
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像素'); %显示原图像
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度');
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生成给定的图像,并对其进行旋转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度 傅里叶图谱 ');
*I = zeros(256,256); I(60:196,60:196) = 1;
**置1,是白色,0,黑色,I(行第a个像素:到行第b个像素,列第c个像素:到列第d个像素)
更改这个之后:
用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) 复原图像 ');
使用face图像做实验,DCT压缩时,舍掉的变换系数分别小于0.01、0.03、0.05
K(abs(K)<0.01)=0;
K(abs(K)<0.05)=0;
对曝光不足的图像采用灰度线性变换对图像每一个像素灰度做线性拉伸。
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,增加对比度');
添加均值为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 邻域平滑的图像');
利用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锐化的图像');
实验(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 ');
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的逆谐波滤波器滤波 ');
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)中值滤波器滤波 ');
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)滤波效果图 ');
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
根据公式 ,编写程序计算原图像和上述三种模板下得到不同的压缩编码图像之间的均方误差。
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) 经过压缩解压后的图像');
采用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 算子');
a=imnoise(a,'gaussian',0.05);
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) 迭代法');
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');
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));%求平均分类正确率