Как я могу смягчить только края этого изображения - PullRequest
0 голосов
/ 25 сентября 2019

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

Зубчатое изображение

Есть ли способ сгладить краячтобы они выглядели больше так, не влияя на остальную часть изображения?

Сглаженный край

Спасибо SoS

** ОБНОВЛЕНИЕ **

Добавлено исходное зубчатое изображение без аннотации Оригинальное зубчатое изображение

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

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

Ввод:

enter image description here

import cv2
import numpy as np
import skimage.exposure


# load image with alpha channel
img = cv2.imread('lena_circle.png', cv2.IMREAD_UNCHANGED)

# extract only bgr channels
bgr = img[:, :, 0:3]

# extract alpha channel
a = img[:, :, 3]

# blur alpha channel
ab = cv2.GaussianBlur(a, (0,0), sigmaX=2, sigmaY=2, borderType = cv2.BORDER_DEFAULT)

# stretch so that 255 -> 255 and 127.5 -> 0
aa = skimage.exposure.rescale_intensity(ab, in_range=(127.5,255), out_range=(0,255))

# replace alpha channel in input with new alpha channel
out = img.copy()
out[:, :, 3] = aa

# save output
cv2.imwrite('lena_circle_antialias.png', out)

# Display various images to see the steps
# NOTE: In and Out show heavy aliasing. This seems to be an artifact of imshow(), which did not display transparency for me. However, the saved image looks fine

cv2.imshow('In',img)
cv2.imshow('BGR', bgr)
cv2.imshow('A', a)
cv2.imshow('AB', ab)
cv2.imshow('AA', aa)
cv2.imshow('Out', out)

cv2.waitKey(0)
cv2.destroyAllWindows()


enter image description here

Я ни в коем случае не эксперт в OpenCV.Я посмотрел на cv2.normalize (), но это не выглядело так, как будто я мог предоставить свои собственные наборы входных и выходных значений.Поэтому я также попытался использовать следующее добавление отсечения, чтобы убедиться, что нет переполнений или недопотоков:

aa = a*2.0 - 255.0
aa[aa<0] = 0
aa[aa>0] = 255


, где я вычислил это из решения одновременных уравнений таким образом, что в = 255 становитсяout = 255 и in = 127.5 становится out = 0 и выполняет линейное растяжение между:

C = A*X+B
255 = A*255+B
0 = A*127.5+B
Thus A=2 and B=-127.5


Но это работает не так хорошо, как лыжный маг rescale_intensity.

1 голос
/ 25 сентября 2019

Вот некоторые эффекты, которые вы можете сделать с помощью библиотеки PIL image:

from PIL import Image, ImageFilter
im_1 = Image.open("/constr/pics1/russian_doll.png") 
im_2 = im_1.filter(ImageFilter.BLUR) 
im_3 = im_1.filter(ImageFilter.CONTOUR) 
im_4 = im_1.filter(ImageFilter.DETAIL) 
im_5 = im_1.filter(ImageFilter.EDGE_ENHANCE) 
im_6 = im_1.filter(ImageFilter.EDGE_ENHANCE_MORE) 
im_7 = im_1.filter(ImageFilter.EMBOSS) 
im_8 = im_1.filter(ImageFilter.FIND_EDGES) 
im_9 = im_1.filter(ImageFilter.SMOOTH) 
im_10 = im_1.filter(ImageFilter.SMOOTH_MORE) 
im_11 = im_1.filter(ImageFilter.SHARPEN)

# now save the images

im_2.save("/constr/picsx/russian_dol_BLUR.png") 
im_3.save("/constr/picsx/russian_doll_CONTOUR.png") 
im_4.save("/constr/picsx/russian_doll_DETAIL.png") 
im_5.save("/constr/picsx/russian_doll_EDGE_ENHANCE.png") 
im_6.save("/constr/picsx/russian_doll_EDGE_ENHANCE_MORE.png") 
im_7.save("/constr/picsx/russian_doll_EMBOSS.png") 
im_8.save("/constr/picsx/russian_doll_FIND_EDGES.png") 
im_9.save("/constr/picsx/russian_doll_SMOOTH.png") 
im_10.save("/constr/picsx/russian_doll_SMOOTH_MORE.png") 
im_11.save("/constr/picsx/russian_doll_SHARPEN.png")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...