add image contours

This commit is contained in:
kekee000
2015-03-02 07:53:44 +08:00
parent 6cc50958c3
commit 710b7f590e
7 changed files with 223 additions and 0 deletions

View 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;
}
);

View 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;
}
);