搜索
您的当前位置:首页正文

数字图像处理实验报告

来源:小奈知识网
实验一数字图像的获取

一、实验目的

1、了解图像的实际获取过程。

2、巩固图像空间分辨率和灰度级分辨率、邻域等重要概念。

3、熟练掌握图像读、写、显示、类型转换等matlab函数的用法。

二、实验内容

1、读取一幅彩色图像,将该彩色图像转化为灰度图像,再将灰度图像转化为索引图像并显示所有图像。

2、编程实现空间分辨率变化的效果。

三、实验原理

1、图像读、写、显示I=imread(‘image.jpg’)Imview(I)Imshow(I)

Imwrite(I,’wodeimage.jpg’)2、图像类型转换

I=mat2gray(A,[amin,amax]);按指定的取值区间[amin,amax]将数据矩阵A转化为灰度

图像I,amin对应灰度0,amax对应1,也可以不指定该区间。

[x,map]=gray2ind(I,n);按指定的灰度级n将灰度图像转化为索引图像,n默认为64

I=ind2gray(x,map);索引图像转化为灰度图像I=grb2gray(RGB);真彩色图像转化为灰度图像

[x,map]=rgb2ind(RGB);真彩色图像转化为索引图像RGB=ind2rgb(x,map);索引图像转化为真彩色图像

BW=im2bw(I,level);将灰度图像转化为二值图像,level取值在[0,1]之间

BW=im2bw(x,map,level);将索引图像转化为二值图像,level取值在[0,1]之间BW=im2bw(RGB,level);将真彩色图像转化为二值图像,level取值在[0,1]之间

四、实验代码及结果

1、in=imread('peppers.png');

i=rgb2gray(in);[x,map]=gray2ind(i,128);subplot(131),imshow(in)subplot(132),imshow(i)

subplot(133),imshow(x),colormap(map)

、%空间分辨率变化的效果

clc,closeall,clear

i=imread('cameraman.tif');i=imresize(i,[256,256]);i1=i(1:2:end,1:2:end);[m1,n1]=size(i)

i2=i1(1:2:end,1:2:end);[m2,n2]=size(i2)

i3=i2(1:2:end,1:2:end);[m3,n3]=size(i3)

subplot(221),imshow(i),xlabel('256x256')subplot(222),imshow(i1),xlabel('128x128')subplot(223),imshow(i2),xlabel('64x64')subplot(224),imshow(i3),xlabel('32x32')

256 x 25664 x 64128 x 128

32 x 32

2实验二图像的几何变换

一、实验目的

掌握图像的基本几何变换的方法1、图像的平移2、图像的旋转

二、实验内容

练习用matalb命令实现图像的平移、旋转操作1、.编写实现图像平移的函数

2、用imread命令从你的硬盘读取一幅256×256灰度图;

3、调用平移函数,将256×256灰度图平移100行200列,在同一个窗口中显示平移前和平移后的图像。

4、再开辟一个窗口,分别用最近邻插值法、双线性插值法实现图像顺势针旋转50°,显示在同一窗口中,并比较两种效果图(在报告中)

三、实验原理

提示:图片平移就是实现运算

x'10x0x'y01y0y10011



x'xx0即:

y'yy0四、实验代码及结果

1、function[I]=hmove(i,x0,y0);%编写实现图像平移的函数hmove,平移量为[r,c]=size(i);%x0,y0,平移前图像矩阵为i,I(r+x0,c+y0)=0;%平移后图像矩阵为Iforx=1:r;

fory=1:c;

x1=x+x0;y1=y+y0;

I(x1,y1)=i(x,y);end;end;

参考程序subplot(2,2,1)imshow(RGB)subplot(2,2,3)

gray1=rgb2gray(RGB);

imagesc(gray1),colormap(gray);

subplot(2,2,2)

I1=hmove(gray1,100,20);

subimage(gray1),axis('image');

subplot(2,2,4),imagesc(I1),colormap(gray),axis([1,700],[1,820]);

2、显示图像的傅立叶频谱

a=0:800;b=0:600;

