Debe calcular el umbral de brillo del histograma. Luego itera a través de los píxeles para obtener las posiciones que son lo suficientemente brillantes como para satisfacer el umbral. El programa siguiente lugar se aplica el umbral a la imagen y muestra el resultado con fines de demostración:
#!/usr/bin/env python3
import sys
import cv2
import matplotlib.pyplot as plt
if __name__ == '__main__':
if len(sys.argv) != 2 or any(s in sys.argv for s in ['-h', '--help', '-?']):
print('usage: {} <img>'.format(sys.argv[0]))
exit()
img = cv2.imread(sys.argv[1], cv2.IMREAD_GRAYSCALE)
hi_percentage = 0.01 # we want we the hi_percentage brightest pixels
# * histogram
hist = cv2.calcHist([img], [0], None, [256], [0, 256]).flatten()
# * find brightness threshold
# here: highest thresh for including at least hi_percentage image pixels,
# maybe you want to modify it for lowest threshold with for including
# at most hi_percentage pixels
total_count = img.shape[0] * img.shape[1] # height * width
target_count = hi_percentage * total_count # bright pixels we look for
summed = 0
for i in range(255, 0, -1):
summed += int(hist[i])
if target_count <= summed:
hi_thresh = i
break
else:
hi_thresh = 0
# * apply threshold & display result for demonstration purposes:
filtered_img = cv2.threshold(img, hi_thresh, 0, cv2.THRESH_TOZERO)[1]
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(filtered_img, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
@Mark: thresholding doesnt help, debes encontrar los píxeles más brillantes y su ubicación. –
¿Cómo no ayuda? Umbral primero para aumentar su intensidad al máximo, y luego use su cvMinMaxLoc para encontrar dónde están. – mpen
cvMinMaxLoc brinda solo la ubicación de un píxel brillante, ¿puedo encontrar otro loc con la misma intensidad? –