Advertisement
stuppid_bot

Untitled

Oct 21st, 2013
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // http://ati.su/img/3515947f83d9212729cb36f8f1b7c5e9ec883fcd.jpeg
  2. // http://ati.su/img/49ce64b5d6a2e3f1a7a34e876cf5946b376748a5.jpeg
  3. var st = new Date().getTime();
  4. var img = document.getElementsByTagName('img')[0];
  5. // для начала представим изображение в виде массива оттенков серого
  6. var data = rgb2l(img);
  7. var hist = histogram(data);
  8. var threshold = otsu(hist, data.length);
  9.  
  10. var canvas = document.createElement('canvas');
  11. canvas.width = img.width;
  12. canvas.height = img.height;
  13. var context = canvas.getContext('2d');
  14. var imageData = context.createImageData(img.width, img.height);
  15. var j = 0;
  16. var value;
  17. for (var i = 0; i < imageData.data.length; i += 4) {
  18.     value = 255 * (data[j++] > threshold);
  19.     imageData.data[i] = value;
  20.     imageData.data[i + 1] = value;
  21.     imageData.data[i + 2] = value;
  22.     imageData.data[i + 3] = 255;
  23. }
  24. context.putImageData(imageData, 0, 0);
  25. open(canvas.toDataURL());
  26.  
  27. var et = new Date().getTime();
  28. console.log(et - st + ' ms');
  29.  
  30. function rgb2l(img) {
  31.     var canvas = document.createElement('canvas');
  32.     canvas.width = img.width;
  33.     canvas.height = img.height;
  34.     var context = canvas.getContext('2d');
  35.     context.drawImage(img, 0, 0, img.width, img.height);
  36.     var imageData = context.getImageData(0, 0, img.width, img.height);
  37.     var data = imageData.data;
  38.     var ret = new Uint8ClampedArray(img.width * img.height);
  39.     var r, g, b;
  40.     var j= 0;
  41.     for (var i = 0; i < data.length; i += 4) {
  42.         r = data[i];
  43.         g = data[i + 1];
  44.         b = data[i + 2];
  45.         ret[j] = Math.round(0.3 * r + 0.59 * g + 0.11 * b);
  46.         ++j;
  47.     }  
  48.     return ret;
  49. }
  50.  
  51. function histogram(data) {
  52.     var ret = new Uint32Array(256);
  53.     for (var i = 0; i < data.length; ++i)
  54.         ++ret[data[i]];
  55.     return ret;
  56. }
  57.  
  58. // http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html
  59. function otsu(histogram, total) {
  60.     var sum = 0;
  61.     for (var i = 1; i < 256; ++i)
  62.         sum += i * histogram[i];
  63.     var sumB = 0;
  64.     var wB = 0;
  65.     var wF = 0;
  66.     var mB;
  67.     var mF;
  68.     var max = 0;
  69.     var between;
  70.     var threshold = 0;
  71.     for (var i = 0; i < 256; ++i) {
  72.         wB += histogram[i];
  73.         if (wB == 0)
  74.             continue;
  75.         wF = total - wB;
  76.         if (wF == 0)
  77.             break;
  78.         sumB += i * histogram[i];
  79.         mB = sumB / wB;
  80.         mF = (sum - sumB) / wF;
  81.         between = wB * wF * Math.pow(mB - mF, 2);
  82.         if (between > max) {
  83.             max = between;
  84.             threshold = i;
  85.         }
  86.     }
  87.     return threshold;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement