Сгладьте края двоичных изображений (Face), используя Python и Open CV - PullRequest
2 голосов
/ 29 мая 2020

Я ищу идеальный способ сгладить края двоичных изображений. Проблема в том, что двоичное изображение выглядит как лестница, похожая на границы, что очень неприятно для моего дальнейшего процесса маскирования.

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

Проблемное изображение Ожидаемый результат

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Чтобы сохранить резкость двоичного изображения, я бы рекомендовал применить что-то вроде медианного фильтра . Вот пример этого:

from PIL import Image, ImageFilter


image = Image.open('input_image.png')
image = image.filter(ImageFilter.ModeFilter(size=13))
image.save('output_image.png')

, что дает нам следующие результаты:

Input image Output image

Рисунок 1. Слева: Исходное входное изображение. Справа: Выходное изображение со средним фильтром размера 13.

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

1 голос
/ 29 мая 2020

Вы можете сделать это в Python / OpenCV с помощью Skimage, размыв двоичное изображение. Затем примените односторонний зажим.

Ввод:

enter image description here

import cv2
import numpy as np
import skimage.exposure

# load image
img = cv2.imread('bw_image.png')

# blur threshold image
blur = cv2.GaussianBlur(img, (0,0), sigmaX=3, sigmaY=3, borderType = cv2.BORDER_DEFAULT)

# stretch so that 255 -> 255 and 127.5 -> 0
# C = A*X+B
# 255 = A*255+B
# 0 = A*127.5+B
# Thus A=2 and B=-127.5
#aa = a*2.0-255.0 does not work correctly, so use skimage
result = skimage.exposure.rescale_intensity(blur, in_range=(127.5,255), out_range=(0,255))

# save output
cv2.imwrite('bw_image_antialiased.png', result)

# Display various images to see the steps
cv2.imshow('result', result)

cv2.waitKey(0)
cv2.destroyAllWindows()


enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...