OpenCV локальное среднее по пикселям, генерирующее экстранный вывод - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь использовать python, чтобы просто вычислить локальное среднее значение цвета в пикселях, однако мой вывод совсем не такой.

Изображение:

enter image description here

Выход:

enter image description here

Код:

image = cv2.imread('perspective.jpeg')
for i in range(image.shape[1]):
    for j in range(image.shape[0]):

        up = image[min(j + 1, image.shape[0]-1), i]
        down = image[max(j - 1, 0), i]
        right = image[j, min(i + 1, image.shape[1]-1)]
        left = image[j, max(i - 1, 0)]

        average = (up + down + left + right + image[j, i]) / 5

        image[j, i] = average

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете легко сделать это с filter2D , как показано в примере ниже.Он будет работать на любом количестве каналов.

im = np.random.randint(0, 256, (5, 5), np.uint8)
kernel = np.array([[0, 1./5, 0], [1./5, 1./5, 1./5], [0, 1./5, 0]])
filt = cv2.filter2D(im, cv2.CV_8U, kernel)

Например:

im

array([[ 14, 127, 221,  74,   2],
       [132, 251,  88,  19, 215],
       [183, 140,  17,  60,  76],
       [208, 144, 182,  11,  64],
       [183,  89, 217, 131,  23]], dtype=uint8)

filt

array([[106, 173, 120,  67, 116],
       [166, 148, 119,  91,  66],
       [161, 147,  97,  37,  95],
       [172, 153, 114,  90,  37],
       [155, 155, 160,  79,  83]], dtype=uint8)

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

0 голосов
/ 06 февраля 2019

Наблюдаемые вами проблемы связаны с целочисленным арифметическим переполнением при вычислении среднего значения.Причиной переполнения является то, что пиксели имеют тип np.uint8, которые при сложении создают результат типа np.uint8, который недостаточно велик для хранения результата сложения.

Решение этой проблемыпривести пиксели к большему типу данных перед их добавлением.Затем приведите окончательное значение обратно к np.uint8 перед сохранением обратно к результирующему изображению.Фактически, приведение только одного из значений (скажем, up) к большему типу данных будет достаточным, поскольку остальные из них будут автоматически обновлены при выполнении добавления.

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

image = cv2.imread('perspective.jpeg')
for i in range(image.shape[1]):
    for j in range(image.shape[0]):

        up = np.float32(image[min(j + 1, image.shape[0]-1), i])
        down = image[max(j - 1, 0), i]
        right = image[j, min(i + 1, image.shape[1]-1)]
        left = image[j, max(i - 1, 0)]

        average = (up + down + left + right + image[j, i]) / 5

        image[j, i] = np.uint8(average)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...