From 710b7f590ebdd2d49cb4c2958dc95fcc057efdbd Mon Sep 17 00:00:00 2001 From: kekee000 Date: Mon, 2 Mar 2015 07:53:44 +0800 Subject: [PATCH] add image contours --- demo/canvasImage.html | 30 +++++++++++++ demo/js/canvasImage.js | 60 +++++++++++++++++++++++++ src/graphics/image/findContours.js | 70 +++++++++++++++++++++++++++++ src/graphics/image/image2Values.js | 63 ++++++++++++++++++++++++++ test/add.gif | Bin 0 -> 3617 bytes test/add.jpg | Bin 0 -> 13431 bytes test/question.png | Bin 0 -> 19034 bytes 7 files changed, 223 insertions(+) create mode 100644 demo/canvasImage.html create mode 100644 demo/js/canvasImage.js create mode 100644 src/graphics/image/findContours.js create mode 100644 src/graphics/image/image2Values.js create mode 100644 test/add.gif create mode 100644 test/add.jpg create mode 100644 test/question.png diff --git a/demo/canvasImage.html b/demo/canvasImage.html new file mode 100644 index 0000000..cf39c77 --- /dev/null +++ b/demo/canvasImage.html @@ -0,0 +1,30 @@ + + + + + canvas读取图片 + + + + + + + + + + + diff --git a/demo/js/canvasImage.js b/demo/js/canvasImage.js new file mode 100644 index 0000000..999dc82 --- /dev/null +++ b/demo/js/canvasImage.js @@ -0,0 +1,60 @@ +/** + * @file canvas读取图片 + * @author mengke01(kekee000@gmail.com) + */ + +define( + function (require) { + + var image2Values = require('graphics/image/image2Values'); + var findContours = require('graphics/image/findContours'); + + var entry = { + + /** + * 初始化 + */ + init: function () { + + var context =document.getElementById("canvas").getContext("2d"); + var cvsH = context.height; + var cvsW = context.width; + + var img = new Image(); + img.src = "../test/add.gif"; + var width; + var height; + img.onload = function (){ + width = img.width; + height = img.height; + context.drawImage(img, 0, 0); + var imgData = context.getImageData(0, 0, width, height); + var result = image2Values(imgData); + //var pointArray = findContours(result); + + context.clearRect(0, 0, width, height); + var putData = imgData.data; + var data = result.data; + for (var y = 0; y < height; y ++) { + for (var x = 0; x < width; x++) { + var offset = y * height + x; + if (data[offset]) { + putData[offset * 4] = 255; + putData[offset * 4 + 1] = 255; + putData[offset * 4 + 2] = 0; + putData[offset * 4 + 3] = 255; + } + } + } + context.putImageData(imgData, 0, 0); + + console.log(result.length); + }; + } + }; + + entry.init(); + + return entry; + } +); diff --git a/src/graphics/image/findContours.js b/src/graphics/image/findContours.js new file mode 100644 index 0000000..928b6a4 --- /dev/null +++ b/src/graphics/image/findContours.js @@ -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; + } +); diff --git a/src/graphics/image/image2Values.js b/src/graphics/image/image2Values.js new file mode 100644 index 0000000..f7ab2a7 --- /dev/null +++ b/src/graphics/image/image2Values.js @@ -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; + } +); diff --git a/test/add.gif b/test/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9a4f6f54ea11db5ab55ac357dcdcd0495cc6571 GIT binary patch literal 3617 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 literal 0 HcmV?d00001 diff --git a/test/add.jpg b/test/add.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce67eeb97714421599f3fda27ec1d6c801887fc1 GIT binary patch literal 13431 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 F^IsFxzy|;T literal 0 HcmV?d00001 diff --git a/test/question.png b/test/question.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5a08e18e5f122469524bf098007a972524d875 GIT binary patch literal 19034 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 literal 0 HcmV?d00001