%[x,y]=meshgrid([-20:0.2:20],[-20:0.2:20]);[x,y]=meshgrid(a,b);i=imread('hr.jpg');I=rgb2gray(i);

subplot(1,2,1),subimage([0,800],[0,600],i);subplot(1,2,2);s=fft2(I,601,801);

mesh(x,y,log(abs(s)));%图像的傅立叶幅度频谱以三维图形显示colormap(hsv);

实验三图像空域变换增强(1)

一、实验目的

1、掌握直方图均衡化算法。

2、巩固灰度变换、直方图修正、图像算术和逻辑运算等基础知识。3、熟练掌握空域变换增强的matlab相关函数用法,并能利用算法自己编写matlab程序实现图像空域变换增强。

二、实验内容

1、用函数imcomplement对灰度图像cameraman.tif取反。2、利用如下分段变换曲线对canmeraman.tif做线性灰度变换。

3、利用直方图求取算法计算以及显示pout.tif的直方图,并和imhist函数生成的直方图作比较。

三、实验原理

在图像处理中,空域是指由像素组成的空间,空域增强方法是指直接作用于像素的增强方法。空域处理可以表示为:

g(x,y)=T[f(x,y)]

j=imcomplement(i);对图像取反imhist();显示图像的直方图histeq();直方图均衡化函数

imnoise(I,type,parameters);给图像加噪声bitand();图像位与运算bitor();图像位或运算

四、实验代码与结果

1、i=imread('cameraman.tif');

j=imcomplement(i);subplot(121),imshow(i)subplot(122),imshow(j)

2、

clear,closeall,clc

in1=imread('cameraman.tif');f0=0;g0=0;

f1=100;g1=60;f2=150;g2=220;f3=255;g3=255;

figure,plot([f0,f1,f2,f3],[g0,g1,g2,g3])axistight,xlabel('f'),ylabel('g')title('intensitytransformation')r1=(g1-g0)/(f1-f0);b1=g0-r1*f0;

r2=(g2-g1)/(f2-f1);b2=g1-r2*f1;

r3=(g3-g2)/(f3-f2);b3=g2-r3*f2;[m,n]=size(in1);in2=double(in1);fori=1:mforj=1:nf=in2(i,j);g(i,j)=0;

if(f>=0)&(f<=f1)g(i,j)=r1*f+b1;

elseif(f>=f1)&(f<=f2)g(i,j)=r2*f+b2;

elseif(f>=f2)&(f<=f3)g(i,j)=r3*f+b3;endendend

figure,subplot(121),imshow(in1)subplot(122),imshow(mat2gray(g))

3、clc,clear,closeall

in=imread('pout.tif');[m,n]=size(in);

num=zeros(1,256);%num是每个灰度级对应的像素个数p=zeros(1,256);%p是每个灰度级出现的概率fori=1:mforj=1:n

num(1,in(i,j)+1)=num(1,in(i,j)+1)+1;%统计个数endend

p=num./(m*n)%求概率x=1:256;

subplot(121),plot(x,p),axis([125600.06])subplot(122),imhist(in)

实验四图像空域变换增强(2)

一、实验目的

1、掌握直方图均衡化算法。

2、巩固灰度变换、直方图修正、图像算术和逻辑运算等基础知识。

3、熟练掌握空域变换增强的matlab相关函数用法,并能利用算法自己编写matlab程序实现图像空域变换增强。实现频域线性变换,非线性变换增强

二、实验内容

1、利用直方图均衡化算法对图像pout.tif进行增强运算。2、对图像lena.jpg作逻辑与和逻辑或运算。

三、实验原理

j=imcomplement(i);对图像取反imhist();显示图像的直方图histeq();直方图均衡化函数

imnoise(I,type,parameters);给图像加噪声bitand();图像位与运算bitor();图像位或运算

四、实验代码与结果

1、clear;closeall;clc;

tu=imread('pout.tif');%输入图像

%tu=rgb2gray(tu);%转换为灰度图像

N=zeros(1,256);%N为原始图像各灰度级像素个数P=zeros(1,256);%P为原始成图像直方图

