通过Python代码实现照片秒变艺术素描画效果

 更新时间:2025年11月07日 08:23:26   作者:烛阴  
这篇文章主要介绍了通过Python和OpenCV实现照片素描效果的“三步走”策略,并提供了示例代码,步骤包括灰度化、反转与模糊以及混合,最终生成类似铅笔素描的艺术效果,需要的朋友可以参考下

准备工作

安装必要的第三方库

pip install opencv-python
pip install numpy
pip install matplotlib # 用于在Jupyter Notebook或脚本中方便地显示图像

素描效果的“三步走”战略

  1. 灰度化:素描是黑白的,所以第一步是去除色彩信息。
  2. 反转与模糊:这是最关键的一步,我们通过反转灰度图并进行高斯模糊,来创建出图像的“底片”,这为后面生成线条打下基础。
  3. 混合:将原始的灰度图与模糊后的“底片”进行混合,创造出类似铅笔笔触的明暗对比效果。

示例代码

我们把上述步骤翻译成 Python 和 OpenCV 代码。

import cv2
import matplotlib.pyplot as plt

def image_to_sketch(image_path):
    """
    将指定路径的图像转换为素描风格。
    """
    # 步骤 1: 读取图像并转换为灰度图
    # cv2.imread() 用于读取图片
    # cv2.cvtColor() 用于转换颜色空间,cv2.COLOR_BGR2GRAY 表示从BGR(OpenCV默认)转为灰度
    img_bgr = cv2.imread(image_path)
    if img_bgr is None:
        print(f"错误: 无法读取图片,请检查路径 '{image_path}' 是否正确。")
        return
      
    img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

    # 步骤 2: 反转灰度图 (形成“底片”)
    # cv2.bitwise_not() 用于按位取反,白色变黑色,黑色变白色
    img_gray_inverted = cv2.bitwise_not(img_gray)

    # 步骤 3:对反转后的图像进行高斯模糊
    # cv2.GaussianBlur() 用于模糊图像,以平滑细节
    # (21, 21) 是高斯核的大小,必须是奇数,值越大,模糊程度越高
    img_blur = cv2.GaussianBlur(img_gray_inverted, (21, 21), 0)

    # 步骤 4: 再次反转模糊后的图像
    img_blur_inverted = cv2.bitwise_not(img_blur)
  
    # 步骤 5: 关键一步!用颜色减淡(Color Dodge)方法混合灰度图和模糊反转图
    # cv2.divide() 将两个图像相除,可以模拟出颜色减淡的效果
    # 256.0 是为了防止除以0的错误,并确保结果是浮点数以便精确计算
    img_sketch = cv2.divide(img_gray, img_blur_inverted, scale=256.0)

    return img_bgr, img_sketch

# --- 主程序 ---
if __name__ == "__main__":
    # 替换成你自己的图片路径
    input_image_path = 'my_photo.jpg' 
  
    original_image, sketch_image = image_to_sketch(input_image_path)

    if original_image is not None and sketch_image is not None:
        # 使用 Matplotlib 显示原始图像和素描图像
        plt.figure(figsize=(10, 5))

        # 显示原始图像 (注意OpenCV的BGR要转为RGB)
        plt.subplot(1, 2, 1)
        plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
        plt.title('Original Image')
        plt.axis('off')

        # 显示素描图像
        plt.subplot(1, 2, 2)
        plt.imshow(sketch_image, cmap='gray')
        plt.title('Sketch')
        plt.axis('off')

        plt.show()

        # 如果想保存结果
        output_image_path = 'my_photo_sketch.jpg'
        cv2.imwrite(output_image_path, sketch_image)
        print(f"素描图像已保存至: {output_image_path}")

效果

结语

到此这篇关于通过Python代码实现照片秒变艺术素描画效果的文章就介绍到这了,更多相关Python照片素描画效果内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python自动计算图像数据集的RGB均值

    python自动计算图像数据集的RGB均值

    这篇文章主要为大家详细介绍了python自动计算图像数据集的RGB均值,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Python3中对json格式数据的分析处理

    Python3中对json格式数据的分析处理

    这篇文章主要介绍了Python3中对json格式数据的分析处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Python基于smtplib协议实现发送邮件

    Python基于smtplib协议实现发送邮件

    这篇文章主要介绍了Python基于smtplib协议实现发送邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • python matplotlib绘图,修改坐标轴刻度为文字的实例

    python matplotlib绘图,修改坐标轴刻度为文字的实例

    今天小编就为大家分享一篇python matplotlib绘图,修改坐标轴刻度为文字的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Django接收post前端返回的json格式数据代码实现

    Django接收post前端返回的json格式数据代码实现

    这篇文章主要介绍了Django接收post前端返回的json格式数据代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 深入理解Python中字典的键的使用

    深入理解Python中字典的键的使用

    这篇文章主要介绍了深入理解Python中字典的键的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • TensorFlow卷积神经网络MNIST数据集实现示例

    TensorFlow卷积神经网络MNIST数据集实现示例

    这篇文章主要介绍了TensorFlow卷积神经网络MNIST数据集的实现示例的过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • 详解Python类的定义与实例

    详解Python类的定义与实例

    这篇文章给大家介绍Python类的定义与实例,下面是一个使用 NewSpaceGraph 类的示例,展示了如何实例化该类并调用其方法,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Python编程中Python与GIL互斥锁关系作用分析

    Python编程中Python与GIL互斥锁关系作用分析

    GIL互斥锁用来保护Python世界里的对象,防止同一时刻多个线程执行Python字节码,确保线程安全,但也导致Python线程无法利用多核CPU优势,本文来探讨Python将来是否有可能去除GIL
    2021-09-09
  • Python tkinter如何设置背景颜色

    Python tkinter如何设置背景颜色

    本文主要介绍了Python的tkinter库中设置组件背景颜色的方法,主要通过使用bg选项和config方法来实现,包括设置单个组件、窗口、按钮、文本框以及整个应用的背景颜色,同时也可以使用十六进制颜色代码进行更精确的颜色控制
    2024-09-09

最新评论