How can I Segment this image efficiently
Show older comments
So I've been trying everything in order to get an automated system where the leaf is left by itself, but nothing has met to my specifications. How can I segment an image with the entire leaf part being left over? heres an example image:
2 Comments
Walter Roberson
on 14 Dec 2015
I am pretty sure that we do not know what your specifications are. For example it gets a bit confusing about which parts of the stem on the right are parts of the foreground leaf and which are parts of a different leaf and we do not know what you want to do about that. Ah, the straight portion near the lower right edge is a bit of a torn part of the leaf so the leaf continues right down to the tube. But is that part of your specifications... we surely do not know.
Daniel Allkenmach
on 19 Dec 2015
Edited: Walter Roberson
on 19 Dec 2015
Accepted Answer
More Answers (2)
Image Analyst
on 19 Dec 2015
0 votes
I have done leaves so many times before for people. Surely you can find some of my code and adapt it to your images. See http://www.mathworks.com/matlabcentral/answers/?term=tag%3A%22leaf%22
Or else look for more general color segmentation routines in my File Exchange: http://www.mathworks.com/matlabcentral/fileexchange/?term=authorid%3A31862
6 Comments
Daniel Allkenmach
on 19 Dec 2015
Image Analyst
on 19 Dec 2015
I've run them many times with no error. Where did you get the error, and what was it? Dan, you gotta help me out here. Did you get an error on the original demo, downloaded and run as-is with no alterations whatsoever by you? Or did you change the image to your image? Or did you make additional alterations? Please tell me, and then also copy and paste all the red error text back here and attach your m-file and image.
Daniel Allkenmach
on 19 Dec 2015
Image Analyst
on 19 Dec 2015
Edited: Image Analyst
on 19 Dec 2015
I uploaded it a long time ago. A lot has changed with R2014b and I haven't tested it again since then. It looks like the new MATLAB version doesn't like something about how I used stem() to put vertical lines on the histogram. I'll fix it and upload it again. Stay tuned...
Image Analyst
on 19 Dec 2015
I've uploaded a new version that uses line() instead of stem() because for some reason MATLAB release R2015b did not like how I used stem even though release R2014, that I originally developed the code with, was perfectly happy with the way I used stem().
Sorry about that, but sometimes new releases of MATLAB can break old versions of code that worked perfectly fine in the older MATLAB release.
Thanks for letting me know and please download and try the new version and let me know if it works now. Make sure your version has line() and not stem() in the function called PlaceThresholdBars().
Image Analyst
on 19 Dec 2015
Be sure to also try out the color thresholder app on the App tab of the toolbar ribbon.
harjeet singh
on 22 Dec 2015
hello dear use this code for extraction

clear all
close all
clc
img=imread('leaf.jpg');
figure(1)
imshow(img)
drawnow
img=double(img);
img_1=(img(:,:,2)-img(:,:,1)>1 & img(:,:,2)-img(:,:,1)<40 & img(:,:,3)<90);
img_1=imfill(img_1,'holes');
figure(2)
imshow(img_1)
drawnow
[lab,num]=bwlabel(img_1);
for i=1:num
[r,c]=find(lab==i);
a(i,:)=[i length(r)];
end
a=sortrows(a,2);
roi=lab==a(end,1);
img_3(:,:,1)=img(:,:,1) .* double(roi);
img_3(:,:,2)=img(:,:,2) .* double(roi);
img_3(:,:,3)=img(:,:,3) .* double(roi);
img_3=uint8(img_3);
figure(3)
imshow(img_3)
drawnow
3 Comments
Daniel Allkenmach
on 27 Dec 2015
Image Analyst
on 27 Dec 2015
The for loop and the "a" variable and all that stuff about labeling is unnecessary. It could be done more simply like this:
rgbImage=imread('8.jpg');
subplot(2,2,1);
imshow(rgbImage)
% Threshold
img_1=(rgbImage(:,:,2)-rgbImage(:,:,1)>1 & rgbImage(:,:,2)-rgbImage(:,:,1)<40 & rgbImage(:,:,3)<90);
% Fill holes.
img_1=imfill(img_1,'holes');
% Extract biggest blob.
img_1 = bwareafilt(img_1, 1);
subplot(2,2,2);
imshow(img_1)
% Mask the image using bsxfun() function
maskedRgbImage = bsxfun(@times, rgbImage, cast(img_1, 'like', rgbImage));
subplot(2,2,3);
imshow(maskedRgbImage)
This is better but this is not very robust. Later I'll post a more robust method using thresholding in HSV color space.
harjeet singh
on 28 Dec 2015
thanks @image analyst
Categories
Find more on Agriculture in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