q=zeros(1,256);%q为原始图像直方图累积分布函数

newN=zeros(1,256);%newN为新生成图像各灰度级像素个数newP=zeros(1,256);%newP为新生成图像直方图

newq=zeros(1,256);%newq为新生成图像直方图累积分布函数[hw]=size(tu);

new_tu=zeros(h,w);

%计算原始图像各灰度级像素个数forx=1:hfory=1:w

N(1,tu(x,y))=N(1,tu(x,y))+1;endend

P=N./sum(N);%计算原始直方图P%计算原始累积分布直方图q(1,1)=P(1,1);fori=2:256

q(1,i)=q(1,i-1)+P(1,i);end

%计算原始直方图对应的新的灰度t,建立映射关系

fort(1,i)=floor(254*q(1,i)+1+0.5);i=1:256

end

%for计算直方图均衡化后的新图new_tuforx=1:hnew_tu(x,y)=t(1,tu(x,y));y=1:w

endend

%for统计新生成图像各灰度级像素个数forx=1:hnewN(1,new_tu(x,y))=newN(1,new_tu(x,y))+1;y=1:w

endend

newP=newN./(h*w);%计算新的灰度直方图newP%newq(1,1)=newP(1,1);计算新生成图像累积分布直方图fornewq(1,i)=newq(1,i-1)+newP(1,i);i=2:256

end

%subplot(231),imshow(tu)

显示信息

subplot(232),plot(P),axis([1subplot(233),plot(q),axis([1subplot(234),imshow(new_tu,[])

256256001])0.06])subplot(235),plot(newP),axis([1subplot(236),plot(newq),axis([125600.06])256

02、clc,clear,closeall

1])

in=imread('lena.jpg');in=rgb2gray(in);[m,n]=size(in);in=double(in);

out1=ones(m,n)*255;out1(20:150,30:170)=0;chu1=zeros(m,n);chu1(20:150,30:170)=255;fori=1:mforj=1:n

out2(i,j)=bitor(in(i,j),out1(i,j));chu2(i,j)=bitand(in(i,j),chu1(i,j));endend

in=uint8(in);out1=uint8(out1);out2=uint8(out2);chu1=uint8(chu1);chu2=uint8(chu2);subplot(231),imshow(in)subplot(232),imshow(out1)subplot(233),imshow(out2)subplot(234),imshow(chu1)subplot(235),imshow(chu2)

实验五图像滤波增强

一、实验目的

1、掌握各种空域和频域图像滤波增强算法已经模板运算的基本方法。2、巩固卷积定理、滤波处理等基础知识。

3、熟练掌握空域和频域滤波增强的matlab相关函数用法。

二、实验内容

1、利用均值滤波算法对已被噪声污染的图像rice.png进行滤波除噪处理。

2、利用标准中值滤波算法对已被噪声污染的图像rice.png进行滤波除噪处理。3、用prewitt算子对图像cameraman.tif进行锐化滤波处理。

三、实验原理

H=fspecial(type);

H=fspecial(type,parameters);用于创建一个指定的滤波器模板,type指滤波器的类型。

parameters是与指定的滤波器有关的参数。Y=filter2(B,X);用于进行二维线性数字滤波,使用矩阵B中的二维滤波器对数据X进行滤波。结果Y是通过二维互相关计算出来的,大小与X一样。

Y=filter2(B,X,’shape’);结果Y的大小由参数shape确定,shape的取值如下:Full:返回二维户相关的全部结果,size(Y)>size(X)

Same:返回二维户相关结果的中间部分,Y的大小与X相同Valid:返回二维户相关未使用边缘补0的部分,size(Y)四、实验代码与结果

1、clc,clear

in1=imread('rice.png');f=imnoise(in1,'salt&pepper',0.1);%f=imnoise(in1,'gaussian',0,0.02)%g是标准均值滤波器的输出图像g=biaozhunjunzhi(f,3);

subplot(221),imshow(in1)%,xlabel('(a)原始图像')subplot(222),imshow(f)%,xlabel('(b)加噪图像')

