Comment puis-je recadrer des images, comme je l'ai déjà fait dans PIL, en utilisant OpenCV.
Exemple de travail sur PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Mais comment puis-je le faire sur OpenCV?
Voici ce que j'ai essayé:
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)
Mais ça ne marche pas.
Je pense que j'ai mal utilisé getRectSubPix
. Si tel est le cas, veuillez expliquer comment je peux utiliser correctement cette fonction.
crop_img = img[margin:-margin, margin:-margin]
j'ai eu cette question et j'ai trouvé une autre réponse ici: copier la région d'intérêt
Si l'on considère (0,0) comme le coin supérieur gauche de l'image appelé
im
avec de gauche à droite comme direction x et de haut en bas comme direction y. et nous avons (x1, y1) comme sommet en haut à gauche et (x2, y2) comme sommet en bas à droite d'une région rectangulaire dans cette image, puis:voici une ressource complète sur l' indexation et le découpage de tableaux numpy qui peut vous en dire plus sur des choses comme le recadrage d'une partie d'une image. les images seraient stockées sous forme de tableau numpy dans opencv2.
:)
la source
im
n'ait pas été lue correctement et soit vide. essayez d'utiliser un IDE avec des points d'arrêt pour diagnostiquer votre code étape par étape. vous pouvez utiliser google colab pour créer des blocs de code et partager votre bloc-notes jupytor sur la salle de discussion stackoverflow python pour obtenir de l'aide.Notez que le découpage d'image ne crée pas une copie de
cropped image
mais crée unpointer
vers leroi
. Si vous chargez autant d'images, recadrez les parties pertinentes des images avec des tranches, puis ajoutez-les dans une liste, cela pourrait être un énorme gaspillage de mémoire.Supposons que vous chargiez N images chacune
>1MP
et que vous n'ayez besoin que d'une100x100
région dans le coin supérieur gauche.Slicing
:Alternativement, vous pouvez copier la partie appropriée par
.copy()
, afin que le garbage collector soit suppriméim
.Après avoir découvert cela, je me suis rendu compte que l' un des commentaires de user1270710 le mentionnait, mais cela m'a pris un certain temps pour le découvrir (c'est-à-dire le débogage, etc.). Donc, je pense que cela mérite d'être mentionné.
la source
copy()
le retour sur investissement, par rapport au tranchage, quel serait le résultat?. De plus, si j'ai une variabletmp
dans laquelle je stocke chaque image que je charge depuis mon ordinateur, le découpage ne devrait pas avoir un mauvais impact sur ma mémoire, non? Le problème que vous décrivez est uniquement lié à ce qui se passe lorsque vous chargez toutes les images et que vous les enregistrez à nouveau ROI, ayant à la fois les originaux et le ROI . Veuillez me faire savoir si j'ai bien compris.ce code recadre une image de x = 0, y = 0 à h = 100, w = 200
la source
Vous trouverez ci-dessous la façon de recadrer une image.
chemin_image: chemin d'accès à l'image à modifier
coords: Un tuple de coordonnées x / y (x1, y1, x2, y2) [ouvrez l'image dans mspaint et vérifiez la "règle" dans l'onglet vue pour voir les coordonnées]
saved_location : chemin pour enregistrer l'image recadrée
la source
Recadrage robuste avec fonction de bordure de copie ouverte:
la source
x1,y1,x2,y2 = bbox
en disant:TypeError: 'int' object is not iterable
voici du code pour une imcrop plus robuste (un peu comme dans matlab)
la source
Alternativement, vous pouvez utiliser tensorflow pour le recadrage et openCV pour créer un tableau à partir de l'image.
Il
img
s'agit maintenant d' un tableau de formes (imageheight, imagewidth, 3). Recadrez le tableau avec tensorflow:Remontez l'image avec tf.keras, afin que nous puissions la regarder si cela a fonctionné:
Cela imprime la photo dans un cahier (testé dans Google Colab).
L'ensemble du code ensemble:
la source