2010-09-06 14 views

Odpowiedz

1

Zamiast tego spróbuj użyć cvThreshold.

+0

@ Mark: progowanie nie pomaga, musisz znaleźć najjaśniejsze piksele i ich lokalizację. –

+0

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

+0

cvMinMaxLoc daje tylko jedną najjaśniejszą lokalizację pikseli, czy mogę znaleźć inne miejsce o tej samej intensywności? –

1

jest to proste, ale unneficient/głupi sposób to zrobić:

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

jeśli nie przeszkadza o wydajności to powinno działać.

powinieneś również sprawdzić cvInRangeS, aby znaleźć inne piksele o podobnych wartościach określających niski i wysoki próg.

1

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() 
0

Dobrze najbardziej logicznym sposobem jest iteracyjne cały obraz, a następnie uzyskać wartość pikseli max i min. Następnie wybierz próg, który da pożądany procent (1% w twoim przypadku). Następnie należy powtórzyć iterację i zapisać współrzędne i i j każdego piksela powyżej podanego progu. W ten sposób możesz przerobić macierz tylko dwa razy zamiast 100 (lub 1% pikseli razy) i wybierać najjaśniejsze i usuwać ją.

Maty OpenCV są wielowymiarowymi tablicami. Szary obraz to dwuwymiarowa tablica z wartościami od 0 do 255. Możesz iterować przez macierz w ten sposób. for(int i=0;i < mat.height();i++) for(int j=0;j < mat.width();j++) mat[i][j];

Powiązane problemy