subplot(223),imshow(g)%,xlabel('(c)标准均值滤波图像')functiong=biaozhunjunzhi(f,k)[m,n]=size(f);

%f1是对边缘像素补0后得到的图像

f1=zeros(m+(k-1),n+(k-1));[m1,n1]=size(f1);%f1的边缘像素值为0中间的像素值依然为ff1((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2))=f;%注意这条指令绝对不能少ga=f;

%取出窗口内的像素值并作标准均值滤波处理fori=(k+1)/2:(m1-(k-1)/2)forj=(k+1)/2:(n1-(k-1)/2)

a=0;x=1;forp=1:kforq=1:k

a(x)=f1(i+(p-(k+1)/2),j+(q-(k+1)/2));x=x+1;endend

%hsum表示窗口内所有像素值的和hsum=0;forh=1:(k^2)hsum=hsum+a(h);end

ga(i,j)=round(hsum/(k^2));endend

%ga的大小和f1的大小一致所以必须取出中间部分像素值作为输出g=ga((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2));

2、clc,clear

in1=imread('rice.png');f=imnoise(in1,'salt&pepper',0.1);%f=imnoise(in1,'gaussian',0,0.02)%g是标准中值滤波器的输出图像g=biaozhunzhongzhi(f,3);

subplot(131),imshow(in1)%,xlabel('(a)原始图像')subplot(132),imshow(f)%,xlabel('(b)加噪图像')

subplot(133),imshow(g)%,xlabel('(c)标准均值滤波图像')functiong=biaozhunzhongzhi(f,k)[m,n]=size(f);

%f1是对边缘像素补0后得到的图像

f1=zeros(m+(k-1),n+(k-1));[m1,n1]=size(f1);%f1的边缘像素值为0中间的像素值依然为ff1((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2))=f;%注意这条指令绝对不能少ga=f;

fori=(k+1)/2:(m1-(k-1)/2)forj=(k+1)/2:(n1-(k-1)/2)a=0;x=1;forp=1:kforq=1:k

a(x)=f1(i+(p-(k+1)/2),j+(q-(k+1)/2));x=x+1;end

end

a=sort(a);ga(i,j)=a((k^2+1)/2);endend

%ga的大小和f1的大小一致所以必须取出中间部分像素值作为输出g=ga((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2));

3、clc,clear,closeall

f=imread('cameraman.tif');[m,n]=size(f);g=f;

h1=[-1-1-1;000;111];h2=[-101;-101;-101];x1=h1;x2=h2;fori=2:1:m-1forj=2:1:n-1

sum1=0;sum2=0;sum=0;forp=1:1:3forq=1:1:3

x1(p,q)=f(i+(p-2),j+(q-2));x2(p,q)=f(i+(p-2),j+(q-2));

sum1=sum1+x1(p,q)*h1(p,q);sum2=sum2+x2(p,q)*h2(p,q);sum=sum1+sum2;endend

ifsum<1

g(i,j)=abs(sum);else

g(i,j)=sum;endendend

subplot(121),imshow(f)subplot(122),imshow(g)

实验六图像复原

一、实验目的

1、掌握各种空域和频域图像滤波增强算法已经模板运算的基本方法。2、巩固卷积定理、滤波处理等基础知识。

3、熟练掌握空域和频域滤波增强的matlab相关函数用法并能利用算法自己编写matlab程序实现图像空域变换增强。

二、实验内容

1利用大气湍流引起的图像退化模型对camerman.tif进行退化和复原仿真,采用逆滤波的方法复原。

2利用匀速直线运动的图像退化模型对camerman.tif进行退化和复原仿真,采用逆滤波的方法复原。

3根据逆谐波均值滤波器的输入输出方程对输入图像camerman.tif进行空域滤波还原处理。

三、实验原理

Psf=fspecial(type,parameters);返回指定滤波器的单位冲击响应Imfilter(c,psf,’circular’,’conv’);根据psf对图像进行滤波处理Fr=deconvwnr(g,psf,ncorr,icorr);对图像进行维纳滤波处理

Fr=deconvreg(g,psf,noisepower,range);对图像进行最小二乘方滤波处理

Tform=maketform(transform_type,transform_parameters);对图像进行几何失真校正

四、实验代码与结果

1、%基于大气湍流造成的模糊图像及其还原

clear;closeall;clc

in=imread('cameraman.tif');

subplot(131),imshow(in),title('原始图像')f=fft2(in);

[N1,N2]=size(f);

k1=0.00005;%退化模型中的常数

%根据退化模型对输入图像进行退化处理并输出退化后的图像fori=1:N1forj=1:N2

h(i,j)=exp((-k1*(i^2+j^2))^(5/6));out(i,j)=f(i,j)*h(i,j);endend

out1=ifft2(out);

outreal=uint8(real(out1));

subplot(132),imshow(outreal),title('大气湍流退化图')%根据退化模型对已经退化的图像进行恢复处理k2=0.00006;%退化模型中的常数fori=1:N1

forj=1:N2

h(i,j)=exp((-k2*(i^2+j^2))^(5/6));chu(i,j)=out(i,j)/h(i,j);endend

chu1=ifft2(chu);

chureal=uint8(real(chu1));

subplot(133),imshow(chureal),title('大气湍流还原图')

2、%基于匀速直线运动造成的模糊图像及其还原

clear;closeall;clc

in=imread('cameraman.tif');%in=rgb2gray(in1);

subplot(131),imshow(in),title('原始图像')f=fft2(in);

[N1,N2]=size(f);t=1;a=0.06;b=0.04;

pi=3.1415926;foru=1:N1forv=1:N2

fenzhi=cos(pi*(u*a+v*b))-i*sin(pi*(u*a+v*b));h(u,v)=t*sin(pi*(u*a+v*b))*fenzhi/(pi*(u*a+v*b));out(u,v)=f(u,v)*h(u,v);endend

out1=ifft2(out);

outreal=uint8(real(out1));

subplot(132),imshow(outreal),title('匀速直线运动退化图')foru=1:N1forv=1:N2

h(u,v)=t*sin(pi*(u*a+v*b))*(cos(pi*(u*a+v*b))-j*sin(pi*(u*a+v*b)))/(pi*(u*a+v*b));

chu(u,v)=out(u,v)/h(u,v);endend

chu1=ifft2(chu);

chureal=uint8(real(chu1));

subplot(133),imshow(chureal),title('匀速直线运动还原图')

a=0.06;b=0;时的运行结果:

a=0;b=0.06;时的运行结果::3、%逆谐波均值滤波举例

clc,closeall,clear

in=imread('cameraman.tif');f=imnoise(in,'gaussian',0,0.05);g=nixiebojunzhi(f,3);subplot(131),imshow(in)subplot(132),imshow(f)subplot(133),imshow(g)%逆谐波函数

functiong=nixiebojunzhi(f,k)[m,n]=size(f);

r=2;%r为逆谐波函数中的Q值

%f1是对边缘像素补0后得到的图像f1=zeros(m+(k-1),n+(k-1));[m1,n1]=size(f1);

%f1的边缘像素值为0中间的像素值依然为ff1((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2))=f;

%注意这条指令绝对不能少ga=f;

%取出窗口内的像素值并作标准均值滤波处理fori=(k+1)/2:(m1-(k-1)/2)forj=(k+1)/2:(n1-(k-1)/2)a=0;x=1;forp=1:kforq=1:k

a(x)=f1(i+(p-(k+1)/2),j+(q-(k+1)/2));x=x+1;endend

%hsum表示窗口内所有像素值的和hsum1=0;hsum2=0;forh=1:(k^2)

hsum1=hsum1+a(h)^(r+1);hsum2=hsum2+a(h)^r;end

ga(i,j)=round(hsum1/hsum2);endend

%ga的大小和f1的大小一致所以必须取出中间部分像素值作为输出g=ga((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2));

实验七彩色图像处理

一、实验目的

1、了解三色成像及各种颜色模型。

2、能用处理灰度图像的算法和技术对真彩色图像进行增强、去噪、复原等处理。3、理解伪彩色图像处理技术并掌握密度分层法、灰度级彩色变换法、频域滤波等伪彩色图像处理算法。

二、实验内容

1、生成一幅256x256的RGB图像,该图像左上角为红色,右上角为蓝色,左下角为绿色,右下角为黑色。

2、给彩色图像加噪并去噪,可以采用灰度图像去噪处理的任何方法。3、密度分层伪彩色处理仿真。

4、灰度级-彩色变换法伪彩色处理仿真。

三、实验原理

B=cat(dim,A1,A2,A3,...),dim为维数,cat函数将A1,A2,A3等矩阵连接成维数为dim的矩阵。

四、实验代码与结果

1、clc,clear,closeall

rin=zeros(256,256);%红色分量rin(1:128,1:128)=1;%左上角gin=zeros(256,256);%绿色分量gin(129:256,1:128)=1;%左下角bin=zeros(256,256);%蓝色分量bin(1:128,129:256)=1;%右上角%将三个分量进行组合out1=cat(3,rin,gin,bin);%也可以不用matlab函数

out2(:,:,1)=rin;out2(:,:,2)=gin;out2(:,:,3)=bin;subplot(121),imshow(out1)subplot(122),imshow(out2)

2、%给彩色图像加噪并去噪

clc,clear,closeall

in1=imread('peppers.png');

in=imnoise(in1,'salt&pepper',0.8);out(:,:,1)=gaijinjunzhi(in(:,:,1),5);out(:,:,2)=gaijinjunzhi(in(:,:,2),5);out(:,:,3)=gaijinjunzhi(in(:,:,3),5);subplot(221),imshow(in1)subplot(222),imshow(in)subplot(223),imshow(out)

%采用改进均值滤波算法,函数如下functiong=gaijinjunzhi(f,k)[m,n]=size(f);

%f1是对边缘像素补0后得到的图像

f1=zeros(m+(k-1),n+(k-1));[m1,n1]=size(f1);%f1的边缘像素值为0中间的像素值依然为ff1((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2))=f;%注意这条指令绝对不能少ga=f;

%取出窗口内的像素值并作改进均值滤波处理fori=(k+1)/2:(m1-(k-1)/2)forj=(k+1)/2:(n1-(k-1)/2)a=0;x=1;forp=1:kforq=1:k

a(x)=f1(i+(p-(k+1)/2),j+(q-(k+1)/2));x=x+1;endend

mina=min(a);maxa=max(a);

%tan表示窗口内既不是最大也不是最小像素值的个数%he表示窗口内所有既不是最大也不是最小像素值的和tan=0;he=0;

%hsum表示窗口内所有像素值的和hsum=0;

%取出不是最大也不是最小的像素值并求和以及个数forh=1:(k^2)hsum=hsum+a(h);

ifa(h)~=mina&a(h)~=maxatan=tan+1;he=he+a(h);elseendend

%在噪声密度较大的情况下有可能窗口内所有的值都是最大值或最小值%对其进行判断,如果是这种情况,就采用普通的均值滤波算法求当前要求的像素点的值iftan~=0

ga(i,j)=round(he/tan);else

ga(i,j)=round(hsum/(k^2));endendend

%ga的大小和f1的大小一致,所以必须取出中间部分像素值作为输出g=ga((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2));

3、clc,clear,closeall

%[i0,map]=imread('trees.tif');

d=[0.54,0.24,0.81;0.44,0.136,0.123;0.45,0.73,0.145;...0.21,0.12,0.56;0.45,0.54,0.33;0.33,0.23,0.141;...

0.42,0.23,0.1;0.101,0.51,0.31;0.22,0.88,0.21;0.23,0.93,0.33];in=imread('pout.tif');[m,n]=size(in);fori=1:mforj=1:n

%out(i,j,1)=map(in(i,j),1);%out(i,j,2)=map(in(i,j),2);%out(i,j,3)=map(in(i,j),3);ind=fix(in(i,j)/26);

out(i,j,1)=d(ind,1);out(i,j,2)=d(ind,2);out(i,j,3)=d(ind,3);endend

