📄 baobafinal.m
字号:
clear;
close all;
I=imread('bazi.bmp');
imshow(I);
figure;
level = graythresh(I);%类间方差阈值分割
BW = im2bw(I,level); %图像二值化
imshow(BW); %显示二值化后的图像
C=bwmorph(BW,'thin',1); %二值化后的图像再进行细化处理
%-------------------------------------求靶图同心圆圆心坐标
D=[];
D1=[];
E=[];
E1=[];
for i=20:49:1000
for j=3:512
if C(i,j)==0
D=[D;i,j];
break;
end
end
for k=1020:-1:512
if C(i,k)==0
E=[E;i,k];
break;
end
end
end
F=[D(:,2),E(:,2)];
[x,y]=size(F);
sum1=0;
for i=1:x
sum1=sum1+(F(i,1)+F(i,2))/2;
end
cir_ver=sum1/x; %得到圆心的纵坐标
for j=20:49:1000
for i=3:512
if C(i,j)==0
D1=[D1;i,j];
break;
end
end
for k=1020:-1:512
if C(k,j)==0
E1=[E1;k,j];
break;
end
end
end
F1=[D1(:,1),E1(:,1)];
[x1,y1]=size(F1);
sum2=0;
for i=1:x1
sum2=sum2+(F1(i,1)+F1(i,2))/2;
end
cir_hor=sum2/x1; %得到圆心的横坐标
cir_heart=[cir_hor,cir_ver]; %圆心坐标以向量形式保存
%---------------------------------------------------------------弹孔识别
J=imread('bazi9.bmp');
K=abs(I-J);
figure;
imshow(K);%显示差影法得到的弹孔灰度图像
figure;
L=zeros(1024,1024);%弹孔灰度图像二值化
for i=1:1024
for j=1:1024
if K(i,j)<=19
L(i,j)=0;
else
L(i,j)=1;
end
end
end
imshow(L);%显示弹孔二值化图像
se=strel('disk',4);%形态学运算去除背景及弹孔噪声,并使弹孔圆滑
LC=imClose(L,se);
se1=strel('disk',4);
Lo=imopen(LC,se1);
figure;
imshow(Lo);%显示形态学处理后的弹孔图像
%--------------------------------------------------------------- 环数判定
[x2,y2]=find(Lo==1);
x_danxin=mean(x2);
y_danxin=mean(y2);
danxin=[x_danxin,y_danxin]; %弹孔中心坐标
dis_dy=sqrt(norm((danxin-cir_heart).^2,1)); %弹孔中心与圆心的距离
G=[];
cir=round(cir_hor+cir_ver);
for i=4:510
if (C(i,cir-i)==0)&((cir-i)~=1024)
G=[G;i,cir-i];
break
end
end
R5=sqrt(norm((cir_heart-G).^2,1));%求靶环的最外环(5环)的半径
H=[];
for i=G(1,1):round(cir_hor)
for j=G(1,2):-1:round(cir_ver)
if(C(i,j)==1)&((j==cir-i)||(j==cir+1-i))
H=[H;i,j];
end
end
end
R6=sqrt((cir_hor-H(1,1))^2+(cir_ver-H(1,2))^2);%6环半径
R7=sqrt((cir_hor-H(2,1))^2+(cir_ver-H(2,2))^2);%7环半径
R8=sqrt((cir_hor-H(3,1))^2+(cir_ver-H(3,2))^2);%8环半径
R9=sqrt((cir_hor-H(4,1))^2+(cir_ver-H(4,2))^2);%9环半径
R10=sqrt((cir_hor-H(5,1))^2+(cir_ver-H(5,2))^2);%10环半径
hju=((R9-R10)+(R8-R9)+(R7-R8)+(R6-R7)+(R5-R6))/5;%环间距离
if dis_dy<=R10,
bashu=10;
else if R10<dis_dy<=R9
bashu=9+(R9-dis_dy)/hju;
else if R9<dis_dy<=R8
bashu=8+(R8-dis_dy)/hju;
else if R8<dis_dy<=R7
bashu=7+(R7-dis_dy)/hju;
else if R7<dis_dy<=R6
bashu=6+(R6-dis_dy)/hju;
else if R6<dis_dy<=R5
bashu=5+(R5-dis_dy)/hju;
else
bashu=0;
end
end
end
end
end
end
bashu%求得靶数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -