【问题标题】:How do you convert an image (PNG) to a 2D Array (binary image)?如何将图像 (PNG) 转换为 2D 数组(二进制图像)?
【发布时间】:2016-02-09 21:03:37
【问题描述】:

我需要以下 PNG 图像的 2D 二进制表示:

谁能提供将上面的 PNG 图像转换为 1 = 陆地和 0 = 水的二维数组的方法或来源?

通过阅读,我找到了一种在使用在线 Base64ImageEncoder 将图像转换为 base64 后循环遍历图像中所有像素的方法。

使用下面的fiddle 我可以判断像素是 water 还是 land 然后改变像素颜色,所以输出是:

我觉得我非常接近获得我所需要的东西。我需要做些什么来更改主 for-loop 以将数据保存在 Matrix 中?

JavaScript:

$(document).ready(function() {
    $("#btnSubmit").click(function(){
        GetBinary();
    }); 
});

function GetBinary() {
    var canvas = document.createElement("canvas");
    canvas.width = imgElement.offsetWidth;
    canvas.height = imgElement.offsetHeight;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(imgElement,0,0);

    var map = ctx.getImageData(0,0,canvas.width,canvas.height);
    var imdata = map.data;

    var r,g,b;
    for(var p = 0, len = imdata.length; p < len; p+=4) {
        r = imdata[p]
        g = imdata[p+1];
        b = imdata[p+2];

        if ((r >= 164 && r <= 255) && (g >= 191 && g <= 229) && (b >= 220 && b <= 255)) {

            // black  = water
             imdata[p] = 0;
             imdata[p+1] = 0;
             imdata[p+2] = 0;

        } else {

            // white = land
             imdata[p] = 255;
             imdata[p+1] = 255;
             imdata[p+2] = 255;                     
        }                   
    }
    ctx.putImageData(map,0,0);
    imgElement.src = canvas.toDataURL();
}               

请注意,我使用的是 base64 图像,因此我们不允许在此处粘贴,因为它太长了。请改用my fiddle

HTML:

<img id='myImage' src='base64 image data' />
<br />
<input id = "btnSubmit" type="button" value="Get Binary Image"/>

【问题讨论】:

  • 要理解问题,您不确定新行(内部数组)从哪里开始?应该是pixelWidth /4
  • @JuanMendes:嗯,为什么是 4?
  • 因为看起来你有四个数字定义一个像素?

标签: javascript google-maps binary-data


【解决方案1】:

如果您想以 2D 数组的形式访问单个像素,这里是相关部分

var w = canvas.width * 4;
var r,g,b;

for (var i=0; i<canvas.width * 4; i+=4) {
  for (var j=0; j<canvas.height; j+=1) {
        //console.log(j*w+i, j*w+i+1, j*w+i+2, j*w+i+3);
    r = imdata[j*w+i]
            g = imdata[j*w+i+1];
            b = imdata[j*w+i+2];

    if ((r >= 164 && r <= 255) && 
        (g >= 191 && g <= 229) && 
        (b >= 220 && b <= 255)) {

      // blue  = water
      imdata[j*w+i] = 0;
      imdata[j*w+i+1] = 0;
      imdata[j*w+i+2] = 150;

    } else {

      // green = land
      imdata[j*w+i] = 0;
      imdata[j*w+i+1] = 120;
      imdata[j*w+i+2] = 0;                      
    }                   
  }
}

【讨论】:

    【解决方案2】:

    看起来图像数据返回单个 rgba 组件数组,您只需将其分解为行。见http://jsfiddle.net/mendesjuan/wjn0dub7/1/

    var currentInnerArray;
    var zeroesAndOnes = [];
    for(var p = 0, len = imdata.length; p < len; p+=4) {
        r = imdata[p]
        g = imdata[p+1];
        b = imdata[p+2];
    
        // Each line is the pixel width * 4, (rgba), start a newline
        if (p % imdata.width * 4 === 0) {
          currentInnerArray = [];
          zeroesAndOnes.push(currentInnerArray);
        }
        if ((r >= 164 && r <= 255) && (g >= 191 && g <= 229) && (b >= 220 && b <= 255)) {
          currentInnerArray.push(0);
          // black  = water
          imdata[p] = 0;
          imdata[p+1] = 0;
          imdata[p+2] = 0;
    
       } else {
         currentInnerArray.push(1);
         // white = land
         imdata[p] = 255;
         imdata[p+1] = 255;
         imdata[p+2] = 255;
         }                  
    }
    // zeroesAndOnes has your 2d array
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2014-11-12
      • 1970-01-01
      相关资源
      最近更新 更多