subplot(121),imshow(in)subplot(122),imshow(out)

4、clear,closeall,clc

in1=imread('moon.tif');%in1=rgb2gray(in1);%第一个独立的变换f10=0;g10=0;

f11=127;g11=0;f12=191;g12=255;f13=255;g13=255;figure(11),plot([f10,f11,f12,f13],[g10,g11,g12,g13],'r')axistight,xlabel('f'),ylabel('g')title('intensitytransformation')

r11=(g11-g10)/(f11-f10);b11=g10-r11*f10;r12=(g12-g11)/(f12-f11);b12=g11-r12*f11;r13=(g13-g12)/(f13-f12);b13=g12-r13*f12;[m,n]=size(in1);in2=double(in1);fori=1:mforj=1:n

f=in2(i,j);g1(i,j)=0;if(f>=0)&(f<=f11)g1(i,j)=r11*f+b11;

elseif(f>=f11)&(f<=f12)g1(i,j)=r12*f+b12;

elseif(f>=f12)&(f<=f13)g1(i,j)=r13*f+b13;endendend

g1=uint8(g1);

figure(12),subplot(121),imshow(in1)

subplot(122),imshow(g1)%imshow(mat2gray(g1))%第二个独立的变换

f20=0;g20=0;f21=63;g21=255;f22=191;g22=255;f23=255;g23=0;

figure(21),plot([f20,f21,f22,f23],[g20,g21,g22,g23],'r')axistight,xlabel('f'),ylabel('g')title('intensitytransformation')

r21=(g21-g20)/(f21-f20);b21=g20-r21*f20;r22=(g22-g21)/(f22-f21);b22=g21-r22*f21;r23=(g23-g22)/(f23-f22);b23=g22-r23*f22;[m,n]=size(in1);in2=double(in1);fori=1:mforj=1:n

f=in2(i,j);g2(i,j)=0;if(f>=0)&(f<=f21)g2(i,j)=r21*f+b21;

elseif(f>=f21)&(f<=f22)g2(i,j)=r22*f+b22;

elseif(f>=f22)&(f<=f23)g2(i,j)=r23*f+b23;endendend

g2=uint8(g2);

figure(22),subplot(121),imshow(in1)

subplot(122),imshow(g2)%imshow(mat2gray(g2))%第三个独立的变换

f30=0;g30=255;f31=63;g31=255;f32=127;g32=0;f33=255;g33=0;

figure(31),plot([f30,f31,f32,f33],[g30,g31,g32,g33],'r')axistight,xlabel('f'),ylabel('g')title('intensitytransformation')

r31=(g31-g30)/(f31-f30);b31=g30-r31*f30;r32=(g32-g31)/(f32-f31);b32=g31-r32*f31;r33=(g33-g32)/(f33-f32);b33=g32-r33*f32;[m,n]=size(in1);in2=double(in1);fori=1:mforj=1:nf=in2(i,j);g3(i,j)=0;

if(f>=0)&(f<=f31)g3(i,j)=r31*f+b31;

elseif(f>=f31)&(f<=f32)g3(i,j)=r32*f+b32;

elseif(f>=f32)&(f<=f33)g3(i,j)=r33*f+b33;endendend

g3=uint8(g3);

figure(32),subplot(121),imshow(in1)

subplot(122),imshow(g3)%imshow(mat2gray(g3))%彩色合成fori=1:mforj=1:n

out(i,j,1)=g1(i,j);out(i,j,2)=g2(i,j);out(i,j,3)=g3(i,j);endend

figure,imshow(out)

实验八图像检测与分割

一、实验目的

1、了解图像的实际获取过程。

2、巩固图像空间分辨率和灰度级分辨率、邻域等重要概念。

3、熟练掌握图像读、写、显示、类型转换等matlab函数的用法。

二、实验内容

1、应用一阶算子roberts检测边缘。2、用一阶算子sobel检测边缘并对边界处的像素进行处理。3、用上面描述的Otsu算法编写matlab程序实现图像分割。

三、实验原理

