Skip to content

Commit 8e4f469

Browse files
authored
Add files via upload
1 parent 59dd9d0 commit 8e4f469

8 files changed

+297
-0
lines changed

bezier.m

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
function Y=bezier(y)
2+
%Bezier Curve
3+
% figure;
4+
% plot(1:length(y),y,'color',[0.1 0.2 0.5],'marker','o');
5+
% hold on;
6+
x=1:length(y);
7+
n=length(y);
8+
t=0:0.001:1;
9+
A=0;B=0;
10+
for k=0:n-1
11+
tmp=nchoosek(n-1,k)*t.^k.*(1-t).^(n-1-k);
12+
A=A+tmp*x(k+1);
13+
B=B+tmp*y(k+1);
14+
end
15+
16+
%figure;
17+
% plot(A,B,'color',[0.2 0.5 0.1]);
18+
Y=zeros(1,length(y));
19+
Y(1)=y(1);
20+
for i=2:length(y)-1
21+
position=round(length(t)/(length(y)-1)*(i-1));
22+
Y(i)=B(position);
23+
end
24+
Y(end)=y(end);
25+
26+
% plot(1:length(y),Y,'color',[0.7 0.2 0.1],'marker','+');
27+
% xlabel('x');
28+
% ylabel('y');

cosSimu.m

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
function result=cosSimu(a,b)
2+
% Loop Cosine Similarity
3+
n=fix(size(a,2)/200)+1; % 分成 n 段
4+
n=1;
5+
temp_a=cell(1,n); % 每段成为一个数组
6+
temp_a_node=zeros(1,n-1);
7+
for i=1:n-1
8+
temp_a_node(i)=fix(length(a)/n)*i;
9+
end
10+
temp_a_node=[1 temp_a_node length(a)];
11+
for i=2:n+1
12+
temp_a{i-1}=a(temp_a_node(i-1):temp_a_node(i));
13+
end
14+
15+
overPoint=length(b)-1;
16+
b=[b b]; % 双倍,用于滚动搜索
17+
18+
coeff=zeros(n,overPoint);
19+
for i=1:n
20+
for j=1:overPoint
21+
temp_b=b(j:j+length(temp_a{i})-1);
22+
coeff(i,j)=dot(temp_a{i},temp_b)/(norm(temp_a{i})*norm(temp_b));
23+
end
24+
end
25+
coeff=max(coeff');
26+
result=mean(coeff);

grayGrade.m

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function [grade,totalNetValue]=grayGrade(image,netWide,netHeight)
2+
totalNetValue=zeros(fix(size(image,1)/netHeight),fix(size(image,2)/netWide)); % 网格汇总
3+
for i=1:size(image,1)/netHeight
4+
for j=1:size(image,2)/netWide
5+
temp_block=image((i-1)*netHeight+1:i*netHeight,(j-1)*netWide+1:j*netWide);
6+
[r,~]=find(temp_block<200);
7+
totalNetValue(i,j)=length(r);
8+
end
9+
end
10+
totalNetValue=sort(totalNetValue(:));
11+
totalNetValue=totalNetValue/(netWide*netHeight);
12+
13+
node=0.15; % 建立节点,将 0 到 1 分成 2 大段,前段的筛孔变化较精细
14+
grade=zeros(1,round(node/0.001)); % 确定初始的级配筛孔
15+
for i=1:round(node/0.001)
16+
[r,~]=find(totalNetValue<i*0.001);
17+
grade(i)=length(r);
18+
end
19+
grade=grade/length(totalNetValue);

mainProcess.m

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
clc
2+
clear;
3+
warning('off');
4+
%% 第一步 图片预处理
5+
I=cell(1,2);
6+
I{1} = imread('realTraceMap.bmp');
7+
I{2} = imread('simulatedTraceMap1.bmp');
8+
%figure;
9+
figure('Name','Real Trace Map');
10+
imshow(I{1});
11+
%figure;
12+
figure('Name','Simulated Trace Map');
13+
imshow(I{2});
14+
totalgray_a=totalgray(I{1},'r');
15+
totalgray_b=totalgray(I{2},'b');
16+
yita_totalgray=1-dist(totalgray_a,totalgray_b)/totalgray_a % 灰度相关的百分比
17+
18+
%% 第三步 计算灰度级配曲线
19+
netWide=size(I{1},2)/16;
20+
netHeight=size(I{1},1)/16;
21+
22+
[grade_a,totalNetValue_a]=grayGrade(I{1},netWide,netHeight);
23+
[grade_b,totalNetValue_b]=grayGrade(I{2},netWide,netHeight);
24+
25+
x=1:length(grade_a);
26+
27+
28+
figure('Name','Gray Grade Curve');
29+
plot(x,grade_a,'r--');
30+
hold on;
31+
plot(x,grade_b,'b');
32+
set(gca,'ylim',[0 1]);
33+
set(gca,'yticklabel',{'0%','10%', '20%', '30%', '40%' ,'50%','60%','70%','80%','90%','100%'});
34+
Mhtdist=zeros(1,length(grade_a)); %计算 曼哈顿距离
35+
for i=1:length(grade_a)
36+
Mhtdist(i)=dist(grade_a(i),grade_b(i));
37+
end
38+
stem(1:length(grade_a),Mhtdist,'Marker','none');
39+
xlabel('screen');
40+
ylabel('proportion');
41+
legend('gray grade curve of real trace map','gray grade curve of simulation trace map', 'Location','Best');
42+
%yita_grade=pdist2(grade_a,grade_b,'cityblock')/length(grade_a);
43+
yita_graygrade=riter(Mhtdist)
44+
45+
%% 第四步 以按比例积分的方式对 Radon变换 改进,搜索特征方向、方差及曲线
46+
[varians_a,curves_a,fdegrees_a]=radonTrs(I{1});
47+
[varians_b,curves_b,fdegrees_b]=radonTrs(I{2});
48+
% 密度曲线方差的比较柱状图
49+
M=zeros(length(curves_a),141); % 画拉东变换 的图
50+
for i=1:length(curves_a)
51+
M(i,1:length(curves_a{i}))=curves_a{i};
52+
end
53+
54+
figure('Name','Characteristic Directions');
55+
x=(1:length(varians_a))*1;
56+
h=bar(x,[varians_a' varians_b']);
57+
xlabel('\theta');
58+
ylabel('variance');
59+
legend('real trace map','simulation trace map','Location','Best');
60+
set(gca,'xticklabel',{'15','30', '45', '60' ,'75','90','105' ,'120', '135','150','165','180'});
61+
62+
63+
yita_direction=yitaDirection(fdegrees_a,fdegrees_b)
64+
%% 第五步 以 调整的余弦相似度 方法,沿特征方向滚动匹配两组图像
65+
fIndex=round(fdegrees_a/15);
66+
% figure;
67+
68+
for i=1:4
69+
result(i)=cosSimu(curves_a{fIndex(i)},curves_b{fIndex(i)});
70+
x=1:length(curves_a{fIndex(i)});
71+
% plot(x,curves_a{fIndex(i)}+i-0.94,'r');
72+
% hold on;
73+
% plot(x,curves_b{fIndex(i)}+i-0.94,'b');
74+
% hold on
75+
end
76+
yita_loopcosSimu=mean(result)
77+
%
78+
% xlabel('Cross section');
79+
% legend('Gray Density Distribution Curve (Real Trace Map)',...
80+
% 'Gray Density Distribution Curve (Simulated Trace Map)', 'Location','Best');
81+
% set(gca,'ylim',[-0.1,4]);
82+
%
83+
% set(gca,'yticklabel',{strcat('\theta=',num2str(fdegrees_a(1)),',0.0'),'0.5',...
84+
% strcat('\theta=',num2str(fdegrees_a(2)),',0.0'),'0.5',...
85+
% strcat('\theta=',num2str(fdegrees_a(3)),',0.0'),'0.5',...
86+
% strcat('\theta=',num2str(fdegrees_a(4)),',0.0'),'0.5',' '});
87+
% axes;
88+
%
89+
% reresult=0.99-result;
90+
% bh=barh(0:3,[result',reresult'],'stack','BarWidth',0.05,'LineStyle','none');%'FaceColor',[0.423,0.251,0.392],
91+
% set(bh(1),'facecolor',[0.635294117647059,0.0784313725490196,0.184313725490196]);
92+
% set(bh(2),'facecolor',[0.854901960784314,0.701960784313725,1]);
93+
% set(gca,'xaxislocation','top','color','none');
94+
% set(gca,'ylim',[-0.1 4],'xlim',[0,1],'XTick',0:0.2:1,'ytick',[]);
95+
% ylabel('Gray Density');
96+
% xlabel('Loop Cosine Similarity');
97+
% legend('Loop Cosine Similarity');
98+
%% 综合相似度
99+
comprehensive_Similarity=0.2*(yita_totalgray+yita_graygrade)+0.3*(yita_loopcosSimu+yita_direction)
100+
101+

radonTrs.m

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
function [varians,curves,fdegrees]=radonTrs(I)
2+
% density Radon transform
3+
IBack=zeros(size(I)); % 做背景矩阵,与 I 同时旋转,叠加计算
4+
limit=min([size(I,2) size(I,1)]);
5+
6+
step=15;
7+
varians=zeros(1,180/step);
8+
curves=cell(1,fix(180/step));
9+
sliceWide=5; % 切片的宽度, 最少为迹线的宽度
10+
for i=step:step:180 % 减 1 是因为 180 度和 0 度是一样的
11+
tempI=~I; tempIBack=~IBack;
12+
tempI=imrotate(tempI,i); tempIBack=imrotate(tempIBack,i);
13+
tempI=~tempI;tempIBack=~tempIBack;
14+
% 开始切片计算
15+
sliceNum=fix(size(tempI,2)/sliceWide); % 切片的数量
16+
sliceDensity=zeros(1,sliceNum); % 切片的相对灰度密度
17+
18+
tmp=zeros(1,sliceNum); % 消除边缘影响用
19+
for j=1:sliceNum
20+
SliceI=tempI(:,(j-1)*sliceWide+1:j*sliceWide);
21+
SliceIBack=tempIBack(:,(j-1)*sliceWide+1:j*sliceWide);
22+
[r1,~]=find(SliceI==0);
23+
[r2,~]=find(SliceIBack==0);
24+
if length(r2)>0
25+
sliceDensity(j)=length(r1)/length(r2);
26+
end
27+
tmp(j)=length(r2);
28+
end
29+
% 密度曲线 消除边缘影响
30+
leftnode=0;
31+
tmpsum=0;
32+
for k=1:sliceNum
33+
if tmpsum>limit*sliceWide
34+
leftnode=k;
35+
break;
36+
end
37+
tmpsum=tmpsum+tmp(k);
38+
39+
end
40+
curves{i/step}=sliceDensity;
41+
varians(i/step)=std(sliceDensity);
42+
end
43+
%figure;
44+
x=[1:length(varians)]*step;
45+
46+
[~, fdegrees]=sort(varians,'descend');
47+
fdegrees=fdegrees(1:4)*step;%

riter.m

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function [yitagrade]=riter(Mhtdist)
2+
xx=0:0.001:1;
3+
n=zeros(1,length(xx));
4+
index=0;
5+
tmp=1;
6+
for i=1:length(xx)
7+
n(i)=1-length(find(Mhtdist>=1-xx(i)))/73;
8+
9+
if abs(n(i)-xx(i))<tmp
10+
tmp=abs(xx(i)-n(i));
11+
index=i;
12+
end
13+
end
14+
yitagrade=xx(index);
15+
figure;
16+
plot(xx,n,'r');
17+
hold on;
18+
plot(xx,xx,'b');

totalgray.m

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
function result=totalgray(I,fig)
2+
% fig=='r',输出红色图像
3+
% fig=='b',输出蓝色图像
4+
% 其它,不输入图像
5+
6+
[r,~]=find(I<200);
7+
% 获得个数,总的迹线像素点的个数
8+
result=length(r);
9+
sliceWide=5;
10+
sliceNum=fix(size(I,2)/sliceWide);
11+
sliceDensity=zeros(1,sliceNum);
12+
for i=1:sliceNum
13+
Slice=I(:,(i-1)*sliceWide+1:i*sliceWide);
14+
[r,~]=find(Slice==0);
15+
sliceDensity(i)=length(r);
16+
end
17+
x=1:sliceNum;
18+
if strcmp('r',fig)
19+
figure;
20+
bar(x,sliceDensity,'r');
21+
set(gca,'ylim',[0 100]);
22+
xlabel('x');
23+
ylabel('gray statistic');
24+
end
25+
if strcmp('b',fig)
26+
figure;
27+
bar(x,sliceDensity,'b');
28+
set(gca,'ylim',[0 100]);
29+
xlabel('x');
30+
ylabel('gray statistic');
31+
end

yitaDirection.m

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
function yita_direction=yitaDirection(fdegrees_a,fdegrees_b)
2+
3+
p=[];q=[];
4+
for i=1:length(fdegrees_a)
5+
for j=1:length(fdegrees_a)
6+
if fdegrees_a(i)==fdegrees_b(j)
7+
p(i,j)=1;
8+
q=[q;i j];
9+
else
10+
p(i,j)=0;
11+
end
12+
end
13+
end
14+
15+
count=[];k=1;
16+
for i=1:length(q)-1
17+
for j=i+1:length(q)
18+
if (q(j,1)-q(i,1))*(q(j,2)-q(i,2))>0
19+
count(k)=1;
20+
else
21+
count(k)=0;
22+
23+
end
24+
k=k+1;
25+
end
26+
end
27+
yita_direction=length(q)/length(fdegrees_a)*0.8+sum(count)/length(count)*0.2;

0 commit comments

Comments
 (0)