How can I extract characters from a binary image when I have its centroid?

I = imread('download5.png');
J = rgb2gray(I);
K = bwareaopen(J,10,8);
h1 = fspecial('gaussian', 3, 1);
h2 = fspecial('average', 2);
g = imfilter(K,h1, 'replicate');
g1 = imfilter(g,h2, 'replicate');
g1 = ~g1;
g1 = bwmorph(g1,'clean');
g1 = bwmorph(g1,'bridge',Inf);
g1 = imdilate(g1, [1 1 1; 1 1 1; 1 1 1]);
[B, L, N, A] = bwboundaries(g1, 'holes');
s = regionprops(L,'all');
imshow(g1)
hold on
for k = 1:length(B)
boundary = B{k};
if k <= N
plot(boundary(:,2), boundary(:,1))
end
end
centroids = cat(1, s.Centroid);
plot(centroids(:,1),centroids(:,2), 'b*')
In the above image, I am getting extra centroids apart from that of the characters. How can I eliminate the unwanted centroids and extract only the characters using centroids? (Extract meaning that I want to save each character separately as an image)

 Accepted Answer

See my Image Segmentation Tutorial http://www.mathworks.com/matlabcentral/fileexchange/?term=authorid%3A31862&sort=downloads_desc It shows you how to find blobs and then crop out the blobs to individual images by asking reginoprops() for the BoundingBox.
As far as removing "unwanted" blobs, you'll have to define what unwanted is. If it's just small ones, then you can use bwareafilt() or bwareaopen().

4 Comments

Many thanks Image Analyst. I totally understood your code and after fine tuning it a bit, I got the output. As for the unwanted blobs, I was able to remove it using bwareaopen() just as you mentioned.
In addition, I have another question. I was able to extract the characters from the text captcha image. However, the edges/boundaries of the characters isn't smooth. You could see from the test image that there are already a few bumps and depressions.
Pardon me for being pedantic but is there any algorithm which would be useful to get the edges/boundaries in a better shape?
I'm not really interested in helping people defeat captchas. Why would I or anyone want to do that?
Neither am I. However, to satiate my curiosity on whether we can smoothen the edges, I want to try it out.
There are a variety of ways to smooth a binary image, such as blurring and thresholding, or calling imclose(), or using sgolayfilt() or other means, such as the attached demo.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!