рассчитать недостающие значения пикселей по краям - PullRequest
0 голосов
/ 28 августа 2018

мое примерное изображение выглядит так:

array([[2, 0, 2, 0, 3, 0],
       [0, 0, 0, 0, 0, 0],
       [2, 0, 2, 0, 4, 0],
       [0, 0, 0, 0, 0, 0],
       [9, 0, 3, 0, 3, 0],
       [0, 0, 0, 0, 0, 0]])

Я хочу вычислить все значения отсутствующих пикселей, которые равны 0, на основе значений соседних пикселей.

Формула для расчета недостающего пикселя выглядит следующим образом:

Kernel

Где DN - доступные значения, X - значения, выбранные DN, и должны быть заполнены.

X01 = 0.5 DN00 + 0.5 DN02

X10 = 0.5 DN00 + 0.5 DN20

X11 = 0.25 DN00 + 0.25 DN02 + 0.25 DN20 + 0.25 DN22

X12 = 0.5 DN02 + 0.5 DN22

X21 = 0.5 DN20 + 0.5 DN22

До сих пор я пытался convolve2d на изображении с

from scipy.signal import convolve2d

kernel =  array([[1. , 0.5, 1. ],
                 [0.5, 1. , 0.5],
                 [1. , 0.5, 1. ]])

convolve2d(a, kernel, boundary='wrap', mode='same')

но вывод неправильный:

array([[ 2. ,  2. ,  2. ,  2.5,  3. ,  2.5],
       [ 2. ,  8. ,  2. , 11. ,  3.5, 11. ],
       [ 2. ,  2. ,  2. ,  3. ,  4. ,  3. ],
       [ 5.5, 16. ,  2.5, 12. ,  3.5, 18. ],
       [ 9. ,  6. ,  3. ,  3. ,  3. ,  6. ],
       [ 5.5, 16. ,  2.5, 11. ,  3. , 17. ]])

что я здесь не так делаю? любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 августа 2018

Вы пытаетесь решить эту проблему с помощью операции, которая не соответствует вашему функциональному определению. Это не простая операция свертки; операция зависит от ткани окна. С данным массивом a вы хотите среднее значение ненулевых элементов. Почему бы не написать свой фильтр таким образом?

Ваш данный фильтр неправильно обрабатывает все, кроме пятен непосредственно между двумя ненулевыми записями: существующие элементы вообще не должны изменяться, но фильтр разрезает их пополам; для записей "центр четырех углов" фильтр принимает полный вес для двух углов и игнорирует остальные.


После того как ОП обновил вопрос:

Намного лучше. Теперь, что произойдет, если вы измените ядро ​​так, чтобы оно определенно обрабатывало случай элемента в четыре угла, как показано ниже?

kernel = array([[0.25, 0.5, 0.25],
                [0.5 , 1. , 0.5 ],
                [0.25, 0.5, 0.25]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...