Structural Coloration in Biomaterials

3.016 2015

Nanostructures with the same lengthscale as visible light can interact with light via interference

This is the principle behind structural coloration, which is very different from pigment coloration.

Most animals are colored by pigment, but some (especially insects and birds) are colored by structure

The most simple example of structural coloration is a one-dimensional photonic crystal

These don’t exist in nature, but their colors can be quickly calculated with Bragg’s Law:

Because both viewing angle and structure affect color, much of this presentation will restrict the viewing angle to 90 degrees

This considers only the material's back-scattered wavelength:  the color from far away

Dynamic Bragg’s Law Visualization:

functionShowColor[gamma_]:= Graphics@{ColorData["VisibleSpectrum"][gamma],Disk[{0,0}, 1.5]}
braggsShowColor = Manipulate[functionShowColor[2*d*Sin[viewingAngle Degree]//N], {{d, 300, "Layer Distance, nm"}, 100, 700, Appearance->"Labeled", LabelStyle->14}, {{viewingAngle,0, "Viewing Angle, Degrees"}, 0, 90, 1, Appearance->"Labeled", LabelStyle->14}, LabelStyle->14]

More-complicated math is needed to analyze two-dimensional data

Specifically, Fourier Transforms

These transforms decompose input into the sum of many sinusoidal functions

Because sinusoidal functions are periodic, doing this generates information about the input’s periodicity

This can be done with images:

Biomaterials must be have some sort of nano-scale pattern to generate structural color

This project focuses on one particular pattern: the fiber-and-matrix structure of many bird feathers

Here are TEM feather images from a variety of bird species, taken from the study “Fourier Blues: Structural Coloration of Biological Tissues” (Prum and Torres):

			

In these structures, the darker fiber material is collagen and the lighter matrix is a mucopolysaccharide

These structures all have a roughly hexagonal lattice structure, with varying size and noise

Samples can be created by controlling these parameters:

hexagonalVectorsSF[spreadVar_]:= {{spreadVar*RandomReal[{-0.01, 0.01}], spreadVar*RandomReal[{-0.01, 0.01}]}, {.5+spreadVar*RandomReal[{-0.01, 0.01}], Sqrt[3]/2}+spreadVar*RandomReal[{-0.01, 0.01}]}

hexagonalPointsManip[spreadVar_] := Flatten[Table[Table[Tuples[{Range[10], Range[5]*Sqrt[3]}][[c]]+hexagonalVectorsSF[spreadVar][[a]],{c,1,50}], {a, 1, 2}],1];

imVaryManip[sizeFactor_, sizeVar_, spreadVar_] := Graphics@Table[Disk[i, sizeFactor*0.5+sizeVar*RandomReal[{-0.01, 0.01}]]/.i->hexagonalPointsManip[spreadVar][[a]], {a, 1, Length[hexagonalPointsManip[spreadVar]]}]

Manipulate[imVaryManip[sF, sV, spV], {{sF, 1, "Size Factor"}, .1, 1, 0.05}, {{sV, 1,"Size Variation"} , 1, 8, 0.5}, {{spV,1,"Spread Variation"}, 1, 8, 0.5}, LabelStyle->14]

To quantify periodicity, take a Fourier Transform and select components with the greatest magnitude

These samples are isotropic, so a circle can be fitted to the dominant periodicity

pointFourierImage[image_]:=Module[{data, d, fft, maxTable, sortedMaxTable, top4Points, centerPoint, radiusApprox, removeCenter, removeOuter},
data=ImageData[ColorConvert[RemoveAlphaChannel[Image[image, ImageSize->350]],"Grayscale"],"Real"];
centerDiffractionData[matrix_]:=
 Module[
{
columns,rows
},
{columns,rows}= Dimensions[matrix];
RotateRight[matrix,{Round[columns/2],Round[rows/2]}]
];
fft = Fourier[data];
transformData = Abs@centerDiffractionData[fft];
maxTable = Table[{Max[transformData[[i]]], i, Position[transformData[[i]], Max[transformData[[i]]]][[1]][[1]]}, {i, 1, Length[transformData]}];
sortedMaxTable = Sort[maxTable,#1[[1]]>#2[[1]]&];
top4Points = Table[{sortedMaxTable[[i]][[2]], sortedMaxTable[[i]][[3]]}, {i, 2,7}];
centerPoint = Mean@top4Points;
removeCenter = DeleteCases[top4Points, {x_, y_}/; EuclideanDistance[{x,y}, centerPoint]<15 ];
removeOuter= DeleteCases[removeCenter, {x_, y_}/; EuclideanDistance[{x,y}, centerPoint]>50 ];
radiusApprox = Mean@ Table[N@EuclideanDistance[i, centerPoint], {i, removeOuter}];
Show[Image@transformData,ListPlot[{centerPoint}, PlotMarkers->{●}, PlotStyle->Yellow], 
ListPlot[{removeOuter}, PlotMarkers->{●}, PlotStyle->Red], 
Graphics[{Lighter[Red, 0.3], Thick,Dashed, Circle[centerPoint, radiusApprox]}]]]

Image[, ImageSize->350] Image[ pointFourierImage@, ImageSize->350]  
Image[, ImageSize->350] Image[pointFourierImage@, ImageSize->350]

There is more noise for the real TEM image (due to resolution, amoung other things), but the strongest 6 points fit a circle well in both cases

The radius of the dominant periodicity is directly related to the back-scattered wavelength

2*radius*the index of refraction ≅ back-scattered wavelength (Prum and Torres)

This calculation requires a pixels-to-nanometers conversion (1) and the index of refraction (2)
	
1. Pixels-to-nanometers was estimated based off the scale bars, and later fit by minimizing error off of literature values. It was calculated that each square image is, on average, ~1450 nm to a side

nanoMetersConversion[image_] :=Module[{}, 
			dimensionSquareApprox = Mean@ImageDimensions[image];
			nanoMetersPerPixel = N@1450/dimensionSquareApprox]

2. Because black represents collagen and white represents a polysaccharide, the average color of the picture is computed, and index of refraction is interpolated between pure polysaccharide (n = 1.35) and pure collagen (n = 1.55) (Prum and Torres)

refractivityIndex[image_, nWhite_, nBlack_] := Module[{fractionWhite},
				fractionWhite = ImageMeasurements[image, "Mean"];
				nBlack+(nWhite-nBlack)*fractionWhite]

Admittedly making many simplifications, a nanostructure image can be inputed to receive a backscattered color as output

pointFourierMath[image_]:=Module[{data, d, fft, maxTable, sortedMaxTable, top4Points, centerPoint, radiusApprox, removeCenter, removeOuter},
data=ImageData[ColorConvert[RemoveAlphaChannel[Image[image, ImageSize->350]],"Grayscale"],"Real"];
centerDiffractionData[matrix_]:=
 Module[
{
columns,rows
},
{columns,rows}= Dimensions[matrix];
RotateRight[matrix,{Round[columns/2],Round[rows/2]}]
];
fft = Fourier[data];
transformData = Abs@centerDiffractionData[fft];
maxTable = Table[{Max[transformData[[i]]], i, Position[transformData[[i]], Max[transformData[[i]]]][[1]][[1]]}, {i, 1, Length[transformData]}];
sortedMaxTable = Sort[maxTable,#1[[1]]>#2[[1]]&];
top4Points = Table[{sortedMaxTable[[i]][[2]], sortedMaxTable[[i]][[3]]}, {i, 2,7}];
centerPoint = Mean@top4Points;
removeCenter = DeleteCases[top4Points, {x_, y_}/; EuclideanDistance[{x,y}, centerPoint]<15 ];
removeOuter= DeleteCases[removeCenter, {x_, y_}/; EuclideanDistance[{x,y}, centerPoint]>50 ];
radiusApprox = Mean@ Table[N@EuclideanDistance[i, centerPoint], {i, removeOuter}];

nanoConversion = nanoMetersConversion[image];
indexOfRefract =refractivityIndex[image, 1.35, 1.55];

visibleWavelength = Mean@(radiusApprox*nanoConversion*(2*indexOfRefract)); functionShowColor[visibleWavelength]]

{Image[, ImageSize->150], Image [Image[ pointFourierMath@, ImageSize->150]  , ImageSize->150]}
{Image[, ImageSize->150], Image[Image[pointFourierMath@, ImageSize->150], ImageSize->150]}

This code can be compared to other results from both literature and nature

These results are taken from the study by Prum and Torres, with results from my code overlayed on top in purple

Wavelength makes more sense when represented as a color; this graph shows the same data using Mathematica’s “VisibleSpectrum” option

These results can also be compared to the actual bird species from which the TEM feather images were taken

Now that the code has been verified, it can be used to analyze general trends in these materials

I want to study the effect of manipulating the defining characteristics of the material individually

The most obvious characteristics are size- the absolute size of the fibers and their size relative to the matrix around them

To study this, I analyzed 25 images, representing the full range of size variability my model could make. The results are plotted below:

This graph shows a number of trends:
	1. As relative fiber size increases, the back-scattered wavelength increases
	2. As the actual fiber size increases, the back-scattered wavelength decreases
	3. It is possible to get the same color with significantly different structures
	4. Absolute size has a much stronger effect than relative size (at least in this model)

This model also showed that certain factors are allowed to vary without affecting the material’s color

Though structural color is very sensitive to certain changes, it is quite resilient to others.

Here, I adjust the amount of noise in the system, with respect to fiber placement and size:

This graph shows a range from a perfect lattice to one in which fibers are beginning to merge, yet there is no perceptable difference in color.

Here, fiber size varies between completely uniform and quite disordered, with no noticeable change in color or pattern

There is a definable relationship between fiber size and wavelength, implying that it can be used in reverse

Scientists have made structurally colored paint by incorporating tiny plastic spheres into a liquid matrix

A handful of assumptions can be used to calculate sphere size for any desired color

I have calculated everything I need except a way of measuring fiber radius in nm:

fiberDimension[image_]:= Module[{edgeLength, totalBlack, fiberRadius, fiberRadNm},
edgeLength = Mean@ImageDimensions@image//N;
totalBlack = 0.29519444592853794`*edgeLength^2;
fiberRadius = Sqrt[(totalBlack/240)/Pi];
fiberRadNm = fiberRadius*1445/150]

I only manipulating the size of the actual fibers (this is the most important value), with all other parameters given a middle value

This relationship follows a neat trend, and can be used to create an interpolating function

wavelengthFiberPairs = {{661.223698787632`,28.877710260854496`},{584.3361524284069`,32.68994923918512`},{522.0138502020212`,36.597494191974015`},{472.9117303634874`,40.40973317030464`},{431.23734305401894`,44.31727812309354`},{397.13574437476774`,48.129517101424156`}};

outputFiberSize = Interpolation[wavelengthFiberPairs];

Manipulate[ Show[functionShowColor[gamma1], Graphics[Text[Style[outputFiberSize[gamma1], {White,30}]]]],{{gamma1, 500, "Desired Color, nm"},400, 660, Appearance->"Labeled", LabelStyle->14}, LabelStyle->14]

This function allows a scientist to select a desired color and then calculates the radius of microspheres to make a colored film

It assumes the same materials as the feathers, but different indexes of refractivity could be inputed for different fiber and matrix materials

Works Cited

Papers and Books :
  
Excursions in Harmonic Analysis, Volume 2, Applied and Numerical Harmonic Analysis.Vol.2. New York : Springer, 2013.
  
Seago, Ainsley E., Parrish Brady, Jean - Pol Vigneron, and Tom D.Schultz."Gold Bugs and beyond : A Review of Iridescence and Structural Colour Mechanisms in Beetles (Coleoptera)." Journal of the Royal Society Interface 6, no.Suppl 2 (April 6, 2009) : S165–84. doi : 10.1098/rsif .2008 .0354.focus.

Vignolini, Silvia, Edwige Moyroud, Thomas Hingant, Hannah Banks, Paula J.Rudall, Ullrich Steiner, and Beverley J.Glover."The Flower of Hibiscus Trionum Is Both Visibly and Measurably Iridescent." The New Phytologist 205, no.1 (January 2015) : 97–101. doi : 10.1111/nph .12958.

Vogelmann, Thomas C."Plant Tissue Optics." Annual Review of Plant Physiology and Plant Molecular Biology 44, no.1 (1993) : 231–51. doi : 10.1146/annurev.pp .44 .060193 .001311.