Należy obliczyć próg jasności na histogramie. Następnie przechodzisz przez piksele, aby uzyskać pozycje, które są wystarczająco jasne, aby spełnić próg. Program poniżej progu zamiast stosuje się do obrazu i wyświetla wynik dla celów demonstracyjnych:
#!/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: progowanie nie pomaga, musisz znaleźć najjaśniejsze piksele i ich lokalizację. –
Jak to nie pomaga? Najpierw zwiększ intensywność do maksimum, a następnie użyj swojego cvMinMaxLoc, aby znaleźć miejsce, w którym się znajdują. – mpen
cvMinMaxLoc daje tylko jedną najjaśniejszą lokalizację pikseli, czy mogę znaleźć inne miejsce o tej samej intensywności? –