我们知道图片除了最普通的彩色图,还有很多类型,比如素描,卡通,黑白等等,今天就介绍如何使用python和opencv来实现图片变素描图。
首先将彩色图转换成灰度图;
对灰度图进行求其反色的操作;
对第2步得到的结果采用一个高斯模糊的操作;
采用颜色亮化(color dodge)的技术将第一步的灰度图和第三步操作后的图片进行混合。
事先准备,首先是安装好 opencv,可以直接通过 pip 进行安装:
pip install opencv-python
接着准备一张图片,最好是颜色鲜明一点的图片,方便对比转换的效果。
Python学习交流群:556370268,有大牛答疑,有资源共享!有想学习python编程的,想提升自己能力的,欢迎加入讨论学习。
上面的代码是读取图片后,再通过调用 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)
效果如下图所示:
完整版代码如下所示:
如果你依然在编程的世界里迷茫,不知道自己的未来规划,对python感兴趣,这里推荐一下我的学习交流群:556370268,里面都是学习python的,从最基础的python【python,游戏,黑客技术,网络安全,数据挖掘,爬虫】到网络安全的项目实战的学习资料都有整理,送给每一位python小伙伴,希望能帮助你更了解python,学习python
最后,还有一种更加快速的实现,代码如下所示,仅需四行代码即可实现转换成素描图的效果。
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)
用一个女演员的照片来看看这个转换的效果:
好像。。昂,,还是彩色的好看
网友评论