Como cortar imagens, como fiz anteriormente no PIL, usando o OpenCV.
Exemplo de trabalho no PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Mas como eu posso fazer isso no OpenCV?
Isto é o que eu tentei:
im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)
Mas isso não funciona.
Eu acho que usei incorretamente getRectSubPix
. Se for esse o caso, explique como posso usar corretamente esta função.
crop_img = img[margin:-margin, margin:-margin]
Eu tive essa pergunta e encontrei outra resposta aqui: copiar região de interesse
Se considerarmos (0,0) o canto superior esquerdo da imagem chamado
im
com a esquerda para a direita como direção x e de cima para baixo como direção y. e temos (x1, y1) como o vértice superior esquerdo e (x2, y2) como o vértice inferior direito de uma região retangular dentro dessa imagem;aqui está um recurso abrangente sobre indexação e fatiamento de matrizes numpy, que pode informar mais sobre coisas como cortar parte de uma imagem. as imagens seriam armazenadas como uma matriz numpy no opencv2.
:)
fonte
im
não tenha sido lida corretamente e esteja vazia. tente usar um IDE com pontos de interrupção para diagnosticar seu código passo a passo. você pode usar o google colab para criar blocos de código e compartilhar seu notebook jupytor na sala de bate-papo stackoverflow python para obter ajuda de alguém.Observe que, o fatiamento da imagem não está criando uma cópia do,
cropped image
mas criando umpointer
para oroi
. Se você estiver carregando tantas imagens, cortando as partes relevantes das imagens com fatias e anexando-as a uma lista, isso pode ser um enorme desperdício de memória.Suponha que você carregue N imagens cada uma
>1MP
e precise apenas da100x100
região no canto superior esquerdo.Slicing
:Como alternativa, você pode copiar a parte relevante
.copy()
, para que o coletor de lixo seja removidoim
.Depois de descobrir isso, percebi que um dos comentários do user1270710 mencionou isso, mas levei algum tempo para descobrir (por exemplo, depuração etc). Então, acho que vale a pena mencionar.
fonte
copy()
o ROI, comparado ao fatiamento, qual seria o resultado? Além disso, se eu tiver uma variáveltmp
na qual guardo cada imagem que carrego do meu computador, a fatia não deve ter um impacto ruim na minha memória, certo? O problema que você descreve está relacionado apenas ao que acontece quando você carrega todas as imagens e, em seguida, armazena novamente o ROI, tendo os originais e o ROI . Por favor, deixe-me saber se eu entendi direito.esse código recorta uma imagem da posição x = 0, y = 0 até h = 100, w = 200
fonte
Abaixo está o caminho para cortar uma imagem.
image_path: o caminho para a imagem a editar
coords: Uma tupla de coordenadas x / y (x1, y1, x2, y2) [abra a imagem no mspaint e verifique a "régua" na guia Visualizar para ver as coordenadas]
saved_location : caminho para salvar a imagem cortada
fonte
Recorte robusto com função de borda de cópia opencv:
fonte
x1,y1,x2,y2 = bbox
enquanto dizia:TypeError: 'int' object is not iterable
aqui está um código para imcrop mais robusto (um pouco como no matlab)
fonte
Como alternativa, você pode usar o tensorflow para o recorte e o openCV para criar uma matriz a partir da imagem.
Agora
img
é uma matriz de forma (altura da imagem, largura da imagem, 3). Corte a matriz com fluxo tensor:Remonte a imagem com tf.keras, para que possamos ver se funcionou:
Isso imprime a foto em um notebook (testado no Google Colab).
O código inteiro junto:
fonte