Grain Reconstruction edit page

By grain reconstruction we mean the subdivision of the specimen, or more precisely the measured surface of the specimen, into regions of similar orientation which we then call grains. Note that there is no canonical definition of what is a grain. The default grain reconstruction method in MTEX is based on the definition of high angle grain boundaries which are assumed at the perpendicular bisector between neighbouring measurements whenever their misorientation angle exceeds a certain threshold. According to this point of view grains are regions surrounded by grain boundaries.

In order to illustrate the grain reconstruction process we consider the following sample data set

close all; plotx2east

% import the data
mtexdata forsterite

% restrict it to a subregion of interest.
ebsd = ebsd(inpolygon(ebsd,[5 2 10 5]*10^3));

% gridify the data
ebsd = ebsd.gridify;

% make a phase plot
plot(ebsd)
ebsd = EBSD
 
 Phase  Orientations     Mineral         Color  Symmetry  Crystal reference frame
     0   58485 (24%)  notIndexed                                                 
     1  152345 (62%)  Forsterite  LightSkyBlue       mmm                         
     2   26058 (11%)   Enstatite  DarkSeaGreen       mmm                         
     3   9064 (3.7%)    Diopside     Goldenrod     12/m1       X||a*, Y||b*, Z||c
 
 Properties: bands, bc, bs, error, mad, x, y
 Scan unit : um

Basic grain reconstruction

We see that there are a lot of not indexed measurements. For grain reconstruction, we have three different choices how to deal with these unindexed regions:

  1. leave them unindexed
  2. assign them to the surrounding grains
  3. a mixture of both, e.g., assign small notindexed regions to the surrounding grains but keep large notindexed regions

The extent to which unindexed pixels are assigned is controlled by the parameter 'alpha'. Roughly speaking this parameter is the radius of the smallest unindexed region that will not be entirely assigned to surrounding grains. The default of this value is 2.2.

The second parameter involved in grain reconstruction is the threshold misorientation angle indicating a grain boundary. By default, this value is set to 10 degrees.

All grain reconstruction methods in MTEX are accessible via the command calcGrains which takes as input an EBSD data set and returns a list of grain.

[grains, ebsd.grainId] = calcGrains(ebsd,'alpha',2.2,'angle',10*degree);
grains
grains = grain2d
 
 Phase  Grains  Pixels     Mineral  Symmetry  Crystal reference frame
     1     109   14093  Forsterite       mmm                         
     2      34    1397   Enstatite       mmm                         
     3      71     759    Diopside     12/m1       X||a*, Y||b*, Z||c
 
 boundary segments: 4198 (194614 µm)
 inner boundary segments: 1 (19 µm)
 triple points: 225
 
 Properties: meanRotation, GOS

The reconstructed grains are stored in the variable grains. To visualize the grains we can plot its boundaries by the command plot.

% start overide mode
hold on

% plot the boundary of all grains
plot(grains.boundary,'linewidth',1.5)

% stop overide mode
hold off

Grainboundary Smoothing

Due to the gridded nature of the EBSD measurement the reconstructed grain boundaries often suffer from the staircase effect. This can be reduced by smoothing the grain boundaries using the command smooth

grains = smooth(grains,5);

% display the result
plot(ebsd)
hold on
plot(grains.boundary,'linewidth',1.5)
hold off

Adapting the Alpha Paramter

Increasing the parameter 'alpha' larger unindexed regions are associated to grains.

[grains, ebsd.grainId] = calcGrains(ebsd,'alpha',10,'angle',10*degree);
grains = smooth(grains,5);

% plot the boundary of all grains
plot(ebsd)
hold on
plot(grains.boundary,'linewidth',1.5)
hold off

Clearing Single Pixel Grains

There are quite a few single pixel grains we might want to consider as misindexations and perform the grain reconstruction on the cleaned up data set. This is done as follows

% detect single pixel grains
isMisindexed = grains.grainSize==1;

% set the corresponding EBSD data to notIndexed
ebsd(grains(isMisindexed)) = 'notIndexed';

% redo grain reconstruction
[grains, ebsd.grainId] = calcGrains(ebsd,'alpha',3.2,'angle',10*degree);

% display the result
grains = smooth(grains,5);
plot(ebsd)
hold on
plot(grains.boundary,'linewidth',1.5)
hold off