clc
clear all
close all
pic=imread('2.jpg');
graypic=rgb2gray(pic);%灰度化
graypic=medfilt2(graypic,[3,3]);%中值滤波
figure(1);
imshow(graypic);
title('灰度图像');
%得到滤波后的图像
%******图像的二值化*分为四块进行二值化**每块都使用otsu算法**%
[graypich,graypicl]=size(graypic);%获取灰度图像的行和列。
ph=ceil(graypich/2);
pl=ceil(graypicl/2);
p1=uint8(ones( ceil(graypich/2),ceil(graypicl)/2));
p2=uint8(ones( ceil(graypich/2),ceil(graypicl)/2));
p3=uint8(ones( ceil(graypich/2),ceil(graypicl)/2));
p4=uint8(ones( ceil(graypich/2),ceil(graypicl)/2));
for i=1:ph
for j=1:pl
p1(i,j)=graypic(i,j);
p2(i,j)=graypic(i,j+pl-1);
p3(i,j)=graypic(i+ph-1,j);
p4(i,j)=graypic(i+ph-1,j+pl-1);
end
end
%*********对每一部分进行二值化**************************%
levelp1=graythresh(p1);%获取阀值分割的点
p1=im2bw(p1,levelp1);%二值化
levelp2=graythresh(p2);%获取阀值分割的点
p2=im2bw(p2,levelp2);%二值化
levelp3=graythresh(p3);%获取阀值分割的点
p3=im2bw(p3,levelp3);%二值化
levelp4=graythresh(p4);%获取阀值分割的点
p4=im2bw(p4,levelp4);%二值化
%figure(2)
%subplot(221)
%imshow(p1);
%subplot(222)
%imshow(p2);
%subplot(223)
%imshow(p3);
%subplot(224)
%imshow(p4);
bw_pic=vertcat(horzcat(p1,p2),horzcat(p3,p4));%获得二值图像
figure(2);
imshow(bw_pic);
title('二值图像');
%********进行图像的膨胀*并进行简单的去噪(二维码一般为图像中面积最大的部分其余的认为噪声)形态学处理*********%
mor_pic=~bw_pic;
se=strel('square',60);%这里的50为自己设置的模版的大小一般应该比二维码的最小模块大。
mor_pic=imdilate(mor_pic,se);
mor_pic=imfill(mor_pic,'holes');
[label,num]=bwlabel(mor_pic);
maxarea = 0;
maxindex =0;
for i = 1:num
temp=length(find(label==i));
if (temp>maxarea)
maxarea=temp;
maxindex=i;
end
end
mor_pic=(label==maxindex);
figure(3);
imshow(mor_pic);
title('形态学处理');
%********获取仅留下码的二值图像*********************%
mor_picf=~mor_pic;
[bw_pich,bw_picl]=size(bw_pic);
for i=1:bw_pich
for j=1:bw_picl
mor_pic(i,j)= mor_picf(i,j)+bw_pic(i,j);
end
end
figure(4);
imshow(mor_pic);
%*************第一次初步寻点寻找膨胀的图像***************
[mor_pich,mor_picl]=size(mor_pic);%
k=(mor_picl-1)/(1-mor_pich);%
d1=0; d2=0; d3=0; d4=0;n=0;
d1min=0;d2min=0;d3min=0;d4min=0;
ding=zeros(4,2);
for i=10:mor_pich-10
for j=10:mor_picl-10
if mor_pic(i,j)==0
d1=abs(j-k*i-1+k)/ sqrt(1+k^2);
d2=abs(j+(1/k)*i-mor_pich-1/k)/sqrt((-1/k)^2+1);
d3=abs(j+(1/k)*i-mor_picl/k-1)/sqrt((-1/k)^2+1);
d4=abs(j-k*i-mor_picl+mor_pich*k)/sqrt(1+k^2);
if n==0
d1min=d1;
ding(1,:)=[i,j];
d2min=d2;
ding(2,:)=[i,j];
d3min=d3;
ding(3,:)=[i,j];
d4min=d4;
ding(4,:)=[i,j];
n=n+1;
end
if d1min>d1
d1min=d1;
ding(1,:)=[i,j];
end
if d2min>d2
d2min=d2;
ding(2,:)=[i,j];
end
if d3min>d3
d3min=d3;
ding(3,:)=[i,j];
end
if d4min>d4
d4min=d4;
ding(4,:)=[i,j];
end
end
end
end
figure(4),imshow(mor_pic), hold on
plot(ding(1,2),ding(1,1),'x','Color','red');
plot(ding(2,2),ding(2,1),'x','Color','red');
plot(ding(3,2),ding(3,1),'x','Color','red');
plot(ding(4,2),ding(4,1),'x','Color','red');
l=zeros(1,4);
l(1)=sqrt((ding(2,2)-ding(1,2))^2+(ding(2,1)-ding(1,1))^2);
l(2)=sqrt((ding(3,2)-ding(1,2))^2+(ding(3,1)-ding(1,1))^2);
l(3)=sqrt((ding(2,2)-ding(4,2))^2+(ding(2,1)-ding(4,1))^2);
l(4)=sqrt((ding(3,2)-ding(4,2))^2+(ding(3,1)-ding(4,1))^2);
lmax=max(l(:));
%********************************************%
spxiel=round(lmax/42);
newh=spxiel*42;
newl=spxiel*42;
new=zeros(spxiel*42,spxiel*42);
new(1,1)=mor_pic(ding(1,1),ding(1,2));
new(1,newh)=mor_pic(ding(3,1),ding(3,2));
new(newl,1)=mor_pic(ding(2,1),ding(2,2));
new(newh,newl)=mor_pic(ding(4,1),ding(4,2));
%***求出变换公式*********%
x=[ding(1,1),ding(2,1),ding(3,1),ding(4,1)]';
y=[ding(1,2),ding(2,2),ding(3,2),ding(4,2)]';
a=[1,1,1,1;1,newl,newl,1;newh,1,newh,1;newh,newl,newh*newl,1];
xs=inv(a)*x;
ys=inv(a)*y;
for i=1:newh
for j=1:newl
new(i,j)=mor_pic(round(i*xs(1)+j*xs(2)+i*j*xs(3)+xs(4)),round(i*ys(1)+j*ys(2)+i*j*ys(3)+ys(4)));
end
end
figure(5);
imshow(new);
mobanr=zeros(spxiel);
mobang=zeros(spxiel);
mobanb=zeros(spxiel);
rgbh=spxiel*21;rgbl=spxiel*21;
grayr=zeros(21,21);%
grayb=zeros(21,21);%
grayg=zeros(21,21);%
for i=0:20
for j=0:20
%***********做出r矩阵*********%
for n=1:spxiel
for m=1:spxiel
mobanr(n,m)=new(i*2*spxiel+n,j*2*spxiel+m);
end
end
if sum(mobanr(:))/(spxiel*spxiel)>0.5
grayr(i+1,j+1)=1;
else
grayr(i+1,j+1)=0;
end
%***********做出g矩阵*********%
for n=1:spxiel
for m=1:spxiel
mobang(n,m)=new(i*2*spxiel+n,j*2*spxiel+m+spxiel);
end
end
if sum(mobang(:))/(spxiel*spxiel)>0.65
grayg(i+1,j+1)=1;
else
grayg(i+1,j+1)=0;
end
%***********做出b矩阵*********%
for n=1:spxiel
for m=1:spxiel
mobanb(n,m)=new(i*2*spxiel+n+spxiel,j*2*spxiel+m);
end
end
if sum(mobanb(:))/(spxiel*spxiel)>0.65
grayb(i+1,j+1)=1;
else
grayb(i+1,j+1)=0;
end
end
end
%***********建立彩色图像***************%
moban1=255*ones(spxiel);
r=zeros(rgbh,rgbl,3);
b=zeros(rgbh,rgbl,3);
g=zeros(rgbh,rgbl,3);
r(:,:,1)=255*ones(rgbh,rgbl);
g(:,:,2)=kron(grayg,moban1);
b(:,:,3)=255*ones(rgbh,rgbl);
r(:,:,2)=kron(grayr,moban1);
r(:,:,3)=kron(grayr,moban1);
g(:,:,1)=kron(grayg,moban1);
g(:,:,3)=kron(grayg,moban1);
b(:,:,1)=kron(grayb,moban1);
b(:,:,2)=kron(grayb,moban1);
%****显示图像****%
figure(6);
subplot(131);
imshow(r);
subplot(132);
imshow(g);
subplot(133);
imshow(b);
没有合适的资源?快使用搜索试试~ 我知道了~
hh.rar_MATLAB二维码_hh二微码_二维码 matlab_二维码matlab_二维码码识别
共1个文件
m:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 158 浏览量
2022-09-19
20:19:28
上传
评论
收藏 2KB RAR 举报
温馨提示
二维码的合成,用于其它类型二维码的识别与探究
资源详情
资源评论
资源推荐
收起资源包目录
hh.rar (1个子文件)
hh.m 7KB
共 1 条
- 1
weixin_42653672
- 粉丝: 107
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0