У меня есть изображение с кучей битых пикселей. В python у меня есть один массив numpy, который будет содержать окончательное изображение, и у меня есть другой логический массив numpy той же формы, который указывает, какие пиксели необходимо заполнить.
Я хочу заполнить битые пиксели, взяв среднее из 8 окружающих пикселей, но только если они действительно содержат данные. Например, если у меня есть это (N означает, что там нет данных, - это пиксель для заполнения):
1 2 N
N ? 2
N N 5
Я заполню? с (1 + 2 + 2 + 5) / 4.
Прямо сейчас я делаю это с помощью для l oop следующим образом. outFrame содержит окончательное изображение, а заполненный - логический массив, указывающий, какие пиксели были заполнены:
# Loop through each pixel in the image
for row in range(height):
for col in range(width):
# Check to see if the pixel needs to be filled in
if not populated[row,col]:
# Check for boundary conditions
xmin = max(0,col-1)
xmax = min(width-1,col+1)
ymin = max(0,row-1)
ymax = min(height-1,row+1)
# Find the 8 surrounding values
vals = outFrame[ymin:ymax+1,xmin:xmax+1]
mask = populated[ymin:ymax+1,xmin:xmax+1]
# Find the average of only the populated pixels
if vals[mask].size != 0:
outFrame[row,col] = np.mean(vals[mask])
Очевидно, что python зацикливание идет медленно, но я не могу понять какие-либо индексные волхвы numpy c чтобы получить такое поведение. Есть ли способ быстро выполнить эту функцию в python?
РЕДАКТИРОВАТЬ: я попытался использовать функцию inpainting opencv следующим образом:
mask = (1*~populated).astype(np.uint8)
outFrame = cv2.inpaint(outFrame,mask,3,cv2.INPAINT_NS) # This is very slow
Однако, это было в 10 раз медленнее, чем мой оригинал метод (мой метод занимает ~ 3-6 секунд, в то время как метод рисования занял 60 секунд). У меня очень большое количество битых пикселей, и я думаю, что по этой причине он медленный для этого метода
РЕДАКТИРОВАТЬ: Вот пример изображения.
Необработанное изображение: https://imgur.com/a/ax3nOAK
После интерполяции: https://imgur.com/a/2apOe7p