2010-09-06 3 views
7

Может ли кто-нибудь помочь мне узнать верхние 1% (или сказать 100 пикселей) яркие пиксели с их расположением серого изображения в opencv. потому что cvMinMaxLoc() дает только самое яркое расположение пикселей.Выбор пикселей с наибольшей интенсивностью в OpenCV

Любая помощь очень ценится.

ответ

1

Попробуйте вместо этого использовать cvThreshold.

+0

@Mark: пороговое значение не помогает, вам нужно найти самые яркие пиксели и их местоположение. –

+0

Как это не помогает? Порог сначала повысит их интенсивность до максимума, а затем используйте ваш cvMinMaxLoc, чтобы найти, где они находятся. – mpen

+0

cvMinMaxLoc дает только одно яркое местоположение пикселя, hw я могу узнать другие loc с той же интенсивностью? –

1

это простой, но unneficient/глупый способ сделать это:

for i=1:100 
    get brightest pixel using cvMinMaxLoc 
    store location 
    set it to a value of zero 
end 

, если вы не возражаете об эффективности это должно работать.

вы также должны проверить cvInRangeS, чтобы найти другие пиксели с одинаковыми значениями, определяющими низкие и высокие пороговые значения.

1

Вам необходимо вычислить порог яркости на гистограмме. Затем вы повторяете пиксели, чтобы получить те позиции, которые достаточно яркие, чтобы соответствовать порогу. Программа ниже вместо этого применяет порог для изображения и отображает результат для демонстрационных целей:

#!/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() 
0

Ну самые логичный способ для перебора всей картины, а затем получить значение пикселей max и min. Затем выберите порог, который даст вам желаемый процент (1% в вашем случае). После этого повторите попытку и сохраните координаты i и j каждого пикселя над заданным пороговым значением. Таким образом, вы будете перебирать матрицу только два раза вместо 100 (или 1% от времени пикселей) и выбирать наиболее яркие и удалять их.

Коврики OpenCV представляют собой многомерные массивы. Серые изображения представляют собой двумерный массив со значениями от 0 до 255. Вы можете итерации через матрицу следующим образом. for(int i=0;i < mat.height();i++) for(int j=0;j < mat.width();j++) mat[i][j];

Смежные вопросы