Как найти наиболее частое значение пикселя? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть набор изображений, где каждый пиксель состоит из 3 целых чисел в диапазоне 0-255.

Мне интересно найти один пиксель, который будет «представительным» (насколько это возможно) для всей популяции пикселей в целом, и этот пиксель должен присутствовать в популяции пикселей.Я определяю, какой пиксель является наиболее распространенным (режим медиана ) в моем наборе изображений, имеет наибольшее значение.

Я использую python, но я не уверен, какпойти на это.Изображения сохраняются как numpy array с размерами [n, h, w, c], где n - это количество изображений, h - это высота, w - это ширина and c` - каналы (RGB).

1 Ответ

0 голосов
/ 01 октября 2018

Я собираюсь предположить, что вам нужно найти наиболее распространенный элемент, который, как упоминал Крис Луенго, называется режимом.Я также собираюсь предположить, что битовая глубина каналов составляет 8 бит (значение от 0 до 255, т.е. по модулю 256).

Вот подход, независимый от реализации:

Цель состоит в том, чтобы поддерживать количество всех типов пикселей, с которыми встречаются.Для этого имеет смысл использовать словарь, который будет иметь вид {pixel_value : count}.

Как только этот словарь заполнен, мы можем найти пиксель с наибольшим числом.

Теперь,«пиксели» не могут быть хешируемыми и, следовательно, не могут быть сохранены в словаре напрямую.Нам нужен способ присвоить целое число (которое я буду называть pixel_value) каждому уникальному пикселю, т. Е. Вы должны иметь возможность преобразовать значение pixel_value <-> RGB пикселя

ThisФункция преобразует значения RGB в целое число в диапазоне от 0 до 16 777 215:

def get_pixel_value(pixel):
    return pixel.red + 256*pixel.green + 256*256*pixel.blue 

и преобразует значение pixel_value обратно в значения RGB:

def get_rgb_values(pixel_value):
    red = pixel_value%256
    pixel_value //= 256
    green = pixel_value%256
    pixel_value //= 256
    blue = pixel_value
    return [red,green,blue]

Эта функция может найти наиболее частый пиксельв изображении:

def find_most_common_pixel(image):
    histogram = {}  #Dictionary keeps count of different kinds of pixels in image

    for pixel in image:
        pixel_val = get_pixel_value(pixel)
        if pixel_val in histogram:
            histogram[pixel_val] += 1 #Increment count
        else:
            histogram[pixel_val] = 1 #pixel_val encountered for the first time

    mode_pixel_val = max(histogram, key = histogram.get) #Find pixel_val whose count is maximum
    return get_rgb_values(mode_pixel_val)  #Returna a list containing RGB Value of the median pixel

Если вы хотите найти самый частый пиксель в наборе изображений, просто добавьте еще один цикл for image in image_set и заполните словарь для всех значений pixel_values ​​во всех изображениях.

...