Oldrich Svec Oldrich Svec - 2 months ago 20
C# Question

Image analysis - fiber recognition

I am new to image analysis. Do you know how to binarize this image in such a way to get the fibers only?

Fibers in the liquid

I have tried different threshold techniques etc, but I was not successful. I do not mind what tool I should use but I prefer

.NET
or
Matlab
.

PS: I did not know where to put my answer, so I put it at StackOverflow.

Answer

Based on the comments, it seems you are having difficulty translating the proposed Mathematica solutions into MATLAB. Here is my attempt:

@Nakilon solution

%# read image
I = im2double(imread('http://i.stack.imgur.com/6KCd1.jpg'));

%# ImageAdjust[]
II = I;
for k=1:size(II,3)
    mn = min(min( II(:,:,k) )); mx = max(max( II(:,:,k) ));
    II(:,:,k) = ( II(:,:,k) - mn ) ./ (mx-mn);
end

%# Sharpen[]
II = imfilter(II, fspecial('unsharp'));

%# MinDetect[], MaxDetect[]
II = rgb2gray(II);
mn = imextendedmin(II,0.3,8);
mx = imextendedmax(II,0.7,8);

%# pad image because Mathematica handles border cases differently than MATLAB
pad = 30;
q = padarray(mn, [pad pad], 'symmetric', 'both');

q = medfilt2(q, [5 5]*2+1, 'symmetric');                 %# MedianFilter[]
q = ordfilt2(q, 1, ones(2*5+1), 'symmetric');            %# MinFilter[]
q = ordfilt2(q, (25*2+1)^2, ones(25*2+1), 'symmetric');  %# MaxFilter[]
q = ordfilt2(q, 1, ones(20*2+1), 'symmetric');           %# MinFilter[]

%# un-pad image
q = q(pad+1:end-pad, pad+1:end-pad, :);

%# ImageSubtract[], ImageMultiply[], ImageAdd[]
a = imsubtract(mn,q)==1;    %# a = mn; a(q) = false;
b = immultiply(mx,q);       %# b = mx & q;
c = imadd(a,b);             %# c = a | b;

%# show images
figure(1)
subplot(121), imshow(mn)
subplot(122), imshow(mx)
figure(2), imshow(q)
figure(3)
subplot(121), imshow(a)
subplot(122), imshow(b)
figure(4), imshow(c)

Note that there are differences at the edges. In the Mathematica documentation, it vaguely says:

At the edges of an image, MedianFilter/MinFilter/MaxFilter uses smaller neighborhoods.

But there is no direct match for this behavior, instead MATLAB gives you the option to customize the padding at the boundaries of the images.

screenshot1


@belisarius solution

%# read image
I = im2double(imread('http://i.stack.imgur.com/6KCd1.jpg'));

%# LaplacianGaussianFilter[]
II = imfilter( I , fspecial('log', [2 2]*2+1, (2*2+1)/2) );

%# ImageAdjust[]
for k=1:size(II,3)
    mn = min(min( II(:,:,k) )); mx = max(max( II(:,:,k) ));
    II(:,:,k) = ( II(:,:,k) - mn ) ./ (mx-mn);
end

%# Binarize[]
BW = im2bw(II, 0.6);

%# DeleteSmallComponents[]
BW = bwareaopen(BW, 2, 8);

%# show images
figure
subplot(121), imshow(BW)
subplot(122), imshow( imoverlay(I,BW,[0 1 0]) )

screenshot2