数字图像处理 matlab实现

1.MATLAB 相关问题

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

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

2.图像的采样和量化

图像的采样
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);

在这里插入图片描述
在这里插入图片描述
图像的量化

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

图像线性点运算

图像的缩放

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度'); 

图像的旋转

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生成给定的图像,并对其进行旋转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;

在这里插入图片描述

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,增加对比度'); 

在这里插入图片描述

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 邻域平滑的图像'); 

在这里插入图片描述

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锐化的图像'); 

在这里插入图片描述

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 ');

在这里插入图片描述
书上公式错的。。。。
正确公式:
在这里插入图片描述

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的逆谐波滤波器滤波 '); 

在这里插入图片描述

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)中值滤波器滤波 '); 


在这里插入图片描述

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)滤波效果图 '); 


在这里插入图片描述

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.基于离散余弦变换的图像压缩

根据公式 ,编写程序计算原图像和上述三种模板下得到不同的压缩编码图像之间的均方误差。
在这里插入图片描述
在这里插入图片描述
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 算子'); 

在这里插入图片描述
加噪声后:

 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) 迭代法'); 

在这里插入图片描述

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'); 

在这里插入图片描述
标准差为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));%求平均分类正确率
  • 16
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
图像添加水印是数字图像处理中的一个重要应用,可以用于图像的版权保护、内容认证等方面。下面简单介绍一下在MATLAB实现图像添加水印的处理流程。 1. 读取原始图像和水印图像,将它们转换成灰度图像,然后将它们归一化到[0,1]之间。 ```matlab img = imread('original_image.jpg'); img_gray = rgb2gray(img); img_gray = im2double(img_gray); watermark = imread('watermark_image.jpg'); watermark_gray = rgb2gray(watermark); watermark_gray = im2double(watermark_gray); ``` 2. 对水印图像进行嵌入强度调整,通常使用 DWT 将水印图像分解成多个子带图像,然后将水印嵌入到某些子带中,这里我们选择了第四个子带。嵌入的方式可以采用加权平均法。 ```matlab [LL1,LH1,HL1,HH1] = dwt2(watermark_gray,'haar'); alpha = 0.1; % 嵌入强度 LL1 = LL1 + alpha*HH1; watermark_embedded = idwt2(LL1,LH1,HL1,HH1,'haar',[size(watermark_gray,1),size(watermark_gray,2)]); ``` 3. 对嵌入了水印的水印图像进行DCT变换,然后选择一些低频系数进行嵌入。选择的系数数量取决于嵌入强度。 ```matlab imf = dct2(watermark_embedded); N = 64; % 选择的DCT系数数量 ind = randperm(numel(imf)); ind = ind(1:N); for i=1:length(ind) [r,c] = ind2sub(size(imf),ind(i)); if imf(r,c)>0 imf(r,c) = imf(r,c) + alpha; else imf(r,c) = imf(r,c) - alpha; end end watermark_embedded = idct2(imf); ``` 4. 将嵌入了水印的水印图像嵌入到原始图像中。通常采用LSB(最低有效位)方式,即将水印图像的每个像素的二进制表示的最低位替换为原始图像每个像素的二进制表示的最低位。 ```matlab img_watermarked = img_gray; for i=1:size(img_gray,1) for j=1:size(img_gray,2) img_watermarked(i,j) = bitset(img_gray(i,j),1,bitget(watermark_embedded(i,j),1)); end end ``` 5. 最后将嵌入了水印的图像保存。 ```matlab imwrite(img_watermarked,'watermarked_image.jpg'); ``` 这样就完成了图像添加水印的处理。需要注意的是,这只是一个简单的示例,实际应用时需要考虑更多的细节问题,比如水印的位置、嵌入强度的选择等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值