Вам необходимо вычислить порог яркости на гистограмме. Затем вы повторяете пиксели, чтобы получить те позиции, которые достаточно яркие, чтобы соответствовать порогу. Программа ниже вместо этого применяет порог для изображения и отображает результат для демонстрационных целей:
#!/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: пороговое значение не помогает, вам нужно найти самые яркие пиксели и их местоположение. –
Как это не помогает? Порог сначала повысит их интенсивность до максимума, а затем используйте ваш cvMinMaxLoc, чтобы найти, где они находятся. – mpen
cvMinMaxLoc дает только одно яркое местоположение пикселя, hw я могу узнать другие loc с той же интенсивностью? –