版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/86603100
简述
在Cartoon GAN的实现中提到了这种思想。但是在网上没有找到对应的实现,就自己研究了一波。
处理思路
- Canny边缘提取
- 用dilate做膨化,用一个粗颗粒,再用一个细颗粒
- 粗颗粒的膨化结果用于提取原图像,之后,再做高斯模糊
- 细颗粒的膨化结果用于定位覆盖掉原图像的结果,将边缘部分贴回去
效果展示
处理前 | 处理后 |
---|---|
代码
import cv2
img = cv2.imread('corgi.jpg')
data = (150, 150)
img_copy = img.copy()
imgCanny = cv2.Canny(img, *data)
# 创建矩形结构
g = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
g2 = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
# 膨化处理
# 更细腻
img_dilate = cv2.dilate(imgCanny, g)
# 更粗大
img_dilate2 = cv2.dilate(imgCanny, g2)
shape = img_dilate.shape
# 提取
for i in range(shape[0]):
for j in range(shape[1]):
if img_dilate2[i, j] == 0: # 二维定位到三维
img[i, j] = [0, 0, 0]
dst = cv2.GaussianBlur(img, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
for i in range(shape[0]):
for j in range(shape[1]):
if img_dilate[i, j] != 0: # 二维定位到三维
img_copy[i, j] = dst[i, j]
cv2.imshow('dst', img_copy)
cv2.imwrite('corgi-edge-blur.png', img_copy)
cv2.waitKey()
cv2.destroyAllWindows()