Autojs实现图片转字符串(简易ocr预备步骤)

应用场景

识别一些背景较单纯、切字符不被扭曲的图片上的数字

作者: 栞栞

步骤

1、首先将图片进行预处理(灰度化、转换色彩空间、二值化)

var gray_img = images.grayscale(img);
var binary_img = images.threshold(gray_img, 120, 255, "BINARY");
var cvt_img = images.cvtColor(binary_img, "GRAY2BGRA");

2、接着将图片中的数字分割出来,由于大部分图片的数字都是从左到右排列,而将图片转化为字符串之后,从上到下操作更为便捷,因此首先先将图片旋转90°。

var  rotate_img = images.rotate(origin_img, 90);

3、图片转字符串

var widthDelta = img.getWidth();
var heightDelta = img.getHeight();
var imgArray = [];
//这里的i为y轴,j为x轴
//将图片转化为0、1放进数组里面
let post_data = {
      re: 0, start: 0, arr: [] };
for (let i = 0; i < heightDelta; i++) {
     
    let count = 0;
    for (let j = 0; j < widthDelta; j++) {
     
        count += img.pixel(j, i) == -1 ? 0 : 1;
    }
    count = count ? 1 : 0;
    if (post_data.re !== count) {
     
        post_data.re = count;
        if (count == 0) {
     
            post_data.arr.push([post_data.start, i]);
            post_data.start = i + 1;
        }
    }
    imgArray.push(count);
}

4、此时imgArray里面都是每个数字的界限,接着便按照界限将字符串切割开来,并进行转字符串的操作

for (let k = 0; k < post_data.arr.length; k++) {
     
    let img_fragment = images.clip(
        cvt_img,
        post_data.arr[k][0],
        0,
        post_data.arr[k][1] - post_data.arr[k][0] + 1,
        img.getHeight()
    );
    let widthDelta_ = img_fragment.getWidth();
    let heightDelta_ = img_fragment.getHeight();
    let img_array = [];
    //这里的i为y轴,j为x轴
    //将图片转化为0、1放进数组里面
    for (let i = 0; i < heightDelta_; i++) {
     
        img_array.push([]);
        for (let j = 0; j < widthDelta_; j++) {
     
            img_array[i].push(img_fragment.pixel(j, i) == -1 ? 0 : 1);
        }
    }
}

原图

处理后的字符串

Autojs实现图片转字符串(简易ocr预备步骤)_第1张图片
Autojs实现图片转字符串(简易ocr预备步骤)_第2张图片Autojs实现图片转字符串(简易ocr预备步骤)_第3张图片Autojs实现图片转字符串(简易ocr预备步骤)_第4张图片

源码

var img = images.read("");
var gray_img = images.grayscale(img);
var binary_img = images.threshold(gray_img, 150, 255, "BINARY");
gray_img.recycle();
var cvt_img = images.cvtColor(binary_img, "GRAY2BGRA");
binary_img.recycle();
var rotate_img = images.rotate(cvt_img, 90);
let widthDelta = rotate_img.getWidth();
let heightDelta = rotate_img.getHeight();
//这里的i为y轴,j为x轴
//将图片转化为0、1放进数组里面
let post_data = {
      re: 0, start: 0, arr: [] };
for (let i = 0; i < heightDelta; i++) {
     
  let count = 0;
  for (let j = 0; j < widthDelta; j++) {
     
    count += rotate_img.pixel(j, i) == -1 ? 0 : 1;
  }
  count = count ? 1 : 0;
  if (post_data.re !== count) {
     
    post_data.re = count;
    if (count == 0) {
     
      post_data.arr.push([post_data.start, i]);
      post_data.start = i + 1;
    }
  }
}
rotate_img.recycle();
for (let k = 0; k < post_data.arr.length; k++) {
     
  let img_fragment = images.clip(
    cvt_img,
    post_data.arr[k][0],
    0,
    post_data.arr[k][1] - post_data.arr[k][0] + 1,
    img.getHeight()
  );
  let widthDelta_ = img_fragment.getWidth();
  let heightDelta_ = img_fragment.getHeight();
  images.save(img_fragment, k + ".png");
  let img_array = [];
  //这里的i为y轴,j为x轴
  //将图片转化为0、1放进数组里面
  for (let i = 0; i < heightDelta_; i++) {
     
    img_array.push([]);
    for (let j = 0; j < widthDelta_; j++) {
     
      img_array[i].push(img_fragment.pixel(j, i) == -1 ? 0 : 1);
    }
  }
  img_fragment.recycle();
  log(img_array);
}
cvt_img.recycle();

bilibili

牙叔教程

微信公众号 牙叔教程

Autojs实现图片转字符串(简易ocr预备步骤)_第5张图片

QQ群

747748653
Autojs实现图片转字符串(简易ocr预备步骤)_第6张图片

你可能感兴趣的:(autojs,autojs,ocr)