Itérations à travers des pixels dans une image terriblement lent avec python (OpenCV)
Je suis conscient de l'itération sur les pixels et d'accéder à leurs valeurs, à l'aide d'OpenCV avec C++. Maintenant, je suis en train d'apprendre le langage python moi-même et j'ai essayé de faire la même chose en python. Mais lorsque j'exécute le code suivant, il prend beaucoup de temps (environ 7 à 10 secondes) pour afficher l'image. Et le script continue à tourner pendant quelques secondes de plus, même après l'affichage de l'image.
J'ai trouvé une question similaire ici, DONC mais je ne suis pas en mesure de comprendre comment dois-je utiliser numpy dans mon cas (parce que je suis un débutant en python), et si oui ou non il est vraiment nécessaire?
Explication du Code: je suis juste essayer de mettre les pixels noirs sur les côtés gauche et droit de l'image.
import numpy as np
import cv2 as cv
#reading an image
img = cv.imread('image.jpg')
height, width, depth = img.shape
for i in range(0, height):
for j in range(0, (width/4)):
img[i,j] = [0,0,0]
for i in range(0, height):
for j in range(3*(width/4), width):
img[i,j] = [0,0,0]
cv.imshow('image',img)
cv.waitKey(0)
OriginalL'auteur skm | 2014-10-18
Vous devez vous connecter pour publier un commentaire.
(note: je ne suis pas familier avec
opencv
, mais cela semble être unenumpy
question)La "terriblement lent", c'est que vous êtes en boucle le bytecode python, plutôt que de laisser
numpy
boucle à C de vitesse.Essayer directement de l'affectation à un (3 dimensions) de la tranche qui masque la région que vous souhaitez remettre à zéro.
Ci-dessus montre une réinitialisation de la gauche; faire de même pour le côté droit est un exercice pour le lecteur.
Si le numpy découpage de la syntaxe de voyages que vous, je suggère la lecture par le biais de la l'indexation des docs.
Je ne suis pas sûr de ce que vous demandez; je lui ai expliqué que vous devez l'affecter à une 3D tranche, et commente la ligne où je le fais. Être plus précis sur ce que vous ne comprenez pas.
Ou, plus simplement,
img[:,:width/4,:] = 0
, et pour l'autre bord,img[:,-width/4:,:] = 0
Et si vous vous sentez comme faire en une seule ligne,
img[:,np.r_[:width/4,-width/4:],:] = 0
Dans cette ligne:
img[0:height, 0:width//4, 0:depth] = 0
, peut0
être une fonction personnalisée pour être appliquée pour chaque pixel de l'?OriginalL'auteur roippi