Salut les pythons scientifiques.
j'ai quelques notions de numpy: quelques chapitres dédier et paragraphe par ci et par là sur le sujet.
Mais en ce moment je bosse avec OpenCV et donc aussi avec numpy.
Et j'ai comme par exemple pour extraire la liste des pixels canal par canal de couleurs ont peut employer la méthode suivante
Puis par exemple de multiplier chaque canal (Qui est un numpy.array que je met en dtype=numpy.uint8 (un byte non-signé) ) par un facteur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 import cv2 # OpenCV image=cv2.imread(filepath) b, r, g = cv2.split(image) ; # blue, green, red color channels or pixel components list. # or # >>> channels=cv2.split(image) ;
De me pas être en mesure de mettre une valeur maximale | minimale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 def scale_image(image, factor=1.0) : b, r, g = cv2.split(image) ; b = ( b * factor).astype(numpy.uint8) # The problem is wenn the result from the multiplication is g = ( g * factor).astype(numpy.uint8) # greater than 255 it overflow and rebound to 0 instead r = ( r * factor).astype(numpy.uint8) # of stopping at 255. And the same wenn littler than zero. cv2.merge((b,g,r), image) ;
Si l'on pourrait itérer sur les canaux de cette manière:
Sans perdre la vitesse de numpy. Et bien ça serai parfait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 def scale_per_canal(channel, factor=1.0) : for values in channel : for value in values : if int(value * factor) > 255 : value=255 elif int(value * factor) < 0 : value=0 else : value = int(value * factor)
Vous avez sans nul doutes tous compris mon problème: si la multiplication produit un résultat hors des limites d'un uint8 et bien ça crée des erreurs dans les frames et si l'on itère sans numpy et bien l'on perd beaucoup de vitesse d'exécution et si l'on traite de la vidéo ou des images trop grandes ça se remarque.
En espérant que vous avez compris mon problème, je vous remercie pour vos réponses éclairées et votre aide précieuse.
PS: Le programme de démo du problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 import cv2 import numpy from sys import argv, exit from os.path import isfile if len(argv) != 2 : print "usage %s filepath" %argv[0] exit() if not isfile(argv[1]) : print "usage %s filepath" %argv[0] exit() image=cv2.imread(argv[1]) def scale_per_canal(channel, factor=1.0) : for values in channel : for value in values : if int(value * factor) > 255 : value=255 elif int(value * factor) < 0 : value=0 else : value = int(value * factor) def scale_image(image, factor=1.0) : b, r, g = cv2.split(image) ; # Uncomment following code to sea the speed difference. #scale_per_canal(b, factor) #scale_per_canal(g, factor) #scale_per_canal(r, factor) # And comment folllowing lines to the sea the image result difference with relevant factors. b = ( b * factor).astype(numpy.uint8) # The problem is wenn the result from the multiplication is g = ( g * factor).astype(numpy.uint8) # greater than 255 it overflow and rebound to 0 instead r = ( r * factor).astype(numpy.uint8) # of stopping at 255. And the same wenn littler than zero. cv2.merge((b,g,r), image) ; scale_image(image, 1.5) cv2.namedWindow("MyWin",1); print "Press 'q' to quit." while True : keycode = cv2.waitKey(1) if (keycode & 0xFF == ord('q') ) : break ; cv2.imshow("MyWin",image) ;
Partager