Skip to main content

image processing - How to count proportion of two phase in a electron microscope picture


I have a picture:



enter image description here


The sunk area is a phase,and the bulged area in another phase.I want count the proportion of this two area.this is my method.First I get the mask by Image-Tool.


enter image description here


you can download to use it.


enter image description here


gra = GradientFilter[img, 2];
ImageCompose[img, {(comp = WatershedComponents[gra, mask]) //
Colorize[#, ColorRules -> {13 -> Transparent}] &, 0.6}]

enter image description here



Then the result is appear:


ComponentMeasurements[comp, "Count"] // SortBy[#, Last] & // 
Values // {Total[Most[#]], Last[#]} & // #/Total[#] & // N


{0.547061, 0.452939}



But as you see,some unsatisfactory place like this place lead to the result is imprecise.:


enter image description here


BTW,the use of Image-Tool to pick so many component is very unadvisable.Can anybody give a more smart and more precise solution?



Update:


As the @SimonWoods 's request,I process the origional picture by PhotoShop and upload it:


enter image description here



Answer



Here's an idea that could work: The "Ferrite" areas have a border that's slightly darker than the background, while the area in between has a border that's slightly brighter than its neighborhood. So a filter that compares each pixel with the average brightness in the neighborhood, like an LoG filter should be a good start:


img = Import["http://i.stack.imgur.com/dMLH5.png"];    
(log = LaplacianGaussianFilter[img, 2]) // ImageAdjust

enter image description here


In this image, the border around the Fe-Areas is a bit lower than 0, the border around the "background" areas is a bit larger than 0, and the rest is around 0. So we can binarize this image to get the interior border:



filter = SelectComponents[#, "Length", # > 10 &] &;
bin = filter@MorphologicalBinarize[log, {0.05, 0.1}]

enter image description here


(Where I've used SelectComponents to remove some of the "noise" - you can play with additional criteria to get better results.)


And we can do the same thing with the sign flipped to get the "outer" border:


binO = filter@
MorphologicalBinarize[ImageMultiply[log, -1], {0.05, 0.1}]

enter image description here



Now, pixels closer to the outer border are "background" pixels, and pixels closer to the inner border area "ferrite" pixels. So we simply calculate a Distance transform of the two border masks, and take the difference:


dt = DistanceTransform[ColorNegate[bin]];    
dtO = DistanceTransform[ColorNegate[binO]];
(dtDiff = Image[ImageData[dtO] - ImageData[dt]]) // ImageAdjust

enter image description here


And mark pixels with distance difference < 0


HighlightImage[img, Binarize[dtDiff, 0]]

enter image description here



Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....