在这篇文章中,我将讨论如何将图像缩小为铅笔轮廓,学习使用基本的计算机视觉和python的numpy库将任何图像转换为“铅笔素描”。
步骤
这个过程非常简单
- 灰度图像
- 反转它
- 模糊倒像
- Dodge混合了模糊和灰度图像。
我们可以从互联网上拍摄任何图像。
加载图片
import imageio
img =“ http://static.cricinfo.com/db/PICTURES/CMS/263600/263697.20.jpg ”
start_img = imageio.imread(img)
你可以看到python如何用s.shape看到这个图像
这是一个大小为196X160的3通道图像。
2.灰度
然后我们将图像设为黑白图像。Numpy没有任何内置的灰度函数,但我们可以使用公式轻松转换图像。你可以在这里了解这个公式的原因。
Y= 0.299 R + 0.587 G + 0.114 B
所以我们的功能看起来像:
import numpy as np
def grayscale(rgb):
return np.dot(rgb [...,:3],[0.299,0.587,0.114])
应用灰度
gray_img = grayscale(start_img)
3.反转图像
我们可以简单地通过从255减去图像来反转图像,因为灰度图像是8位图像或者具有最多256个色调。
inverted_img = 255-gray_img
4.模糊图像
通过对反转图像应用高斯滤波器来完成模糊。这里的关键是高斯函数或西格玛的标准偏差。随着西格玛增加,图像变得更加模糊。Sigma控制内核的范围,从而控制平滑程度。
import scipy.ndimage
blur_img = scipy.ndimage.filters.gaussian_filter(inverted_img,sigma = 5)
5. Dodge and Merge
“ Colour Dodge ” 混合模式将底层与反转的顶层分开。这取决于顶层的值,使底层变亮。我们有模糊的图像,突出了最大胆的边缘。由于我们所有的图像都被视为numpy,所有矩阵计算都是超快的。
def dodge(front,back):
result=front*255/(255-back)
result[result>255]=255
result[back==255]=255
return result.astype(‘uint8’)
final_img= dodge(blur_img,gray_img)
6.绘图并保存
我们可以使用plt.imgshow绘制我们的最终图像。请注意,我们需要保持cmap =“grey”
import matplotlib.pyplot as plt
plt.imshow(final_img, cmap=”gray”)
我们可以使用保存图像
plt.imsave('img2.png',final_img,cmap ='gray',vmin = 0,vmax = 255)
最后结果
整个过程
随着sigma的增加,pic变得更加清晰。
简明代码:
import imageio,numpy as np,scipy.ndimage, matplotlib.pyplot as plt
start_img = imageio.imread("http://p1.toutiaoimg.com/large/pgc-image/1532226624165fa95480f3f")
g=np.dot(start_img[...,:3], [0.299, 0.587, 0.114])
gray_inv_img = 255-g
blur_img = scipy.ndimage.filters.gaussian_filter(gray_inv_img,sigma=5)
def dodge(front,back):
result=front*255/(255-back)
result[result>255]=255
result[back==255]=255
return result.astype('uint8')
final_img= dodge(blur_img,g)
plt.imshow(final_img, cmap="gray")