Este exemplo motra como encontrar regiões de texto em imagens. Isto pode ser usado para:

  • Etapa anterior a segmentação e reconhecimento de caracteres em soluções de OCR.
  • Melhorar acurácia no uso de módulos terceiros de OCR. Testes demonstraram que soluções usando módulos de OCR como Tesseract podem melhorar a acurácia submetendo apenas regiões de imagens com texto.
  • Melhorar desempenho de soluções de OCR reduzindo a quantidade de pixels processados.


O algorítmo provido por Marvin busca regiões com uma frequência específica de variação de contraste no eixo horizontal. Segmentos de linhas horizontais com tal padrão são agrupadas para determinar regiões de texto. Em alguns casos, falsos positivos são detectados, mas que podem ser removidos numa etapa futura, analisando as características da região em questão.

import marvin.MarvinPluginCollection.*;

public static List<MarvinSegment> findTextRegions
(
   MarvinImage imageIn, //input image
   int maxWhiteSpace, //max white pattern width
   int maxFontLineWidth, //max black pattern width
   int minTextWidth, //min text width
   int grayScaleThreshold //gray scale image threshold for fiding pattern
)


Output Images:

Original Images:
passport.png road_sign2.jpg

Source:
package textRegions;

import java.awt.Color;
import java.util.List;

import marvin.image.MarvinImage;
import marvin.image.MarvinSegment;
import marvin.io.MarvinImageIO;

import static marvin.MarvinPluginCollection.*;

public class TextRegions{

	public TextRegions(){
		MarvinImage image = MarvinImageIO.loadImage("./res/passport.png");
		image = findText(image, 15, 8, 30, 150);
		MarvinImageIO.saveImage(image, "./res/passport_out.png");
		
		image = MarvinImageIO.loadImage("./res/road_sign2.jpg");
		image = findText(image, 10, 20, 70, 200);
		MarvinImageIO.saveImage(image, "./res/road_sign2_out.png");
	}
	
	public MarvinImage findText(MarvinImage image, int maxWhiteSpace, int maxFontLineWidth, int minTextWidth, int grayScaleThreshold){
		List<MarvinSegment> segments = findTextRegions(image, maxWhiteSpace, maxFontLineWidth, minTextWidth, grayScaleThreshold);
		
		for(MarvinSegment s:segments){
			if(s.height >= 5){
				s.y1-=5;
				s.y2+=5;
				image.drawRect(s.x1, s.y1, s.x2-s.x1, s.y2-s.y1, Color.red);
				image.drawRect(s.x1+1, s.y1+1, (s.x2-s.x1)-2, (s.y2-s.y1)-2, Color.red);
			}
		}
		return image;
	}
	
	public static void main(String[] args) {
		new TextRegions();
	}
}