python - Como faço para converter um array numpy para(e exibir)uma imagem?




arrays (5)

A Python Imaging Library pode exibir imagens usando matrizes Numpy. Dê uma olhada nesta página para código de amostra:

EDIT: Como a nota na parte inferior da página diz, você deve verificar as últimas notas de versão que tornam isso muito mais simples:

http://effbot.org/zone/pil-changes-116.htm

Eu criei uma matriz assim:

import numpy as np
data = np.zeros( (512,512,3), dtype=np.uint8)
data[256,256] = [255,0,0]

O que eu quero fazer é exibir um único ponto vermelho no centro de uma imagem de 512x512. (Pelo menos para começar ... acho que posso descobrir o resto de lá)


O seguinte deve funcionar:

from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()

Se você estiver usando o Jupyter notebook / lab, use este comando inline antes de importar o matplotlib:

%matplotlib inline 

Usando pygame , você pode abrir uma janela, obter a superfície como uma matriz de pixels e manipular como quiser a partir daí. Você precisará copiar seu array numpy no array de superfície, no entanto, o que será muito mais lento do que fazer operações gráficas reais nas próprias superfícies do PyGame.


Você poderia usar o PIL para criar (e exibir) uma imagem:

from PIL import Image
import numpy as np

w, h = 512, 512
data = np.zeros((h, w, 3), dtype=np.uint8)
data[256, 256] = [255, 0, 0]
img = Image.fromarray(data, 'RGB')
img.save('my.png')
img.show()

Com base em todas as respostas que estavam corretas e levando em consideração as melhores práticas sugeridas (especialmente não usando o Array.prototype diretamente), eu criei o código abaixo:

function arrayWithout(arr, values) {
  var isArray = function(canBeArray) {
    if (Array.isArray) {
      return Array.isArray(canBeArray);
    }
    return Object.prototype.toString.call(canBeArray) === '[object Array]';
  };

  var excludedValues = (isArray(values)) ? values : [].slice.call(arguments, 1);
  var arrCopy = arr.slice(0);

  for (var i = arrCopy.length - 1; i >= 0; i--) {
    if (excludedValues.indexOf(arrCopy[i]) > -1) {
      arrCopy.splice(i, 1);
    }
  }

  return arrCopy;
}

Revendo a função acima, apesar do fato de que funciona bem, percebi que poderia haver alguma melhora no desempenho. Também usar ES6 em vez de ES5 é uma abordagem muito melhor. Para esse fim, esse é o código aprimorado:

const arrayWithoutFastest = (() => {
  const isArray = canBeArray => ('isArray' in Array) 
    ? Array.isArray(canBeArray) 
    : Object.prototype.toString.call(canBeArray) === '[object Array]';

  let mapIncludes = (map, key) => map.has(key);
  let objectIncludes = (obj, key) => key in obj;
  let includes;

  function arrayWithoutFastest(arr, ...thisArgs) {
    let withoutValues = isArray(thisArgs[0]) ? thisArgs[0] : thisArgs;

    if (typeof Map !== 'undefined') {
      withoutValues = withoutValues.reduce((map, value) => map.set(value, value), new Map());
      includes = mapIncludes;
    } else {
      withoutValues = withoutValues.reduce((map, value) => { map[value] = value; return map; } , {}); 
      includes = objectIncludes;
    }

    const arrCopy = [];
    const length = arr.length;

    for (let i = 0; i < length; i++) {
      // If value is not in exclude list
      if (!includes(withoutValues, arr[i])) {
        arrCopy.push(arr[i]);
      }
    }

    return arrCopy;
  }

  return arrayWithoutFastest;  
})();

Como usar:

const arr = [1,2,3,4,5,"name", false];

arrayWithoutFastest(arr, 1); // will return array [2,3,4,5,"name", false]
arrayWithoutFastest(arr, 'name'); // will return [2,3,4,5, false]
arrayWithoutFastest(arr, false); // will return [2,3,4,5]
arrayWithoutFastest(arr,[1,2]); // will return [3,4,5,"name", false];
arrayWithoutFastest(arr, {bar: "foo"}); // will return the same array (new copy)

No momento, estou escrevendo um post de blog no qual testei várias soluções para o Array sem problemas e comparei o tempo necessário para executá-lo. Eu atualizarei esta resposta com o link assim que terminar esse post. Só para você saber, eu comparei o anterior com o da lodash sem e no caso do navegador suporta Map, ele bate lodash! Note que eu não estou usando Array.prototype.indexOfou Array.prototype.includesenvolvendo os exlcudeValues ​​em um Mapou Objectfaz consultas mais rápidas! ( https://jsperf.com/array-without-benchmark-against-lodash )





python image arrays numpy