[实战] 图片转素描图

本文介绍了如何使用Python和OpenCV将彩色图片转换为素描图,包括四个步骤:彩色图转灰度图、灰度图反色、高斯模糊以及混合操作。详细阐述了每个步骤的实现原理和代码示例,并展示了不同方法的转换效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文大约 2000 字,阅读大约需要 6 分钟

我们知道图片除了最普通的彩色图,还有很多类型,比如素描、卡通、黑白等等,今天就介绍如何使用 Python 和 Opencv 来实现图片变素描图。

主要参考这篇文章来实现–How to create a beautiful pencil sketch effect with OpenCV and Python

简介

如何将图片转换成素描图呢,只需要下面四个步骤即可:

  1. 首先将彩色图转换成灰度图;
  2. 对灰度图进行求其反色的操作;
  3. 对第2步得到的结果采用一个高斯模糊的操作;
  4. 采用颜色亮化(color dodge)的技术将第一步的灰度图和第三步操作后的图片进行混合。

事先准备,首先是安装好 opencv,可以直接通过 pip 进行安装:

pip install opencv-python

接着准备一张图片,最好是颜色鲜明一点的图片,方便对比转换的效果。

原图

第一步:彩色图变灰度图

第一步变成灰度图,其实非常简单,直接调用 opencv 的函数即可,如下面代码所示:

import cv2

img_rgb = cv2.imread('example.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)

图片转换效果如下所示:

图片转灰度图

上面的代码是读取图片后,再通过调用cv2.cvtColor函数将图片转换成灰度图,实际上我们可以直接在读取图片时候就直接转换图片,即:

img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

这里调用cv2.imread函数时,设置了cv2.IMREAD_GRAYSCALE的标志,表示加载灰度图。在imread函数中是设置了三种标志,分别是

  • cv2.IMREAD_COLOR : 默认使用该种标识。加载一张彩色图片,忽视它的透明度。
  • cv2.IMREAD_GRAYSCALE : 加载一张灰度图。
  • cv2.IMREAD_UNCHANGED : 加载图像,包括它的Alpha 通道(Alpha 表示图片的透明度)。

另外,如果觉得以上标志太长,可以简单使用 1,0,-1 代替,效果是相同的。

第二步:灰度图进行反色操作

第二步就是对灰度图进行反色操作,其实就是非常简单的采用灰度图的最大像素值 255 减去当前像素值即可(因为灰度图的范围是[0, 255]),代码如下所示:

img_gray_inv = 255 - img_gray

结果如下所示:

灰度图反色

其实就是原本比较暗的地方变光亮了,而比较亮的地方变暗了。

第三步:高斯模糊

高斯模糊操作是一个有效减少图片噪音以及对图片进行平滑操作的方法,在数学上等价于对图像采用高斯核进行卷积的操作。我们可以直接调用cv2.GaussianBlur来实现高斯模糊操作,这里需要设置参数ksize,表示高斯核的大小,sigmaXsigmaY分别表示高斯核在 X 和 Y 方向上的标准差。

img_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),
                            sigmaX=0, sigmaY=0)

效果如下所示,右边图是进行高斯模糊后的结果,是有了一定的模糊效果。

高斯模糊

第四步:混合操作

第四步,就是见证奇迹的时刻!这一步骤自然就是需要得到最终的素描图结果了。在传统照相技术中,当需要对图片某个区域变得更亮或者变暗,可以通过控制它的曝光时间,这里就用到亮化(Dodging)和暗化(burning)的技术。

在现代图像编辑工具,比如 PS 可以实现上述说的两种技术。比如对于颜色亮化技术,给定一张图片 A 和 蒙版 B,那么实现做法如下所示:

(B[
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spearhead_cai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值