彩色图转灰度图matlab实现代码.docx
《彩色图转灰度图matlab实现代码.docx》由会员分享,可在线阅读,更多相关《彩色图转灰度图matlab实现代码.docx(14页珍藏版)》请在冰点文库上搜索。
彩色图转灰度图matlab实现代码
(一):
彩色图像转灰度图
1、设计任务
1) 读入彩色和灰度图像并显示;
2) 对彩色图像转化为灰度图像并显示;
3) 比较两种方法的效果。
2、设计目的
1) 掌握彩色图转灰度图的基本原理与方法;
2) 初步掌握MATLAB的使用方法;
3) 了解MATLAB在数字信号处理,尤其是图像处理中显现出来的优势。
3、源代码
%把RGB格式的图片转换为YUV格式。
clear;clc;
x=imread('lena512.BMP');
[line,row,dim]=size(x);
x1=double(x); %数据类型转换
subplot(1,3,1) %分割当前绘图窗口为(1,3)的区域,显示此图片与1号区域
imshow(uint8(x))%数据类型转换,并且显示当前图片
title('原图');
%矩阵乘,根据【RGB】转【YUV】关系转灰度图
Y1=0.299*x(:
:
1)+0.587*x(:
:
2)+0.114*x(:
:
3);
y1=[round(Y1)];%取整
subplot(1,3,2)
imshow(uint8(y1))
title('根据各分量转换关系转换后图片');
%求RGB各个分量均值转灰度图
Y2=(x(:
:
1)+x(:
:
2)+x(:
:
3))/3;
y2=[round(Y2)];
subplot(1,3,3)
imshow(uint8(y2))
title('求均值转换后图片');
图片无法显示哈。
图
(1)彩色转灰度图程序运行结果
4、结果分析
由运行结果可以看出,根据RGB到YUV各个分量关系转换得到的灰度图比较真实,而用简单的求RGB各个分量的均值转弧度图,其结果很不理想,图片基本看不清楚原来的轮廓。
(二):
对灰度图像实现按比例缩小和放大
1、设计任务
1) 对灰度图实现在行上k1=0.6,列上k2=0.75的按比例缩小;
2) 对灰度图实现在行上k1=1.2,列上k2=1.5的按比例放大;
2、设计目的
1) 掌握图像的放大和缩小原理;
2) 用MATLAB实现图像的按比例放大和缩小;
3) 明白图像的放大和缩小并不是简单的互为逆过程。
3、源代码
(1) 图像按比例缩小源代码
%图像按比例缩小
clear;clc;
X=imread('house.BMP');%读取图片
[line,row]=size(X);
x=double(X);
subplot(1,2,1)
imshow(uint8(x))
title('原图');
%图片缩小
k1=0.6;
k2=0.75; %k1,k2分别表示在行和列上缩小的倍数
l_f=1:
line;
r_f=1:
row;
m=round(line*k1);
n=round(row*k2);%(m,n)表示缩小后的图片的大小
G=zeros(m,n); %初始化缩小后图像矩阵
forl_n=1:
m;
forr_n=1:
n;
l_f=round(l_n./k1);
r_f=round(r_n./k2);
ifl_f>=256;
G(l_n,r_n)=x(256,r_f);%当l_n=154时,l_f>256,越界处理,
%而当r_n=192时,r_f=256,恰好为边界值,不产生越界。
else
G(l_n,r_n)=x(l_f,r_f);%缩小后图片赋值
end
end
end
subplot(1,2,2)
imshow(uint8(G))
title('缩小后的图片');
图
(2)图片缩小程序运行结果
(2)图片按比例放大源代码
%图像按比例放大
clear
clc
X=imread('splash.BMP');
[line,row]=size(X);
x=double(X);
figure
(1) %绘图窗口1
imshow(uint8(x))
title('原图');
%图片放大
k1=1.2;
k2=1.5; %k1,k2分别表示在行和列上放大的倍数
l_f=1:
line;
r_f=1:
row;
m=round(line*k1);
n=round(row*k2);%(m,n)表示放大后的图片的大小
G=zeros(m,n); %初始化放大后图像矩阵
forl_n=1:
m;
forr_n=1:
n;
l_f=round(l_n./k1);
r_f=round(r_n./k2);
G(l_n,r_n)=x(l_f,r_f);%放大后图片赋值
end
end
figure
(2) %绘图窗口2
imshow(uint8(G))
title('放大后的图片');
图(3—1)图片放大程序运行结果 图(3—2)图片放大程序运行结果
4、结果分析
图片缩小后,因为在行和列上分别用了不同的缩小比例,所以缩小后的图片在行列上的像素个数与原图片不同,原图片house.BMP大小为256*256,而缩小后的图片大小为154*192。
在缩小过程中,图片像素点下标出现了越界现象,处理方法是,将离它最近的像素点赋值给相应位置;
图(3—1)为原图片,图(3—2)为放大后的图片。
因为在行和列上有了不同的放大倍数,原图片splash.BMP大小为512*512,放大后的图片大小为614*768。
(三):
对灰度图像进行直方图均衡化处理
1、设计任务
1) 对弧度图像进行直方图均衡化处理;
2) 明白灰度均衡的原理和方法。
2、设计目的
1) 掌握直方图均衡原理;
2) 自己编写程序,实现灰度图的直方图均衡。
3、源代码
%直方图灰度均衡
clear;clc;
X=imread('pattern.BMP'); %读图
x=double(X); %改变数据类型
figure
(1) %第一个图形窗口
subplot(2,2,1) %分割图形窗口
imshow(uint8(x)) %显示图片
title('原图'); %给图片标题
subplot(2,2,2)
imhist(uint8(x)) %原图的灰度图
title('原图的灰度直方图');
%灰度均衡程序段
[line,row]=size(X); %计算图像大小
Nf=line*row; %计算图片像素总数
pf=[0:
255]; %灰度级分布范围
l=length(pf); %灰度级长度
%求各个灰度级的概率分布
hf=zeros(1,l); %hf为原图的各灰度级概率
hp=zeros(1,l); %hp为计算出的新的各灰度级概率
pn=zeros(1,l); %pn为新的灰度级范围
fora=(1:
l); %灰度级个数
x(find(x==pf(a))); %找出灰度级为pf(a)的像素点
N(a)=[length(x(find(x==pf(a))))]; %找出各个灰度值的总数
hf(a)=N(a)./Nf; %计算第i个灰度值的概率
end
%计算新的各个灰度值的概率分布
%计算新的灰度值
fora=(1:
l);
ifa==1;
hp(a)=hf(a); %当a=1时,即第一个灰度级的概率
%均衡后的图和原图的该灰度级概率相同
else
hp(a)=hf(a)+hp(a-1);%当a>1时,从第二个灰度级起
%均衡后图片当前灰度级的概率为原图当前灰度级与之前概率之和。
pn=round(hp*255); %pn为均衡后的新图片的灰度值(round舍入取整)
end
end
%图像恢复
g=zeros(line,row); %新图像矩阵初始化
form=1:
line;
forn=1:
row; %(m,n)为图像的大小
fora=1:
l;
ifx(m,n)==pf(a); %扫描原图,(m,n)点的灰度值等于灰度级表中的pf(a)值,
%取出a值
g(m,n)=pn(a); %把对应在新的灰度级表中的a位置的值赋值给新的图像
end
end
end
end
subplot(2,2,3)
imshow(uint8(g))
title('灰度均衡后的图片');
subplot(2,2,4)
imhist(uint8(g))
title('均衡后的灰度直方图')
图(4—1)灰度均衡程序运行结果
图(4—2)灰度均衡程序运行结果
4、结果分析
直方图均衡的目的就是把原图中,比较集中的灰度级分布到整个灰度级范围内,使得图片的黑白分明,显示出更多的细节来。
由图(4—2)后面的灰度直方图可以看出,原来比较集中的灰度级,现在比较宽,比较均匀的分布在了整个灰度范围内。
灰度均衡后的图片给人的感觉比原来的图片更清晰,更多的显示出了其细节。
(四)对灰度图像进行滤波处理
1、设计任务
1) 对灰度图像完成均值滤波;
2) 对灰度图像完成中值滤波;
3) 要求滤波器魔波尺寸分别取3*3和5*5.
2、设计目的
1) 掌握图像滤波原理;
2) 用MATLAB编程实现对图像的均值滤波和中值滤波;
3) 分析滤波器模板尺寸不同对滤波效果的影响。
3、源代码
(1)均值滤波源代码
%均值滤波程序
clear;clc;
X=imread('lena256noisegau.BMP');
[line,row]=size(X);
x=double(X);
subplot(1,2,1)
imshow(uint8(x))
title('未滤波前图片');
%滤波器主程序段
s=input('pleaseinputthesizeoftemplets=');
H=(1/s^2)*ones(s);
G=zeros(line,row);%滤波后图片矩阵初始化
l_x=1:
line;
r_x=1:
row; %图片行列下标范围
x_s=zeros(s);%原图片中像素点取样矩阵初始化
forp=1:
(line-s+1);
forq=1:
(row-s+1); %p,q为行列下标变量
foru=1:
s;
forv=1:
s;
x_s(u,v)=x(p+u-1,q+v-1); %从原图片中提取滤波块
end
end
I=H.*x_s;%与滤波器模块相乘
foru=1:
s;
forv=1:
s;
G(p+(s-1)/2,q+(s-1)/2)=round(G(p+(s-1)/2,q+(s-1)/2)+I(u,v));
%给滤波后的图像矩阵赋值
end
end
end
end
%边界特殊点取值,一般把原图像的点复制过来,不影响视觉效果
forl_x=1:
(s-1)/2;
G(l_x,:
)=x(l_x,:
);
end
forl_x=(line-(s-3)/2):
line;
G(l_x,:
)=x(l_x,:
);
end
forr_x=1:
(s-1)/2;
G(:
r_x)=x(:
r_x);
end
forr_x=(row-(s-3)/2):
row;
G(:
r_x)=x(:
r_x);
end
%图片显示
subplot(1,2,2)
imshow(uint8(G))
title('滤波后的图片');
图(5—1)均值滤波程序运行结果(s=3)
图(5—2)均值滤波程序运行结果(s=5)
4.1、 结果分析
均值滤波的基本原理就是把跟滤波器模块大小相等的像素模块与滤波器模块相乘,将结果的各个像素点的均值赋值给模块中间的或者确定好的像素点;滤波器模块滑动扫边整个图像,就达到了滤波的目的。
边界值不能进行滤波处理,可直接从原图像中复制过来,并不影响滤波的视觉效果。
图(5—1)是滤波器模块大小为3*3的时候的滤波结果,感觉比较清晰,但是滤波效果不怎么好,噪声点还能明显的看到;图(5—2)是滤波器模块大小为5*5的时候的滤波结果,感觉图像没有原来的清晰,但是噪声点却不那么明显了。
(2)中值滤波源代码
%中值滤波器
clear;clc;
X=imread('lena256noisesalt.BMP');
[line,row]=size(X);
x=double(X);
subplot(1,2,1)
imshow(uint8(x))
title('未滤波前图片');
%滤波器主程序段
s=input('pleaseinputthesizeoftemplets=');
G=zeros(line,row);%滤波后图片矩阵初始化
l_x=1:
line;
r_x=1:
row; %图片行列下标范围
x_s=zeros(s);%原图片中像素点取样矩阵初始化
b=zeros(1,s^2);%初始化行向量
c=zeros(1,s^2);%中间变量向量
forp=1:
(line-s+1);
forq=1:
(row-s+1); %p,q为行列下标变量
foru=1:
s;
forv=1:
s;
x_s(u,v)=x(p+u-1,q+v-1); %从原图片中提取滤波块
end
end
%把提取出的像素值排成一行
k=1;
foru=1:
s;
forv=1:
s;
b(k)=x_s(u,v); %把像素值赋值给行向量
k=k+1;
end
end
%把行向量b中的值按从小到大的顺序排列
Nf=s^2;
forn=1:
Nf^2;
form=1:
(Nf-1);
ifb(m)>b(m+1);
c(m)=b(m+1);
b(m+1)=b(m);
b(m)=c(m);
elseb(m)=b(m);
b(m+1)=b(m+1);
end
end
end
%给滤波后图像矩阵赋值
foru=1:
s;
forv=1:
s;
G(p+(s-1)/2,q+(s-1)/2)=b((Nf-1)/2);%给滤波后的图像矩阵赋值
end
end
end
end
%边界特殊点取值,一般把原图像的点复制过来,不影响视觉效果
forl_x=1:
(s-1)/2;
G(l_x,:
)=x(l_x,:
);
end
forl_x=(line-(s-3)/2):
line;
G(l_x,:
)=x(l_x,:
);
end
forr_x=1:
(s-1)/2;
G(:
r_x)=x(:
r_x);
end
forr_x=(row-(s-3)/2):
row;
G(:
r_x)=x(:
r_x);
end
%图片显示
subplot(1,2,2)
imshow(uint8(G))
title('滤波后的图片');
图(5-3)中值滤波程序运行结果(s=3)
图(5-4)中值滤波程序运行结果(s=5)
4.2、 结果分析
中值滤波基本原理就是把滤波器与模块大小相同的原图像像素块中的各个像素值按从小到大的顺序排列起来,然后取中间的一个值赋值给确定的像素点,一般是像素块中间的一个值;图(5-3)为滤波器模块取3*3大小时的滤波效果,已经明显去除了图像中的噪声,并且图像也比较清晰;图(5-4)为滤波器模块取5*5大小时的滤波效果,虽然明显去除了噪声,但是,图像比较模糊。
中值滤波也存在边界值不能进行滤波的问题,一般将原图片的像素值赋值到新图中,不影响视觉效果.