add image contours
This commit is contained in:
70
src/graphics/image/findContours.js
Normal file
70
src/graphics/image/findContours.js
Normal file
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* @file 查找二值图像轮廓
|
||||
* @author mengke01(kekee000@gmail.com)
|
||||
*/
|
||||
|
||||
|
||||
define(
|
||||
function (require) {
|
||||
/**
|
||||
* 查找二值图像轮廓
|
||||
*
|
||||
* @param {Object} imageData 图像二值数据
|
||||
* @return {Array} 轮廓点集合
|
||||
*/
|
||||
function findContours(imageData) {
|
||||
var data = imageData.data;
|
||||
var width = imageData.width;
|
||||
var height = imageData.height;
|
||||
var x;
|
||||
var y;
|
||||
var line;
|
||||
var isInContour = false;
|
||||
var curLineArray = [];
|
||||
var prevLineArray = []; // 记录Y轴有轮廓的起始坐标
|
||||
var startPointArray = []; // 记录起始节点
|
||||
var point;
|
||||
|
||||
// 查找轮廓坐标
|
||||
for (y = 0; y < height; y ++) {
|
||||
line = y * width;
|
||||
isInContour = false;
|
||||
curLineArray = [];
|
||||
for (x = 0; x < width; x++) {
|
||||
if (!isInContour && data[line + x]) {
|
||||
if (!point || (point.x !== x - 1)) {
|
||||
isInContour = true;
|
||||
point = {
|
||||
x: x,
|
||||
y: y,
|
||||
isIn: true
|
||||
};
|
||||
curLineArray.push(point);
|
||||
}
|
||||
}
|
||||
else if (isInContour && !data[line + x]) {
|
||||
if (!point || (point.x !== x - 1)) {
|
||||
isInContour = false;
|
||||
point = {
|
||||
x: x,
|
||||
y: y,
|
||||
isIn: false
|
||||
};
|
||||
curLineArray.push(point);
|
||||
}
|
||||
}
|
||||
|
||||
prevLineArray = curLineArray;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
return pointArray;
|
||||
}
|
||||
|
||||
return findContours;
|
||||
}
|
||||
);
|
||||
63
src/graphics/image/image2Values.js
Normal file
63
src/graphics/image/image2Values.js
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* @file 对图像进行二值化
|
||||
* @author mengke01(kekee000@gmail.com)
|
||||
*/
|
||||
|
||||
|
||||
define(
|
||||
function (require) {
|
||||
/**
|
||||
* 对图像进行二值化
|
||||
*
|
||||
* @param {Object} imageData 原始图像数据,rgba序列
|
||||
* @param {Array} imageData.data 数据数组
|
||||
* @param {number} imageData.width 宽度
|
||||
* @param {number} imageData.height 高度
|
||||
*
|
||||
* @param {number} threshold 截止阈值, 0~255
|
||||
* @param {number} thresholdAlpha 截止alpha通道值0~255
|
||||
*/
|
||||
function image2values(imageData, threshold, thresholdAlpha) {
|
||||
|
||||
threshold = threshold == null ? 200 : threshold;
|
||||
thresholdAlpha = thresholdAlpha == null ? 50 : thresholdAlpha;
|
||||
|
||||
var width = imageData.width;
|
||||
var height = imageData.height;
|
||||
var data = imageData.data;
|
||||
var line;
|
||||
var offset;
|
||||
var newData = [];
|
||||
|
||||
for (var y = 0; y < height; y ++) {
|
||||
line = y * width;
|
||||
for (var x = 0; x < width; x++) {
|
||||
|
||||
offset = (line + x) * 4;
|
||||
if (data[offset + 3] < thresholdAlpha) {
|
||||
newData[line + x] = 0;
|
||||
}
|
||||
else {
|
||||
if (
|
||||
((data[offset + 2] * 29 + data[offset + 1] * 150 + data[offset] * 77 + 128) >> 8)
|
||||
< threshold
|
||||
){
|
||||
newData[line + x] = 1;
|
||||
}
|
||||
else {
|
||||
newData[line + x] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
width: width,
|
||||
height: height,
|
||||
data: newData
|
||||
};
|
||||
}
|
||||
|
||||
return image2values;
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user