图像处理的matlab程序.docx
- 文档编号:4576030
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:27
- 大小:28.83KB
图像处理的matlab程序.docx
《图像处理的matlab程序.docx》由会员分享,可在线阅读,更多相关《图像处理的matlab程序.docx(27页珍藏版)》请在冰豆网上搜索。
图像处理的matlab程序
贡献几个图像处理的matlab程序,每一个都是单独的程序。
前言:
学习了图像处理这门课程,掌握了一些基本的图像处理方法及编程实现方法。
提供给大家参考,欢迎加QQ探讨问题。
以下程序均为笔者根据处理的原理原创作品,经运行检测可行。
若效果不能令方家满意,恳请赐教:
cfvsfc@
直方图拉伸matlab实现:
map1=imread('p.jpg');
[row,col,dep]=size(map1);%行,列,深度值
map=zeros(row,col);
map=uint8(map);
pixsum=row*col;%像素总数
%灰度化
fori=1:
row
forj=1:
col
gray=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
map(i,j)=gray;
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(map)
title('原始灰度图像')
%统计各灰度值像素个数,存储在p中,计算概率,存储在pi中
p=zeros(1,256);
pr=zeros(1,256);
sumpr=zeros(1,256);%累积概率密度
fork=1:
256;
p(k)=length(find(map==k));
pr(k)=p(k)/pixsum;
end
sumpr
(1)=pr
(1);
fori=1:
255
sumpr(i+1)=sumpr(i)+pr(i);
end
%统计完成,概率计算完成,累积概率密度计算完成。
%绘制灰度直方图
figure
(2)
bar(0:
255,pr,'g')
axis([02550max(pr)])
xlabel('灰度r')
ylabel('概率pi')
title('灰度直方图')
%灰度直方图绘制完成
%直方图拉伸。
(g-0)/(f-min)=(255-0)/(max-min)
A=max(max(map));
B=min(min(map));
fori=1:
row
forj=1:
col
%fig(i,j)=255/(A-B)*(map(i,j)-B);
fig(i,j)=255*sumpr(map(i,j)+1);%直方图均衡化
end
end
fig=uint8(fig);
fork=1:
256;
pfig(k)=length(find(fig==k));
pfigi(k)=pfig(k)/pixsum;
end
figure(3)
imshow(fig)
title('直方图拉伸后灰度图像')
figure(4)
bar(0:
255,pfigi,'g')
axis([02550max(pfigi)])
xlabel('灰度r')
ylabel('概率pi')
title('直方图拉伸化后灰度直方图')
%计算拉伸前后方差
mean_map=sum(sum(map))/(row*col);
mean_fig=sum(sum(fig))/(row*col);
var_map=sum(sum((map-mean_map).^2))/(row*col);
var_fig=sum(sum((fig-mean_fig).^2))/(row*col);
fprintf('拉伸前方差为:
%d',var_map)
fprintf('\n拉伸后方差为:
%d\n',var_fig)
Sobel算子matlab实现:
map1=imread('BMW.jpg');
[m,n,l]=size(map1);%行,列,深度值
I=zeros(m,n);
%I=uint8(I);
%灰度化
fori=1:
m
forj=1:
n
I(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(I,[])
title('原始灰度图像')
B=zeros(m,n);
A=I;
fori=2:
m-1
forj=2:
n-1
sx=-1*A(i-1,j-1)-2*A(i,j-1)-1*A(i+1,j-1)...
+1*A(i-1,j+1)+2*A(i,j+1)+1*A(i+1,j+1);
sy=-1*A(i-1,j-1)-2*A(i-1,j)-1*A(i-1,j+1)...
+1*A(i+1,j-1)+2*A(i+1,j)+1*A(i+1,j+1);
B(i,j)=max(sx,sy)/4;
end
end
figure
(2)
imshow(B,[])
title('Sobel算法处理后')
Scharr算子matlab实现:
map1=imread('BMW.jpg');
[m,n,l]=size(map1);%行,列,深度值
I=zeros(m,n);
%I=uint8(I);
%灰度化
fori=1:
m
forj=1:
n
I(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(I,[])
title('原始灰度图像')
B=zeros(m,n);
A=I;
fori=2:
m-1
forj=2:
n-1
sx=-3*A(i-1,j-1)-10*A(i,j-1)-3*A(i+1,j-1)...
+3*A(i-1,j+1)+10*A(i,j+1)+3*A(i+1,j+1);
sy=-3*A(i-1,j-1)-10*A(i-1,j)-3*A(i-1,j+1)...
+3*A(i+1,j-1)+10*A(i+1,j)+3*A(i+1,j+1);
B(i,j)=max(sx,sy)/15;
end
end
figure
(2)
imshow(B,[])
title('Scharr算法处理后')
Robert算子matlab实现:
map1=imread('BMW.jpg');
[m,n,l]=size(map1);%行,列,深度值
I=zeros(m,n);
%I=uint8(I);
%灰度化
fori=1:
m
forj=1:
n
I(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(I,[])
title('原始灰度图像')
B=zeros(m,n);
A=I;
fori=1:
m-1;
forj=1:
n-1;
B(i,j)=max(abs(A(i+1,j+1)-A(i,j)),abs(A(i+1,j)-A(i,j+1)));
end
end
figure(4)
imshow(B,[])
title('Robert算法处理后')
骨架提取和交叉点检测的matlab实现,用的是中轴法,细化法检测出来的是边缘,程序附后:
map1=imread('p.jpg');
[row,col,dep]=size(map1);%行,列,深度值
map=zeros(row,col);
pixsum=row*col;%像素总数
%灰度化
fori=1:
row
forj=1:
col
map(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(map,[])
title('原始灰度图像')
Y=zeros(row,col);%存储输出图像
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5根据通道二值化
fori=1:
row
forj=1:
col
ifmap1(i,j,2)>map1(i,j,1)&&map1(i,j,2)>map1(i,j,3)
Y(i,j)=1;
else
Y(i,j)=0;
end
end
end
figure
(2)
imshow(Y,[])
title('二值化后图像')
%以下为骨架提取程序
temp=ones(row,col);
N=0;%统计邻域内非零像素个数。
T=0;%统计0-1变换次数
fork=1:
80%大循环次数
fori=2:
row-1
forj=2:
col-1
a=[Y(i,j),Y(i,j-1),Y(i+1,j-1),Y(i+1,j),Y(i+1,j+1),Y(i,j+1),Y(i-1,j+1),Y(i-1,j),Y(i-1,j-1)];%邻域元素排序。
中间为1,左边为2,逆时针分别为2---9
ifa
(1)==1
form=1:
8
ifa(m)==1
N=N+1;
end
end
forn=1:
7
ifa(n)==0&&a(n+1)==1
T=T+1;
end
end
ifa(8)==0&&a
(1)==1
T=T+1;
end
end
if(N>=2)&&(N<=6)&&(T==1)&&(a
(2)*a(4)*a(6)==0)&&(a(4)*a(6)*a(8)==0)
temp(i,j)=0;%标记要删除的点,标志为1
end
N=0;
T=0;
end
end
%删除点
fori=1:
row
forj=1:
col
iftemp(i,j)==0
Y(i,j)=0;
end
end
end
%第一步完成
fori=2:
row-1
forj=2:
col-1
a=[Y(i,j),Y(i,j-1),Y(i+1,j-1),Y(i+1,j),Y(i+1,j+1),Y(i,j+1),Y(i-1,j+1),Y(i-1,j),Y(i-1,j-1)];%邻域元素排序。
中间为1,左边为2,逆时针分别为2---9
ifa
(1)==1
form=2:
9
ifa(m)==1
N=N+1;
end
end
forn=1:
7
ifa(n)==0&&a(n+1)==1
T=T+1;
end
end
ifa(8)==0
T=T+1;
end
end
if(N>=2)&&(N<=6)&&(T==1)&&(a
(2)*a(4)*a(8)==0)&&(a
(2)*a(6)*a(8)==0)
temp(i,j)==0;%标记要删除的点,标志为1
end
N=0;
T=0;
end
end
%删除点
fori=1:
row
forj=1:
col
iftemp(i,j)==0
Y(i,j)=0;
end
end
end
%第二步完成
end
%完成,输出
figure(3)
imshow(Y,[])
title('提取的骨架')
%以下为交叉点检测及标志,交叉点标注在灰度图中
temp1=zeros(row,col);
fori=2:
row-1
forj=2:
col-1
c=sum(sum(Y(i-1:
i+1,j-1:
j+1)));
ifc>=4
temp1(i,j)=1;
end
end
end
fori=1:
row
forj=1:
col
iftemp1(i,j)==1
map(i,j)=255;
end
end
end
%标注完成,显示灰度图
figure(4)
imshow(map,[])
title('标注的交叉点')
细化法(这个程序没有实现骨架提取,但仍提出供大家参考):
map1=imread('p.jpg');
[row,col,dep]=size(map1);%行,列,深度值
map=zeros(row,col);
pixsum=row*col;%像素总数
%灰度化
fori=1:
row
forj=1:
col
map(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(map,[])
title('原始灰度图像')
Y=zeros(row,col);%存储输出图像
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5根据通道二值化
fori=1:
row
forj=1:
col
ifmap1(i,j,2)>map1(i,j,1)&&map1(i,j,2)>map1(i,j,3)
Y(i,j)=1;
else
Y(i,j)=0;
end
end
end
figure
(2)
imshow(Y,[])
title('二值化后图像')
%骨架提取,以前的思路是进行若干次腐蚀,直到腐蚀为空集的前一次,但效果不好。
%现在改成细化法。
skel=zeros(row,col);
%细化索引表
tab=[0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,...
1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,...
0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,...
1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,...
1,1,0,0,1,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,...
1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,...
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,...
1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,...
0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,...
1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,...
1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,...
1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,...
1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,0,...
1,1,0,0,1,1,1,0,1,1,0,0,1,0,0,0];
B=[124;8016;3264128];
fori=2:
row-1
forj=2:
col-1
N=sum(sum(Y(i-1:
i+1,j-1:
j+1).*B));
skel(i,j)=tab(N+1);
end
end
%腐蚀完成
figure(3)
imshow(skel,[])
title('提取的图像骨架')
LOG算法的matlab实现:
map1=imread('BMW.jpg');
[m,n,l]=size(map1);%行,列,深度值
I=zeros(m,n);
%I=uint8(I);
%灰度化
fori=1:
m
forj=1:
n
I(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(I,[])
title('原始灰度图像')
B=zeros(m,n);
log=[-2-4-4-4-2;...
-4080-4;...
-48248-4;...
-4080-4;...
-2-4-4-4-2];
A=I;
fori=3:
m-2
forj=3:
n-2
S=sum(sum(A(i-2:
i+2,j-2:
j+2).*log));
B(i,j)=S/56;
end
end
figure
(2)
imshow(B,[])
title('LOG算法处理后')
Kirsch算法的matlab实现:
map1=imread('BMW.jpg');
[m,n,dep]=size(map1);%行,列,深度值
I=zeros(m,n);
%I=uint8(I);
%灰度化
fori=1:
m
forj=1:
n
I(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(I,[])
title('原始灰度图像')
tic
B=zeros(m,n);
s=zeros(8,1);
t=zeros(8,1);
A=I;
fori=2:
m-1
forj=2:
n-1
temp=sum(sum(A([i-1:
i+1],[j-1:
j+1])))-A(i,j);
s
(1)=A(i-1,j-1)+A(i-1,j)+A(i-1,j+1);
s
(2)=A(i-1,j)+A(i-1,j+1)+A(i,j+1);
s(3)=A(i-1,j+1)+A(i,j+1)+A(i+1,j+1);
s(4)=A(i,j+1)+A(i+1,j+1)+A(i+1,j);
s(5)=A(i+1,j+1)+A(i+1,j)+A(i+1,j-1);
s(6)=A(i+1,j)+A(i+1,j-1)+A(i,j-1);
s(7)=A(i+1,j-1)+A(i,j-1)+A(i-1,j-1);
s(8)=A(i,j-1)+A(i-1,j-1)+A(i-1,j);
fork=1:
8
t(k)=temp-s(k);
end
B(i,j)=max(max(abs(5*s-3*t)))/15;
end
end
figure
(2)
imshow(B,[])
title('Kirsch算法处理后')
toc%统计一下程序运行时间,可以见证这个算法速度较慢
均值、高斯和中值去噪的matlab实现:
%实现去噪处理的三个小算法,并显示噪声图。
map1=imread('p.jpg');
[row,col,dep]=size(map1);%行,列,深度值
map=zeros(row,col);
map=uint8(map);
pixsum=row*col;%像素总数
%灰度化
fori=1:
row
forj=1:
col
map(i,j)=0.11*map1(i,j,1)+0.59*map1(i,j,2)+0.3*map1(i,j,3);
end
end
%灰度化完成,输出灰度图
figure
(1)
imshow(map)
title('原始灰度图像')
%@@@@@@@@@@@@@@@@@@@@@均值滤波,存储在fig1中
fig1=zeros(row,col);
fori=2:
row-1
forj=2:
col-1
fig1(i,j)=1/9*sum(sum(map(i-1:
i+1,j-1:
j+1)));
%fig1(i,j)=1/9*(map(i-1,j-1)+map(i-1,j)+map(i-1,j+1)+map(i,j-1)+...
%map(i,j)+map(i,j+1)+map(i+1,j-1)+map(i,j+1)+map(i+1,j+1));
end
end
%滤波完成,边缘处理,直接将原图边缘加入
fig1(1,:
)=map(1,:
);
fig1(row,:
)=map(row,:
);
fig1(:
1)=map(:
1);
fig1(:
col)=map(:
col);
fig1=uint8(fig1);
%边缘处理完成
figure
(2)
subplot(2,1,1)
imshow(fig1)
title('均值去噪')
fig11=map-fig1;
subplot(2,1,2)
imshow(fig11)
title('噪声图像')
%@@@@@@@@@@@@@@@@@@@@@加权滤波,存储在fig2中
fig2=uint8(zeros(row,col));
model=uint8([121;242;121]);
fori=2:
row-1
forj=2:
col-1
fig2(i,j)=sum(sum(map(i-1:
i+1,j-1:
j+1).*model))/16;
%fig2(i,j)=1/16*(map(i-1,j-1)+2*map(i-1,j)+map(i-1,j+1)+2*map(i,j-1)+...
%4*map(i,j)+2*map(i,j+1)+map(i+1,j-1)+2*map(i,j+1)+map(i+1,j+1));
end
end
%滤波完成,边缘处理,直接将原图边缘加入
fig2(1,:
)=map(1,:
);
fig2(row,:
)=map(row,:
);
fig2(:
1)=map(:
1);
fig2(:
col)=map(:
col);
figure(3)
subplot(2,1,1)
imshow(fig2)
title('加权去噪')
fig21=map-fig2;
subplot(2,1,2)
imshow(fig21)
title('噪声图像')
%@@@@@@@@@@@@@@@@@@@@@中值滤波,存储在fig3中
fig3=uint8(zeros(row,col));
sortmap=uint8(zeros(1,9));
fori=2:
row-1
forj=2:
col-1
sortmap=sort([map(i-1,j-1:
j+1),map(i,j-1:
j+1),map(i+1,j-1:
j+1)]);
fig3(i,j)=sortmap(5);
end
end
%滤波完成,边缘处理,直接将原图边缘加入
fig3(1,:
)=map(1,:
);
fig3(row,:
)=map(row,:
);
fig3(:
1)=map(:
1);
fig3(:
col)=map(:
col);
figure(4)
subplot(2,1,1)
imshow(fig3)
title('中值去噪')
fig31=map-fig3;
subplot(2,1,2)
imshow(fig31)
title('噪声图像')
腐蚀和膨胀的matlab实现:
map1=imread('p.jpg');
[row,col,dep]=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 处理 matlab 程序