Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function getGrayScale(img) {
- var cnv = document.createElement('canvas');
- var ctx = cnv.getContext('2d');
- ctx.drawImage(img, 0, 0);
- var data = ctx.getImageData(0, 0, img.width, img.height).data;
- var color;
- var i = 0;
- var length = data.length;
- var red;
- var green;
- var blue;
- // var alpha;
- var grayScale;
- var out = new Array(img.height);
- var index = -1;
- out.depth = img.width;
- while (i < length) {
- red = data[i];
- green = data[i + 1];
- blue = data[i + 2];
- // alpha = data[i + 3];
- grayScale = Math.round(0.3 * red + 0.59 * green + 0.11 * blue);
- out[++index] = grayScale;
- i += 4;
- }
- return out;
- }
- function getHistogram(data) {
- var out = Array.apply(null, new Array(256)).map(Number.prototype.valueOf, 0);
- for (var i = 0; i < data.length; ++i)
- ++out[data[i]];
- return out;
- }
- // http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html
- function otsuThreshold(histogram, total) {
- // вычислим контрольную сумму
- var sum = 0;
- for (var i = 1; i < histogram.length; ++i)
- sum += i * histogram[i];
- var sumB = 0;
- var wB = 0;
- var wF = 0;
- var max = 0;
- var mB;
- var mF;
- var mid;
- var out = 0;
- for (var i = 1; i < histogram.length; ++i) {
- wB += histogram[i];
- wF = total - wB;
- if (!wF)
- break;
- sumB += i * histogram[i];
- mB = sumB / wB;
- mF = (sum - sumB) / wF;
- mid = wB * wF * Math.pow(mB - mF, 2);
- if (mid > max) {
- max = mid;
- out = i;
- }
- }
- return out;
- }
- // http://ati.su/img/3515947f83d9212729cb36f8f1b7c5e9ec883fcd.jpeg
- // http://ati.su/img/49ce64b5d6a2e3f1a7a34e876cf5946b376748a5.jpeg
- var img = document.getElementsByTagName('img')[0];
- // для начала представим изображение в виде массива оттенков серого
- var arr = getGrayScale(img);
- // вычислим частоту с которой встречается каждый цвет
- var histogram = getHistogram(arr);
- var threshold = otsuThreshold(histogram, arr.length);
- for (var i = 0; i < arr.length; ++i) {
- arr[i] = 1 * (arr[i] < threshold);
- }
- var i = 0;
- while (i < arr.length) {
- console.log(arr.slice(i, i + arr.depth).join(''));
- i += arr.depth;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement