应用场景
识别一些背景较单纯、切字符不被扭曲的图片上的数字
作者: 栞栞
步骤
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);
}
}
}
原图
处理后的字符串
源码
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
微信公众号 牙叔教程
QQ群
747748653