Выбор пикселей с наибольшей интенсивностью в OpenCV - PullRequest
7 голосов
/ 06 сентября 2010

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

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

Ответы [ 4 ]

1 голос
/ 06 сентября 2010

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

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

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

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

1 голос
/ 11 апреля 2017

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

#!/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 голосов
/ 20 июня 2017

Что ж, самый логичный способ - итерировать всю картинку, а затем получить значения 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];

0 голосов
/ 06 сентября 2010

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

...