Eu gostaria de tirar uma imagem e mudar a escala da imagem, embora seja uma matriz numpy.
Por exemplo, tenho esta imagem de uma garrafa de coca-cola: garrafa-1
O que se traduz em uma matriz numpy de forma (528, 203, 3)
e eu quero redimensionar para dizer o tamanho desta segunda imagem:
garrafa-2
Que tem uma forma de (140, 54, 3)
.
Como altero o tamanho da imagem para uma determinada forma, mantendo a imagem original? Outras respostas sugerem remover todas as outras ou terceiras linhas, mas o que eu quero fazer é basicamente reduzir a imagem como você faria por meio de um editor de imagens, mas em código python. Existe alguma biblioteca para fazer isso no numpy / SciPy?
Respostas:
Sim, você pode instalar
opencv
(esta é uma biblioteca usada para processamento de imagens e visão computacional) e usar acv2.resize
função. E, por exemplo, use:Aqui
img
está, portanto, um array numpy contendo a imagem original, enquantores
um array numpy contendo a imagem redimensionada . Um aspecto importante é ointerpolation
parâmetro: existem várias maneiras de redimensionar uma imagem. Especialmente porque você reduz a escala da imagem e o tamanho da imagem original não é um múltiplo do tamanho da imagem redimensionada. Os esquemas de interpolação possíveis são:Como a maioria das opções, não existe uma opção "melhor" no sentido de que, para cada esquema de redimensionamento, há cenários em que uma estratégia pode ser preferida em vez de outra.
fonte
dsize
deve ser umadsize=(54, 140)
vez que leva x e depois y, onde uma matriz numpy mostra a forma como y, então x (y é o número de linhas ex é o número de colunas)skimage.io.imread('image.jpg')
eskimage.transform.resize(img)
. scikit-image.org/docs/dev/install.htmlEmbora seja possível usar o numpy sozinho para fazer isso, a operação não é embutida. Dito isso, você pode usar
scikit-image
(que é baseado no numpy) para fazer esse tipo de manipulação de imagem.A documentação de redimensionamento do Scikit-Image está aqui .
Por exemplo, você pode fazer o seguinte com sua imagem:
Isso cuidará de coisas como interpolação, anti-aliasing, etc. para você.
fonte
anti_aliasing
sinalização, parece que ela foi removida da versão mais recente do 0.13.1Para as pessoas que vêm do Google e procuram uma maneira rápida de reduzir a resolução de imagens em
numpy
arrays para uso em aplicativos de aprendizado de máquina, aqui está um método super rápido (adaptado daqui ). Este método só funciona quando as dimensões de entrada são um múltiplo das dimensões de saída.Os exemplos a seguir reduzem a resolução de 128x128 para 64x64 (isso pode ser facilmente alterado).
Último pedido de canais
Primeira ordem dos canais
Para imagens em tons de cinza, apenas altere o
3
para1
assim:Primeira ordem dos canais
Este método usa o equivalente ao max pooling. É a maneira mais rápida de fazer isso que encontrei.
fonte
np.repeat(np.repeat(a, 2, axis=0), 2, axis=1)
Se alguém veio aqui em busca de um método simples para dimensionar / redimensionar uma imagem em Python, sem usar bibliotecas adicionais, aqui está uma função de redimensionamento de imagem muito simples:
Exemplo de uso: redimensionando uma imagem (30 x 30) para (100 x 200):
Resultado:
Isso funciona para reduzir / dimensionar imagens e funciona bem com matrizes entorpecidas.
fonte
O
imresize()
método SciPy era outro método de redimensionamento, mas será removido a partir do SciPy v 1.3.0. SciPy se refere ao método de redimensionamento de imagem PIL :Image.resize(size, resample=0)
size - O tamanho solicitado em pixels, como uma tupla de 2: (largura, altura).
resample - Um filtro opcional de reamostragem. Pode ser um de PIL.Image.NEAREST (usar o vizinho mais próximo), PIL.Image.BILINEAR (interpolação linear), PIL.Image.BICUBIC (interpolação de spline cúbica) ou PIL.Image.LANCZOS (um filtro de downsampling de alta qualidade ) Se omitido, ou se a imagem tiver modo “1” ou “P”, é definido PIL.Imagem.NEAREST.
Link aqui: https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
fonte
Certo. Você pode fazer isso sem OpenCV, scikit-image ou PIL.
O redimensionamento da imagem é basicamente mapear as coordenadas de cada pixel da imagem original para sua posição redimensionada.
Uma vez que as coordenadas de uma imagem devem ser inteiros (pense nisso como uma matriz), se a coordenada mapeada tem valores decimais, você deve interpolar o valor do pixel para aproximá-lo da posição do inteiro (por exemplo, obter o pixel mais próximo dessa posição é conhecido como interpolação de vizinho mais próximo ).
Tudo que você precisa é uma função que faça essa interpolação para você. SciPy tem
interpolate.interp2d
.Você pode usá-lo para redimensionar uma imagem em uma matriz numpy, digamos
arr
, da seguinte maneira:Claro, se sua imagem é RGB, você deve fazer a interpolação para cada canal.
Se você gostaria de entender mais, sugiro assistir Resizing Images - Computerphile .
fonte
fonte
cv2
e usa uma função de redimensionamento adequada em vez de reimplementar uma função de redimensionamento "abaixo do ideal" que se sai pior do que a interpolação do vizinho mais próximo.