我们知道图片除了最普通的彩 ***, 还有很多类型, 比如素描, 卡通, 黑白等等, 今天就介绍如何使用 python 和 opencv 来实现图片变素描图.
首先将彩 *** 转换成灰度图;
对灰度图进行求其反色的操作;
对第 2 步得到的结果采用一个高斯模糊的操作;
采用颜色亮化 (color dodge) 的技术将第一步的灰度图和第三步操作后的图片进行混合.
事先准备, 首先是安装好 opencv, 可以直接通过 pip 进行安装:
pip install opencv-python
接着准备一张图片, 最好是颜色鲜明一点的图片, 方便对比转换的效果.
如果大家想找一个 Python 学习环境, 可以加入我们的 Python 学习圈: 784758214 http://0x9.me/9LBJY , 自己是一名高级 python 开发工程师, 这里有我自己整理了一套最新的 python 系统学习教程, 包括从基础的 python 脚本到 web 开发, 爬虫, django, 人工智能, 机器学习等. 送给正在学习 python 的小伙伴! 每天会准时的讲一些项目实战案例, 分享一些学习的方法和需要注意的小细节,, 这里是 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)
效果如下图所示:
完整版代码如下所示:
最后, 还有一种更加快速的实现, 代码如下所示, 仅需四行代码即可实现转换成素描图的效果.
- 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)
用一个女演员的照片来看看这个转换的效果:
好像.. 昂,, 还是彩色的好看
来源: http://www.bubuko.com/infodetail-3038805.html