No products are associated with this question.
For what's it's worth, here is 10 minutes worth of a very simplistic attempt to isolate letters. It obviously misses some of the letters for the reasons I mentioned in my comments above. That could possibly be fixed to get some of the missing ones, at the expense of altering the shapes of the ones it got correctly on the first pass, or maybe you can avoid even that with an even more sophisticated algorithm.
clc; % Clear the command window. close all; % Close all figures (except those of imtool.) imtool close all; % Close all imtool figures. clear; % Erase all existing variables. workspace; % Make sure the workspace panel is showing. fontSize = 20;
% Read in demo image. folder = 'C:\Users\Kash\Documents\Temporary'; baseFileName = 'jlGZw.jpg'; % Get the full filename, with path prepended. fullFileName = fullfile(folder, baseFileName); % Check if file exists. if ~exist(fullFileName, 'file') % File doesn't exist -- didn't find it there. Check the search path for it. fullFileName = baseFileName; % No path this time. if ~exist(fullFileName, 'file') % Still didn't find it. Alert user. errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName); uiwait(warndlg(errorMessage)); return; end end grayImage = imread(fullFileName); % Get the dimensions of the image. % numberOfColorBands should be = 1. [rows columns numberOfColorBands] = size(grayImage) % Display the original gray scale image. subplot(2, 3, 1); imshow(grayImage, ); title('Original Color Image', 'FontSize', fontSize); % Enlarge figure to full screen. set(gcf, 'units','normalized','outerposition',[0 0 1 1]); % Give a name to the title bar. set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')
% Convert to gray scale image and threshold to get binary image. binaryImage = rgb2gray(grayImage) > 100; % Display the image. subplot(2, 3, 2); imshow(binaryImage, ); title('Binary Image', 'FontSize', fontSize);
% Invert it. binaryImage2 = ~binaryImage; % Display the image. subplot(2, 3, 3); imshow(binaryImage2, ); title('Inverted Binary Image', 'FontSize', fontSize);
% Border kill. binaryImage3 = imclearborder(binaryImage2); % Get rid of blobs smaller than 15. binaryImage3 = bwareaopen(binaryImage3, 15); % Display the image. subplot(2, 3, 4); imshow(binaryImage3, ); title('Binary Image', 'FontSize', fontSize);
% Crop to bounding box. verticalProfile = any(binaryImage3, 2); horizontalProfile = any(binaryImage3, 1); x1 = find(horizontalProfile, 1, 'first'); x2 = find(horizontalProfile, 1, 'last'); y1 = find(verticalProfile, 1, 'first'); y2 = find(verticalProfile, 1, 'last'); binaryImage4 = imcrop(binaryImage3, [x1, y1, x2-x1+1, y2-y1+1]); % Display the image. subplot(2, 3, 5); imshow(binaryImage4, ); title('Binary Image', 'FontSize', fontSize);
% Label each blob with 8-connectivity, so we can make measurements of it [labeledImage numberOfBlobs] = bwlabel(binaryImage4, 8); % Apply a variety of pseudo-colors to the regions. coloredLabelsImage = label2rgb (labeledImage, 'hsv', 'k', 'shuffle'); % Display the pseudo-colored image. imshow(coloredLabelsImage); % Get all the blob properties. blobMeasurements = regionprops(labeledImage, 'all'); allAreas = [blobMeasurements.Area] title('Labeled Letters', 'FontSize', fontSize);
Everything in your images appears to be text. English in one patch, something Arabic-like in another patch, and some alphabet I do not recognize in a third patch.
Everything is text is some alphabet.
As Walter says, everything is text. Are you planning to use character recognition on this?
In your case, I'm going to assume you want to do the filtering only on the supplied images.
I would try something like this:
1. Detect blobs of connected pixels.
2. Go through your blob list and discard any that don't meet some required criteria (width, height, width/height ratio, number of pixels).
3. You are left with a list of all blobs that meet your 'goodness' criteria, and you construct an image using the pixels of those blobs.
An easy way to detect blobs is by the Union-Find algorithm: http://en.wikipedia.org/wiki/Disjoint-set_data_structure
There might be a nicer description somewhere else with pretty diagrams... Use Google.
You move through your image and do a Union on the current pixel with:
* the pixel immediately right (x+1, y) * the pixel immediately down (x, y+1) * the pixel immediately down and right (x+1,y+1) * the pixel immediately down and left (x-1, y+1)
I haven't done this for years, and my brain doesn't feel like digging it up right now. But that's somewhere to start.
Well I didn't see any white text whatsoever. Only some black text interior to some white surround. (You could make it white though with inverting, border-clearing, hole-filling, and some other tricks though.) So my output image would be all zero. I think this task, doing OCR on text with very strange fonts, graphics, noise and all kinds of other garbage in the image is beyond kash's abilities or even mine. There are whole OCR companies with dozens of people who have worked on this for decades and even their accuracy would be low for these kinds of images.