web-dev-qa-db-fra.com

Extraire une région d'une image en utilisant le découpage en Python, OpenCV

J'ai une image et je veux en extraire une région. J'ai les coordonnées du coin supérieur gauche et du coin inférieur droit de cette région. En échelle de gris, je le fais comme ceci:

I = cv2.imread("lena.png")
I = cv2.cvtColor(I, cv2.COLOR_RGB2GRAY)
region = I[248:280,245:288]
tools.show_1_image_pylab(region)

Je ne peux pas comprendre comment le faire en couleur. J'ai pensé à extraire chaque canal R, G, B; découper cette région à partir de chacun des canaux et les fusionner, mais il doit y avoir un moyen plus court.

53
Booyaches

Il y a une légère différence dans l'ordre des pixels dans OpenCV et Matplotlib.

OpenCV suit l'ordre BGR, tandis que matplotlib suit probablement l'ordre RGB.

Ainsi, lorsque vous affichez une image chargée dans OpenCV à l'aide des fonctions pylab, vous devrez peut-être la convertir en mode RVB. (Je ne sais pas s'il existe une méthode simple). La méthode ci-dessous le démontre:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('messi4.jpg')
b,g,r = cv2.split(img)
img2 = cv2.merge([r,g,b])
plt.subplot(121);plt.imshow(img) # expects distorted color
plt.subplot(122);plt.imshow(img2) # expect true color
plt.show()

cv2.imshow('bgr image',img) # expects true color
cv2.imshow('rgb image',img2) # expects distorted color
cv2.waitKey(0)
cv2.destroyAllWindows()

NB: Veuillez vérifier le commentaire de @Amro ci-dessous pour une meilleure méthode de conversion entre BGR et RGB. img2 = img[:,:,::-1]. Très simple.

Exécutez ce code et voyez vous-même la différence de résultat. Voici ce que j'ai obtenu:

en utilisant Matplotlib:

enter image description here

en utilisant OpenCV:

enter image description here

121
Abid Rahman K

2 autres options non encore mentionnées:

img[..., ::-1] # same as the mentioned img[:, :, ::-1] but slightly shorter

et le polyvalent

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
44
Israel Unterman