J'essaie de trouver les pixels les plus proches de la valeur RVB de (0,0,255). J'essaie de calculer la distance du pixel dans les valeurs RVB à cette valeur à l'aide d'un calcul 3D Pythagore, ajoutez-les à une liste, puis renvoyez les coordonnées X et Y des valeurs ayant la distance la plus basse. Voici ce que j'ai: Comment puis-je accélérer mes boucles? Je crois que cette réponse est sur la bonne voie, mais je ne sais pas comment implémenter les variables px et py tout en tranchant comme cette réponse montre. p> p>
3 Réponses :
Voici aller simple dans Python / OpenCV.
entrée: p>
127 0 128 0 127 1 128 1 127 2 128 2 127 3 128 3 127 4 128 4 127 5 128 5 127 6 128 6 127 7 128 7 127 8 128 8 127 9 128 9 127 10 128 10 127 11 128 11 127 12 128 12 127 13 128 13 127 14 128 14 127 15 128 15 127 16 128 16 127 17 128 17 127 18 128 18 127 19 128 19 127 20 128 20 127 21 128 21 127 22 128 22 127 23 128 23 127 24 128 24 127 25 128 25 127 26 128 26 127 27 128 27 127 28 128 28 127 29 128 29 127 30 128 30 127 31 128 31 127 32 128 32 127 33 128 33 127 34 128 34 127 35 128 35 127 36 128 36 127 37 128 37 127 38 128 38 127 39 128 39 127 40 128 40 127 41 128 41 127 42 128 42 127 43 128 43 127 44 128 44 127 45 128 45 127 46 128 46 127 47 128 47 127 48 128 48 127 49 128 49
Vous pouvez accélérer votre code en vectorisant la boucle pour la boucle: Vous pouvez trouver les coordonnées du minimum avec: p> Si vous souhaitez trouver la deuxième plus petite distance, changez le minimum précédent pour être une distance plus grande: p>
J'obtiens l'erreur suivante: R = Retina [: ,::::: 0] IndexError: Trop d'indices pour le tableau, avez-vous voulu écrire (R-0) ** 2 et (G-0) ** 2 dessus? Je souhaite également les coordonnées minimales (MIN1_D) et les deuxième coordonnées les plus basses (min2_d), pas non plus ou
@ 2567655222 R-0 = R, G-0 = G, il y a un axe trop important dans chaque rétine [:,:, 0], devrait être la rétine [:,:, 0]. Une chose à noter est que si votre matrice d'origine est de type UINT8, le résultat sera incorrect, de même que lorsque je l'ai testé. Vitesse sage Cette implémentation est presque deux fois plus rapide que la mine (0,059S / OP VS 0.035S / OP), car elle ne fait pas la moyenne de toutes les valeurs RVB.
Comme commenté, soustrayez la valeur RVB de la matrice, du carré, de la moyenne (ou de la somme) Pixel RVB, d'obtenir un minimum.
Voici ma variante: P>
import numpy
rgb_value = numpy.array([17,211,51])
img = numpy.random.randint(255, size=(1000,1000,3),dtype=numpy.uint8)
img_goal = numpy.average(numpy.square(numpy.subtract(img, rgb_value)), axis=2)
result = numpy.where(img_goal == numpy.amin(img_goal))
result_list = [result[0].tolist(),result[1].tolist()]
for i in range(len(result_list[0])):
print("RGB needed:", rgb_value)
print("Pixel:", result_list[0][i], result_list[1][i])
print("RGB gotten:", img[result_list[0][i]][result_list[1][i]])
print("Distance to value:", img_goal[result_list[0][i]][result_list[1][i]])
Ce que je pense pourrait être une solution consiste à soustraire la valeur RVB de la matrice, carré chacune, puis en moyenne et sélectionnez la valeur la plus basse. Je ne sais pas comment il se compare à la réponse de FMW42.