【问题标题】:Find all possible combinations of binary m by n matrix查找二进制 m × n 矩阵的所有可能组合
【发布时间】:2016-04-23 08:27:36
【问题描述】:

我想创建尺寸为 m x n 的图像。我需要创建所有可能的图像,其像素为黑色或白色(目前没有其他颜色)。解决此问题的一种方法是创建字段为 0 或 1 的二进制矩阵,表示黑色和白色。矩阵中的每一行是一个图像,每个字段是图像中的一个像素。

我目前有代码来创建一个 m x n 图像,并为每个像素分配颜色:

var fs = require("fs");
var Buffer = require("buffer").Buffer;
var Png = require("png").Png;

var IMAGE_WIDTH = 16;
var IMAGE_HEIGHT = 16;

var rgb_data = new Buffer(IMAGE_WIDTH * IMAGE_HEIGHT * 3);

for(var h = 0; h < IMAGE_HEIGHT; h++)
{
  for(var w = 0; w < IMAGE_WIDTH; w++)
  {
    var p = h * IMAGE_WIDTH * 3 + w * 3;

    rgb_data[p + 0] = 255; // r (0-255)
    rgb_data[p + 1] = 255; // g (0-255)
    rgb_data[p + 2] = 255; // b (0-255)
  }
}

var png = new Png(rgb_data, IMAGE_WIDTH, IMAGE_HEIGHT, "rgb")

fs.writeFile("output.png", png.encodeSync().toString("binary"), "binary", function(err) {
  if(err) { throw err; }
  console.log('image generated!');
});

例如,这会生成一个全白的图像。我需要找到一种方法,在循环中针对所有可能的黑白组合运行此代码。

1x1 图像很简单,要么全白要么全黑。

一张 2x1 的图片会有以下组合,每一行都是一张图片:

1 1 --> all white image
0 0 --> all black image
1 0 --> image with left pixel white, right pixel black
0 1 --> image with left pixel black, right pixel white

一张 2x2 的图片会有以下组合,每行也是一张图片:

0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
0 0 1 1
0 1 0 1
1 0 0 1
1 0 1 0
1 1 0 0
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
1 1 1 1

等等。这似乎是 Matlab 的 solved,但我需要一个不使用库的 JavaScript(或任何伪代码,真的)解决方案。

【问题讨论】:

  • ALL 可能的组合? 2x2 图像有 2^(2*2)=16 种可能的形式,16*16(如您的示例)有 2^(16*16)= appx。 1.15792*10^77种可能的形式,真的需要全部输出吗?
  • 是的,我都需要。

标签: javascript matrix binary binary-matrix


【解决方案1】:

我找到了解决方案。让我震惊的是,我可以用二进制代码数数。例如,一个 2x2 图像将有四个像素。全白图像将是:

1 1 1 1

全黑图像将是:

0 0 0 0

所以我知道二进制代码中的最小数字和二进制代码中的最大数字。那我就数数吧:

var pixelCount = imageWidth * imageHeight;

var lowestBinary = '';
var highestBinary = '';

for (var i = 0; i < pixelCount; i++) {
  lowestBinary += '0';
  highestBinary += '1';
}

var images = [];

var lowestDecimal = 0;
var highestDecimal = parseInt(highestBinary, 2); // convert from binary to decimal
var currentDecimal = lowestDecimal;

while (currentDecimal <= highestDecimal) {
  var image = currentDecimal.toString(2); // convert from decimal to binary

  while (image.length < pixelCount) {
    image = '0' + image;
  }

  images.push(image);

  currentDecimal++;
};

整个代码如下所示:

var fs = require("fs");
var Buffer = require("buffer").Buffer;
var Png = require("png").Png;

var imageWidth = 4;
var imageHeight = 3;

var rgb_data;

var pixelCount = imageWidth * imageHeight;

var lowestBinary = '';
var highestBinary = '';

for (var i = 0; i < pixelCount; i++) {
  lowestBinary += '0';
  highestBinary += '1';
}

var images = [];

var lowestDecimal = 0;
var highestDecimal = parseInt(highestBinary, 2);
var currentDecimal = lowestDecimal;

while (currentDecimal <= highestDecimal) {
  var image = currentDecimal.toString(2);

  while (image.length < pixelCount) {
    image = '0' + image;
  }

  images.push(image);

  currentDecimal++;
};

var h;
var w;
var p;

images.forEach(function (image, index) {
  rgb_data = new Buffer(imageWidth * imageHeight * 3);

  for (var i = 0; i < image.length; i++) {
    h = Math.floor(i / imageWidth);
    w = i % imageWidth;

    p = h * imageWidth * 3 + w * 3;

    var binary = image[i];
    var color = (binary * 255).toString();

    rgb_data[p + 0] = color; // r (0-255)
    rgb_data[p + 1] = color; // g (0-255)
    rgb_data[p + 2] = color; // b (0-255)
  }

  var png = new Png(rgb_data, imageWidth, imageHeight, "rgb")

  fs.writeFile(index + ".png", png.encodeSync().toString("binary"), "binary", function(err) {
    if (err) {
      console.log('Err:', err);
    } else {
      console.log('image generated!');
    }
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2021-11-03
    • 2021-10-26
    相关资源
    最近更新 更多