OCR(opencv vs tesseract)

opencv:
For object detection, you're just trying to figure out whether the object is in the frame, and approximately where it's located. The OpenCv features framework is great for this


tesseract:
If your documents have a fixed structured (consistent layout of text fields) then tesseract-ocr is all you need.


I found tesseract easy to use for font based OCR while OpenCV is good for recognizing hand writing.

The following steps worked well with me:

1.Obtain grayscale of image.
2.Perform canny edge detection on grayscale image.
3.Apply gaussian blur on grayscale image(store in seperate matrix)
4.Input matrices from steps 2 & 3 into SWT algorithm
5.Binarize(threshhold) resulting image.
6.Feed image to tesseract.
Please note, for step 4 you will need to build the c++ library in the link and then import into your android project with JNI wrappers. Also, you will need to do micro tweaking for all steps to get the best results. But, this should at least get you started.

some discuss about opencv vs tesseract on ocr
[url]http://stackoverflow.com/questions/11489824/how-do-i-choose-between-tesseract-and-opencv[/url]

image processing to improve tesseract OCR accuracy
1.fix DPI (if needed) 300 DPI is minimum
2.fix text size (e.g. 12 pt should be ok)
3.try to fix text lines (deskew and dewarp text)
4.try to fix illumination of image (e.g. no dark part of image
5.binarize and de-noise image

and some advice
Three points to improve the readability of the image: 1)Resize the image with variable height and width(multiply 0.5 and 1 and 2 with image height and width). 2)Convert the image to Gray scale format(Black and white). 3)Remove the noise pixels and make more clear(Filter the image).

//Resize
public Bitmap Resize(Bitmap bmp, int newWidth, int newHeight)
{

Bitmap temp = (Bitmap)bmp;

Bitmap bmap = new Bitmap(newWidth, newHeight, temp.PixelFormat);

double nWidthFactor = (double)temp.Width / (double)newWidth;
double nHeightFactor = (double)temp.Height / (double)newHeight;

double fx, fy, nx, ny;
int cx, cy, fr_x, fr_y;
Color color1 = new Color();
Color color2 = new Color();
Color color3 = new Color();
Color color4 = new Color();
byte nRed, nGreen, nBlue;

byte bp1, bp2;

for (int x = 0; x < bmap.Width; ++x)
{
for (int y = 0; y < bmap.Height; ++y)
{

fr_x = (int)Math.Floor(x * nWidthFactor);
fr_y = (int)Math.Floor(y * nHeightFactor);
cx = fr_x + 1;
if (cx >= temp.Width) cx = fr_x;
cy = fr_y + 1;
if (cy >= temp.Height) cy = fr_y;
fx = x * nWidthFactor - fr_x;
fy = y * nHeightFactor - fr_y;
nx = 1.0 - fx;
ny = 1.0 - fy;

color1 = temp.GetPixel(fr_x, fr_y);
color2 = temp.GetPixel(cx, fr_y);
color3 = temp.GetPixel(fr_x, cy);
color4 = temp.GetPixel(cx, cy);

// Blue
bp1 = (byte)(nx * color1.B + fx * color2.B);

bp2 = (byte)(nx * color3.B + fx * color4.B);

nBlue = (byte)(ny * (double)(bp1) + fy * (double)(bp2));

// Green
bp1 = (byte)(nx * color1.G + fx * color2.G);

bp2 = (byte)(nx * color3.G + fx * color4.G);

nGreen = (byte)(ny * (double)(bp1) + fy * (double)(bp2));

// Red
bp1 = (byte)(nx * color1.R + fx * color2.R);

bp2 = (byte)(nx * color3.R + fx * color4.R);

nRed = (byte)(ny * (double)(bp1) + fy * (double)(bp2));

bmap.SetPixel(x, y, System.Drawing.Color.FromArgb
(255, nRed, nGreen, nBlue));
}
}


bmap = SetGrayscale(bmap);
bmap = RemoveNoise(bmap);

return bmap;

}



//SetGrayscale
public Bitmap SetGrayscale(Bitmap img)
{

Bitmap temp = (Bitmap)img;
Bitmap bmap = (Bitmap)temp.Clone();
Color c;
for (int i = 0; i < bmap.Width; i++)
{
for (int j = 0; j < bmap.Height; j++)
{
c = bmap.GetPixel(i, j);
byte gray = (byte)(.299 * c.R + .587 * c.G + .114 * c.B);

bmap.SetPixel(i, j, Color.FromArgb(gray, gray, gray));
}
}
return (Bitmap)bmap.Clone();

}

//RemoveNoise
 public Bitmap RemoveNoise(Bitmap bmap)
{

for (var x = 0; x < bmap.Width; x++)
{
for (var y = 0; y < bmap.Height; y++)
{
var pixel = bmap.GetPixel(x, y);
if (pixel.R < 162 && pixel.G < 162 && pixel.B < 162)
bmap.SetPixel(x, y, Color.Black);
}
}

for (var x = 0; x < bmap.Width; x++)
{
for (var y = 0; y < bmap.Height; y++)
{
var pixel = bmap.GetPixel(x, y);
if (pixel.R > 162 && pixel.G > 162 && pixel.B > 162)
bmap.SetPixel(x, y, Color.White);
}
}

return bmap;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值