[g,t]=edge(image,method,threshold,direction)其中image为输入图像method为采用的方法类型:threshold为阈值,如果给定阈值,则t=threshold,否则有函数自动计算出来并把其值返回给t;direction为所寻找边缘的方向,其值可以为horizontal,vertical,both默认为both;g为返回的二值图像。

四、实验代码与结果

1、clc,clear,closeall

f=imread('lena.jpg');t=50;

g=robertsf(f,t);

subplot(121),imshow(f),title('原图')

subplot(122),imshow(g),title('roberts算子')%用roberts算子对图像进行边缘检测的函数functiong=robertsf(f,t)[m,n]=size(f);g=f;

h1=[-10;01];h2=[0-1;10];x1=h1;x2=h2;fori=2:1:m-1forj=2:1:n-1

sum1=0;sum2=0;sum=0;forp=1:2forq=1:2

x1(p,q)=f(i+(p-2),j+(q-2));x2(p,q)=f(i+(p-2),j+(q-2));

sum1=sum1+x1(p,q)*h1(p,q);sum2=sum2+x2(p,q)*h2(p,q);sum=(sum1^2+sum2^2)^(1/2);endendifsumelseendendend

2、clc,clear,closeall

f=imread('cameraman.tif');k=3;

[m,n]=size(f);

b1=[-1-2-1000121];b2=[-101-202-101];t=150;

%f1是对边缘像素补0后得到的图像f1=zeros(m+(k-1),n+(k-1));[m1,n1]=size(f1);

%f1的边缘像素值为0中间的像素值依然为ff1((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2))=f;%注意这条指令绝对不能少ga=f1;

%取出窗口内的像素值并作标准均值滤波处理fori=(k+1)/2:(m1-(k-1)/2)forj=(k+1)/2:(n1-(k-1)/2)a=0;%a是一维数组1xk^2x=1;%x是数组的序号forp=1:kforq=1:k

a(x)=f1(i+(p-(k+1)/2),j+(q-(k+1)/2));x=x+1;endend

sum1=0;sum2=0;forw=1:k^2

sum1=sum1+a(w)*b1(w);sum2=sum2+a(w)*b2(w);end

sum=(sum1^2+sum2^2)^(1/2);

ifsum%ga的大小和f1的大小一致所以必须取出中间部分像素值作为输出g=ga((1+(k-1)/2):(m1-(k-1)/2),(1+(k-1)/2):(n1-(k-1)/2));subplot(121),imshow(f)subplot(122),imshow(g)

3、%利用Otsu法阈值选择的方法分割图像

clc,clear,closeall

k=8;%k表示无符号整型数的位数L=2^k;

in=imread('pout.tif');[m,n]=size(in);

num=zeros(1,256);%num是每个灰度级对应的像素个数p=zeros(1,256);%p是每个灰度级出现的概率

%p=zeros(1,256);%q是每个灰度级出现的概率的累积分布函数fori=1:mforj=1:n

num(1,in(i,j)+1)=num(1,in(i,j)+1)+1;%统计个数endend

p=num./(m*n);%求概率ut=0;%ut是整幅图像的均值fori=1:L

ut=ut+(i-1)*p(i);end

fort=0:L-1w0=0;w1=0;fori=1:tw0=w0+p(i);end

w1=1-w0;u0=0;

fori=1:tifw0>0

u0=u0+i*p(i)/w0;else

u0=u0+0;endendu1=0;

fori=(t+1):Lifw1>0

u1=u1+i*p(i)/w1;else

u1=u1+0;endend

rou(t+1)=w0*w1*(u0-u1)^2;%类间方差的求取end

maxrou=max(rou);%类间方差的最大值fori=1:L

ifrou(i)==maxrour=i-1;endend

r%类间方差最大所对应的灰度值fori=1:mforj=1:nifin(i,j)>rout(i,j)=1;else

out(i,j)=0;endendend

subplot(121),imshow(in)subplot(122),imshow(out)

运行结果得到的阈值为:114

因篇幅问题不能全部显示,请点此查看更多更全内容

Top