0
votes

Améliorer les numpus pour la vitesse de boucle

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: xxx

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.


1 commentaires

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.


3 Réponses :


0
votes

Voici aller simple dans Python / OpenCV.

  • Lire l'entrée li>
  • Définissez votre couleur (bleu pur) li>
  • Créer une image de la couleur souhaitée li>
  • calculer une image représentant la différence RMSE li>
  • seuil l'image RMSE li>
  • Obtenez les coordonnées de tous les pixels blancs li> ul>

    entrée: p>

    Entrez la description de l'image ici 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
    


0 commentaires

1
votes

Vous pouvez accélérer votre code en vectorisant la boucle pour la boucle: xxx

Vous pouvez trouver les coordonnées du minimum avec: xxx

Si vous souhaitez trouver la deuxième plus petite distance, changez le minimum précédent pour être une distance plus grande: xxx


2 commentaires

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.



0
votes

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]])


0 commentaires