1) no fill, no grains, all pixels
mtexdata small
[ grains , ebsd . grainId , ebsd . mis2mean ] = calcGrains ( ebsd );
ebsd ( grains ( grains . grainSize <= 3 )) = [];
[ grains , ebsd . grainId , ebsd . mis2mean ] = calcGrains ( ebsd );
F = splineFilter ;
ebsd = smooth ( ebsd , F );
[ grains , ebsd . grainId , ebsd . mis2mean ] = calcGrains ( ebsd );
plot ( ebsd )
hold on
plot ( grains . boundary , 'lineColor' ,[ 1 0 0 ], 'linewidth' , 2 )
hold off
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
0 1197 (32%) notIndexed
1 1952 (52%) Forsterite LightSkyBlue mmm
2 290 (7.8%) Enstatite DarkSeaGreen mmm
3 282 (7.6%) Diopside Goldenrod 12/m1 X||a*, Y||b*, Z||c
Properties: bands, bc, bs, error, mad
Scan unit : um
X x Y x Z : [33000 36000] x [4500 7500] x [0 0]
Normal vector: (0,0,1)
2) no fill, no grains, indexed pixels
mtexdata small
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
ebsd ( grains ( grains . grainSize <= 3 )) = [];
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
F = splineFilter ;
ebsd = smooth ( ebsd ( 'indexed' ), F );
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
nextAxis
plot ( ebsd )
hold on
plot ( grains . boundary , 'lineColor' ,[ 1 0 0 ], 'linewidth' , 2 )
hold off
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
0 1197 (32%) notIndexed
1 1952 (52%) Forsterite LightSkyBlue mmm
2 290 (7.8%) Enstatite DarkSeaGreen mmm
3 282 (7.6%) Diopside Goldenrod 12/m1 X||a*, Y||b*, Z||c
Properties: bands, bc, bs, error, mad
Scan unit : um
X x Y x Z : [33000 36000] x [4500 7500] x [0 0]
Normal vector: (0,0,1)
3) fill, no grains, all pixels
mtexdata small
[ grains , ebsd . grainId ] = calcGrains ( ebsd );
ebsd ( grains ( grains . grainSize <= 3 )) = [];
[ grains , ebsd . grainId ] = calcGrains ( ebsd );
F = splineFilter ;
ebsd = smooth ( ebsd , F , 'fill' );
[ grains , ebsd . grainId ] = calcGrains ( ebsd );
nextAxis
plot ( ebsd )
hold on
plot ( grains . boundary , 'lineColor' ,[ 1 0 0 ], 'linewidth' , 2 )
hold off
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
0 1197 (32%) notIndexed
1 1952 (52%) Forsterite LightSkyBlue mmm
2 290 (7.8%) Enstatite DarkSeaGreen mmm
3 282 (7.6%) Diopside Goldenrod 12/m1 X||a*, Y||b*, Z||c
Properties: bands, bc, bs, error, mad
Scan unit : um
X x Y x Z : [33000 36000] x [4500 7500] x [0 0]
Normal vector: (0,0,1)
4) fill, no grains, indexed pixels
mtexdata small
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
ebsd ( grains ( grains . grainSize <= 3 )) = [];
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
F = splineFilter ;
ebsd = smooth ( ebsd ( 'indexed' ), F , 'fill' );
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
nextAxis
plot ( ebsd )
hold on
plot ( grains . boundary , 'lineColor' ,[ 1 0 0 ], 'linewidth' , 2 )
hold off
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
0 1197 (32%) notIndexed
1 1952 (52%) Forsterite LightSkyBlue mmm
2 290 (7.8%) Enstatite DarkSeaGreen mmm
3 282 (7.6%) Diopside Goldenrod 12/m1 X||a*, Y||b*, Z||c
Properties: bands, bc, bs, error, mad
Scan unit : um
X x Y x Z : [33000 36000] x [4500 7500] x [0 0]
Normal vector: (0,0,1)
5) fill, grains, indexed pixels
mtexdata small
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
ebsd ( grains ( grains . grainSize <= 3 )) = [];
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
F = splineFilter ;
ebsd = smooth ( ebsd ( 'indexed' ), F , 'fill' , grains );
[ grains , ebsd ( 'indexed' ) . grainId ] = calcGrains ( ebsd ( 'indexed' ));
nextAxis
plot ( ebsd )
hold on
plot ( grains . boundary , 'lineColor' ,[ 1 0 0 ], 'linewidth' , 2 )
hold off
drawNow ( gcm )
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
0 1197 (32%) notIndexed
1 1952 (52%) Forsterite LightSkyBlue mmm
2 290 (7.8%) Enstatite DarkSeaGreen mmm
3 282 (7.6%) Diopside Goldenrod 12/m1 X||a*, Y||b*, Z||c
Properties: bands, bc, bs, error, mad
Scan unit : um
X x Y x Z : [33000 36000] x [4500 7500] x [0 0]
Normal vector: (0,0,1)
6) Multiscale clustering method
mtexdata small
grains = calcGrains ( ebsd ( 'indexed' ), 'FMC' , 1 )
nextAxis
plot ( ebsd )
hold on
plot ( grains . boundary , 'lineColor' ,[ 1 0 0 ], 'linewidth' , 2 )
hold off
drawNow ( gcm )
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
0 1197 (32%) notIndexed
1 1952 (52%) Forsterite LightSkyBlue mmm
2 290 (7.8%) Enstatite DarkSeaGreen mmm
3 282 (7.6%) Diopside Goldenrod 12/m1 X||a*, Y||b*, Z||c
Properties: bands, bc, bs, error, mad
Scan unit : um
X x Y x Z : [33000 36000] x [4500 7500] x [0 0]
Normal vector: (0,0,1)
grains = grain2d
Phase Grains Pixels Mineral Symmetry Crystal reference frame
1 23 1952 Forsterite mmm
2 7 290 Enstatite mmm
3 38 282 Diopside 12/m1 X||a*, Y||b*, Z||c
boundary segments: 1179 (53903 µm)
inner boundary segments: 0 (0 µm)
triple points: 60
Properties: meanRotation, GOS
Multiscale clustering method
When analyzing grains with gradual and subtle boundaries the threshold based method may not lead to the desired result.
Let us consider the following example
mtexdata single
colorKey = axisAngleColorKey ( ebsd );
colorKey . oriRef = mean ( ebsd . orientations );
plot ( ebsd , colorKey . orientation2color ( ebsd . orientations ))
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
1 10201 (100%) Al LightSkyBlue m-3m
Scan unit : um
X x Y x Z : [6 16] x [4 14] x [0 0]
Normal vector: (0,0,1)
We obeserve that the are no rapid changes in the orientation which would allow for applying the threshold based algorithm. Setting the threshold angle to a very small value would include many irrelevant or false regions.
grains_high = calcGrains ( ebsd , 'angle' , 1 * degree );
grains_low = calcGrains ( ebsd , 'angle' , 0.5 * degree );
figure
plot ( ebsd , colorKey . orientation2color ( ebsd . orientations ))
hold on
plot ( grains_high . boundary )
hold off
figure
plot ( ebsd , colorKey . orientation2color ( ebsd . orientations ))
hold on
plot ( grains_low . boundary )
hold off
As an alternative MTEX includes the fast multi-scale clustering method (FMC method) which constructs clusters in a hierarchical manner from single pixels using fuzzy logic to account for local, as well as global information.
Analogous with the threshold angle, a single parameter, C_Maha controls the sensitivity of the segmentation. A C_Maha value of 3.5 properly identifies the sub-grain features. A C_Maha value of 3 captures more general features, while a value of 4 identifies finer features but is slightly oversegmented.
grains_FMC = calcGrains ( ebsd ( 'indexed' ), 'FMC' , 3.8 )
grains = calcGrains ( ebsd ( 'indexed' ))
% smooth grains to remove staircase effect
grains_FMC = smooth ( grains_FMC );
grains_FMC = grain2d
Phase Grains Pixels Mineral Symmetry Crystal reference frame
1 17 10201 Al m-3m
boundary segments: 1949 (156 µm)
inner boundary segments: 0 (0 µm)
triple points: 14
Id Phase Pixels meanRotation GOS
1 1 7 (317°,128°,159°) 0.0084
2 1 1120 (239°,74°,319°) 0.025
3 1 517 (238°,75°,320°) 0.01
4 1 1783 (56°,103°,40°) 0.022
5 1 11 (57°,104°,220°) 0.0074
6 1 2 (237°,79°,322°) 0.0028
7 1 7 (343°,43°,249°) 0.008
8 1 989 (236°,79°,322°) 0.013
9 1 1060 (239°,75°,320°) 0.02
10 1 76 (238°,75°,320°) 0.0079
11 1 1556 (238°,77°,320°) 0.022
12 1 349 (237°,77°,320°) 0.011
13 1 401 (342°,41°,251°) 0.01
14 1 402 (238°,77°,320°) 0.012
15 1 184 (237°,77°,319°) 0.013
16 1 957 (316°,129°,74°) 0.018
17 1 780 (238°,78°,321°) 0.012
grains = grain2d
Phase Grains Pixels Mineral Symmetry Crystal reference frame
1 1 10201 Al m-3m
boundary segments: 801 (41 µm)
inner boundary segments: 0 (0 µm)
triple points: 0
Id Phase Pixels meanRotation GOS
1 1 10201 (237°,77°,320°) 0.0344809
We observe how this method nicely splits the measurements into clusters of similar orientation
%plot(ebsd,oM.orientation2color(ebsd.orientations))
plot ( ebsd , colorKey . orientation2color ( ebsd . orientations ))
% start override mode
hold on
plot ( grains_FMC . boundary , 'linewidth' , 1.5 )
% stop override mode
hold off
Markovian Clustering Algorithm
F = halfQuadraticFilter
F . alpha = 0.5
ebsd = smooth ( ebsd , F )
F =
halfQuadraticFilter with properties:
l1DataFit: 1
l1TV: 1
alpha: 1
iterMax: 1000
tol: 3.4907e-04
eps: 1.0000e-03
threshold: 0.2618
isHex: 0
F =
halfQuadraticFilter with properties:
l1DataFit: 1
l1TV: 1
alpha: 0.5000
iterMax: 1000
tol: 3.4907e-04
eps: 1.0000e-03
threshold: 0.2618
isHex: 0
ebsd = EBSD
Phase Orientations Mineral Color Symmetry Crystal reference frame
1 10201 (100%) Al LightSkyBlue m-3m
Properties: oldId, quality
Scan unit : um
X x Y x Z : [6 16] x [4 14] x [0 0]
Normal vector: (0,0,1)
grains = calcGrains ( ebsd , 'mcl' ,[ 1.24 50 ], 'soft' ,[ 0.2 0.3 ] * degree )
grains = smooth ( grains , 5 )
plot ( ebsd , colorKey . orientation2color ( ebsd . orientations ))
hold on ; plot ( grains . boundary , 'linewidth' , 2 ); hold off
grains = grain2d
Phase Grains Pixels Mineral Symmetry Crystal reference frame
1 285 10201 Al m-3m
boundary segments: 4119 (374 µm)
inner boundary segments: 16502 (1656 µm)
triple points: 423
Properties: meanRotation, GOS
grains = grain2d
Phase Grains Pixels Mineral Symmetry Crystal reference frame
1 285 10201 Al m-3m
boundary segments: 4119 (372 µm)
inner boundary segments: 16502 (1650 µm)
triple points: 423
Properties: meanRotation, GOS