Простой текстовый ридер (OCR) в Matlab - PullRequest
3 голосов
/ 06 апреля 2011

Я пытаюсь написать простую программу для чтения изображений в формате bmp в оттенках серого.У меня есть набор шаблонов (весь алфавит, кроме «Я»), и я хочу соответствовать им.У меня проблемы с этим в Matlab.

Что я получил до сих пор:

clear
clc

%set of patterns
BW1 = imread('alphabet.bmp');
patterns = bwlabel(~BW1);
patternStats = regionprops(patterns,'all');

patternNumber = size(patternStats);
imagePatternArray = cell(patternNumber);

%make cell array of pattern vectors
for i = 1:1:patternNumber
  imageMatrix = patternStats(i).Image;
  imageVector = imageMatrix(:);
  imagePatternArray{i} = imageVector;
end  

%set of chars
BW2 = imread('text.bmp');
text = bwlabel(~BW2);
textStats = regionprops(text,'all');

letterNumber = size(textStats);
imageLetterArray = cell(letterNumber);

%make cell array of text vectors
for i = 1:1:letterNumber
  imageMatrix = textStats(i).Image;
  imageVector = imageMatrix(:);
  imageLetterArray{i} = imageVector;
end

%lookup table
charSet =['A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];

Теперь я хотел бы сравнить векторы шаблонов с данным вектором, но они имеют разные размеры.

Как я могу это сделать?Есть ли какая-то специальная функция сравнения?Должен ли я добавить 0 в конец, а затем рассчитать расстояние с помощью pdist?

1 Ответ

4 голосов
/ 07 апреля 2011

Душа

clear
clc

%set of patterns
BW1 = imread('alphabet.bmp');
patterns = bwlabel(~BW1);
patternStats = regionprops(patterns,'all');

patternNumber = size(patternStats);
imagePatternArray = cell(patternNumber);

%make cell array of pattern Matrices
for i = 1:1:patternNumber
  imageMatrix = patternStats(i).Image;
  imageMatrix = imresize(imageMatrix, [25 20]);
  imagePatternArray{i} = imageMatrix;
end  

%set of chars
BW2 = imread('kol_2.bmp');
BW2Gray = rgb2gray(BW2); %convert text to grayscale bmp - 0 OR 1
text = bwlabel(~BW2Gray);
textStats = regionprops(text,'all'); 

letterNumber = size(textStats);
imageLetterArray = cell(letterNumber);

%make cell array of text Matrices
for i = 1:1:letterNumber
  imageMatrix = textStats(i).Image;
  imageMatrix = imresize(imageMatrix, [25 20]);
  imageLetterArray{i} = imageMatrix;
end

%white spaces
whiteSpacesIndexes = [];

for i = 1:letterNumber - 1
  firstLetterBox = textStats(i).BoundingBox;
  positionFirstVector = [firstLetterBox(1), firstLetterBox(2)];  

  secondLetterBox = textStats(i+1).BoundingBox;
  positionSecondVector = [secondLetterBox(1), secondLetterBox(2)];

  distanceVector = positionSecondVector - positionFirstVector;
  distance = norm(distanceVector)
  % if the distance between is bigger that letter width plus 1/3 of width, it is a whitespace
  bothLettersSize = firstLetterBox(3)  + secondLetterBox(3);
  noSpaceDistance =  bothLettersSize - bothLettersSize * 0.25; % - 25 per cent (heuristic value)

  if (distance > noSpaceDistance) %&& (abs(distanceVector(2)) > 1.0)
      whiteSpacesIndexes = [whiteSpacesIndexes, i + 1];
  end 
end

compareVector = size(patternNumber);
indexArray = size(letterNumber);

for i = 1:1:letterNumber
    for j = 1:1:patternNumber        
           correlationMatrix = normxcorr2(imagePatternArray{j},imageLetterArray{i});           
          compareVector(j) = max(abs(correlationMatrix(:)));
    end    
        [correlationMax,correlationIndex] = max(compareVector);
       indexArray(i) = correlationIndex;
end

%lookup table
charSet = ['A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];

%outPut stream
outPut = size(letterNumber);
for i = 1:1:letterNumber
   outPut(i) = charSet(indexArray(i));
end

whiteSpaceNumber = size(whiteSpacesIndexes,2);

whiteSpacesIndexes = whiteSpacesIndexes + (0:numel(whiteSpacesIndexes)-1)
nFinal = numel(outPut)+numel(whiteSpacesIndexes );      %# New length of result with blanks
newstr = blanks(nFinal);                                %# Initialize the result as blanks
newstr(setdiff(1:nFinal,whiteSpacesIndexes )) = outPut

Я довольно простой и у меня есть некоторые недостатки, такие как

  • не читает 'I'
  • читает только горизонтальную полосу текста
  • Обнаружение пробелов должно быть улучшено
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...