Remove the non-digit from mser regions.

7 views (last 30 days)
I need to remove the non-digit regions(I need only the meter reading). I got a code that is similar to it, but that's for non-text removal(I attached code here). Anybody, please help me.
% Threshold the data to determine which regions to remove. These thresholds
% may need to be tuned for other images.
filterIdx = aspectRatio' > 3;
filterIdx = filterIdx | [mserStats.Eccentricity] > .995 ;
filterIdx = filterIdx | [mserStats.Solidity] < .3;
filterIdx = filterIdx | [mserStats.Extent] < 0.2 | [mserStats.Extent] > 0.9;
filterIdx = filterIdx | [mserStats.EulerNumber] < -4;
% Remove regions
mserStats(filterIdx) = [];
mserRegions(filterIdx) = [];
  1 Comment
Silpa K
Silpa K on 10 Mar 2020
I got this my the following site. I need to extract the digit features same as the above.
Hope your help.
thank you.

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 10 Mar 2020
No need to complicate things with MSER when a simple cropping will do. Simply find the bright panel, and go in a known percentage to crop away the stuff you don't want (everything except the 7 digit number). Trivial. Here's a full demo.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 15;
folder = pwd;
baseFileName = '64.jpg';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
% Read in the image from disk. If storedColorMap is not empty, it's an indexed image with a stored colormap.
[grayImage, storedColorMap] = imread(fullFileName);
if ~isempty(storedColorMap)
grayImage = ind2rgb(grayImage, storedColorMap);
% Get the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(grayImage);
if numberOfColorChannels > 1
% It's not really gray scale like we expected - it's color.
% Use weighted sum of ALL channels to create a gray scale image.
grayImage = rgb2gray(grayImage);
% ALTERNATE METHOD: Convert it to gray scale by taking only the green channel,
% which in a typical snapshot will be the least noisy channel.
% grayImage = grayImage(:, :, 2); % Take green channel.
% Display the image.
hFig = figure;
subplot(2, 3, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize, 'Interpreter', 'None');
hFig.WindowState = 'maximized'; % May not work in earlier versions of MATLAB.
% Display the histogram
subplot(2, 3, 2);
grid on;
% Binarize the image
binaryImage = imbinarize(grayImage);
% Display the image.
subplot(2, 3, 3);
imshow(binaryImage, []);
title('Initial Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
% Fill holes.
binaryImage = imfill(binaryImage, 'holes');
% Extract the largest blob only.
binaryImage = bwareafilt(binaryImage, 1);
% Display the image.
subplot(2, 3, 4);
imshow(binaryImage, []);
title('Filled Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
hp = impixelinfo();
% Get the bounding box
props = regionprops(binaryImage, 'BoundingBox');
% Crop the image
croppedImage = imcrop(grayImage, props.BoundingBox);
% Plot them over the inverted gray scale image.
subplot(2, 3, 5);
imshow(croppedImage, []);
caption = sprintf('Cropped Image');
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
% Now crop away the stuff that is not the 7 digit number we want.
pctH1 = 18;
pctH2 = 86;
pctV1 = 10;
pctV2 = 62;
% Get the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(croppedImage)
row1 = round(pctV1 * rows / 100)
row2 = round(pctV2 * rows / 100)
col1 = round(pctH1 * columns / 100)
col2 = round(pctH2 * columns / 100)
finalImage = croppedImage(row1:row2, col1:col2);
% Plot them over the inverted gray scale image.
subplot(2, 3, 6);
imshow(finalImage, []);
axis('on', 'image');
caption = sprintf('Final Image');
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
hold on;
If the panel may be rotated, you can scan the image to find the top of the panel in the binary image then use ransac, fitPolynomialRANSAC(), to find the top edge and its angle, then use imrotate() to rotate it level.
  1 Comment
Silpa K
Silpa K on 11 Mar 2020
Edited: Silpa K on 11 Mar 2020
Thank you sir.
How can I view the digits in a dialog box or store in a variable like:

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!