Eu quero usar o OpenCV2.0 e o Python2.6 para mostrar imagens redimensionadas. Usei e adotei o exemplo em http://opencv.willowgarage.com/documentation/python/cookbook.html, mas infelizmente esse código é para o OpenCV2.1 e parece não estar funcionando no 2.0. Aqui meu código:
import os, glob
import cv
ulpath = "exampleshq/"
for infile in glob.glob( os.path.join(ulpath, "*.jpg") ):
im = cv.LoadImage(infile)
thumbnail = cv.CreateMat(im.rows/10, im.cols/10, cv.CV_8UC3)
cv.Resize(im, thumbnail)
cv.NamedWindow(infile)
cv.ShowImage(infile, thumbnail)
cv.WaitKey(0)
cv.DestroyWindow(name)
Desde que eu não posso usar
cv.LoadImageM
eu usei
cv.LoadImage
em vez disso, o que não era problema em outros aplicativos. No entanto, o cv.iplimage não possui linhas, colunas ou tamanho de atributo. Alguém pode me dar uma dica, como resolver esse problema? Obrigado.
Respostas:
Se você deseja usar o CV2, você precisa usar a
resize
função.Por exemplo, isso redimensionará os dois eixos pela metade:
e isso redimensionará a imagem para ter 100 colunas (largura) e 50 linhas (altura):
Outra opção é usar o
scipy
módulo, usando:Obviamente, há mais opções que você pode ler na documentação dessas funções ( cv2.resize , scipy.misc.imresize ).
Atualização: de
acordo com a documentação SciPy :
Observe que, se você deseja redimensionar por um fator , pode realmente querer
skimage.transform.rescale
.fonte
Exemplo dobrando o tamanho da imagem
Existem duas maneiras de redimensionar uma imagem. O novo tamanho pode ser especificado:
Manualmente;
height, width = src.shape[:2]
dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)
Por um fator de escala.
dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)
, em que fx é o fator de escala no eixo horizontal e fy no eixo vertical.Para reduzir uma imagem, ela geralmente fica melhor com a interpolação INTER_AREA, enquanto que para ampliar uma imagem geralmente fica melhor com INTER_CUBIC (lenta) ou INTER_LINEAR (mais rápida, mas ainda parece OK).
Exemplo de imagem reduzida para ajustar-se a uma altura / largura máxima (mantendo a proporção)
Usando seu código com cv2
fonte
src = cv2.imread('YOUR_PATH_TO_IMG')
e editou o 'YOUR_PATH_TO_IMG' no caminho da sua própria imagem?cv2.resize
automaticamente usa preenchimento? qual é o tamanho da janela criada usando o tamanho de saída desejado como(width/10, height/10)
?Você poderia usar a função GetSize para obter essas informações, cv.GetSize (im) retornaria uma tupla com a largura e a altura da imagem. Você também pode usar im.depth e img.nChan para obter mais informações.
E para redimensionar uma imagem, eu usaria um processo ligeiramente diferente, com outra imagem em vez de uma matriz. É melhor tentar trabalhar com o mesmo tipo de dados:
Espero que isto ajude ;)
Julien
fonte
fonte
cv2.resize
automaticamente usa preenchimento? qual é o tamanho da janela criada usando(w, target_height)
argumentos?Aqui está uma função para aumentar ou diminuir a escala da imagem pela largura ou altura desejada, mantendo a proporção
Uso
Usando esta imagem de exemplo
Simplesmente reduza a escala para
width=100
(esquerda) ou faça o upscale parawidth=300
(direita)fonte