三行代码把女朋友照片变成了素描图片!以为我画的!爱我爱的不行
简介
如何将图片转换成素描图呢,只需要下面四个步骤即可:
首先将彩色图转换成灰度图;
对灰度图进行求其反色的操作;
对第2步得到的结果采用一个高斯模糊的操作;
采用颜色亮化(color dodge)的技术将第一步的灰度图和第三步操作后的图片进行混合。
事先准备,首先是安装好 opencv,可以直接通过 pip 进行安装:
pip install opencv-python
接着准备一张图片,最好是颜色鲜明一点的图片,方便对比转换的效果。
进群:548377875 即可获取数十套PDF哦!
上面的代码是读取图片后,再通过调用 cv2.cvtColor 函数将图片转换成灰度图,实际上我们可以直接在读取图片时候就直接转换图片,即:
img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
这里调用 cv2.imread 函数时,设置了 cv2.IMREAD_GRAYSCALE 的标志,表示加载灰度图。在imread 函数中是设置了三种标志,分别是
其实就是原本比较暗的地方变光亮了,而比较亮的地方变暗了。
第三步:高斯模糊
高斯模糊操作是一个有效减少图片噪音以及对图片进行平滑操作的方法,在数学上等价于对图像采用高斯核进行卷积的操作。我们可以直接调用 cv2.GaussianBlur 来实现高斯模糊操作,这里需要设置参数 ksize ,表示高斯核的大小, sigmaX 和 sigmaY 分别表示高斯核在 X 和 Y 方向上的标准差。
在现代图像编辑工具,比如 PS 可以实现上述说的两种技术。比如对于颜色亮化技术,给定一张图片 A 和 蒙版 B,那么实现做法如下所示:
(B[idx] == 255)?B[idx]:min(255, ((A[idx] << 8) / (255-B[idx])))
通过 python 代码实现上述公式,那么原始代码如下所示:
上述代码虽然实现了这个功能,但是很明显会非常耗时,中间采用了一个两层循环,计算复杂度是 O(w*h) ,也就是如果图片的宽和高的乘积越大,耗时就越长,所以就有了升级版的代码版本:
def dodgeV2(image, mask):
return cv2.divide(image, 255 - mask, scale=256)
运行上述代码,得到的最终结果如下所示:
效果看起来还可以,除了右下角部分对于原图中黑色区域处理得不是很好。
而另一种技术—-暗化操作的代码如下所示:
def burnV2(image, mask):
return 255 - cv2.divide(255 - image, 255 - mask, scale=256)
效果如下图所示:
完整版代码如下所示:
最后,还有一种更加快速的实现,代码如下所示,仅需四行代码即可实现转换成素描图的效果。
def rgb_to_sketch_v2(src_image_name):
img_gray = cv2.imread(src_image_name, 0)
img_blur = cv2.GaussianBlur(img_gray, (21, 21), 0, 0)
img_blend = cv2.divide(img_gray, img_blur, scale=256)
img_result = cv2.cvtColor(img_blend, cv2.COLOR_GRAY2BGR)
最后用本人比较喜欢的一个女演员的照片来看看这个转换的效果:
效果还是挺不错的!
可以逗女朋友了哦!