码出最快的美女素描图像


背景

通过Python将一张精致的美女图像转换为素描图像。

实现步骤

  • 实现需要用到的工具是 OpenCV 库,用 OpenCV 库里面的图片处理接口就能满足需求。
  • 安装OpenCV库
    pip install opencv-python
  • 我从手机相册中找了一张照片,发送到微信,然后保存到电脑上。
    原始图像
    具体步骤包含:读取图像、转换成灰度图片、反转灰度图像、创建铅笔图,保存并显示。
    具体如下代码:

第一种方式:

import cv2
def sketch():
    img = cv2.imread("E:\\ING_19032_02876.jpg")
    # 转换成灰度图片
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 反转灰度图像
    inverted_image = 255 - gray_img
    # 创建铅笔图
    blurred = cv2.GaussianBlur(inverted_image, (21, 21), 0)
    inverted_blurred = 255 - blurred
    pencil_sketch = cv2.divide(gray_img, inverted_blurred, scale=256.0)
    # 保存
    cv2.imwrite("E:\\ING_19032_02877.jpg",pencil_sketch)
    # 显示
    cv2.imshow("original", img)
    cv2.imshow("pencil", pencil_sketch)
    cv2.waitKey(0)
if __name__ == '__main__':
    sketch()

第一种方式结果展示

第二种方式:

# -*- coding: utf-8 -*-
# @Author  : Shajiu
# @FileName: sketch.py
# @Time    : 2021/8/14 11:34
from PIL import Image
import numpy as np
def sketch():
    img = np.asarray(Image.open(r"E:\\ING_19032_02876.jpg").convert('L')).astype('float')
    depth = 10.  # (0-100)
    grad = np.gradient(img)  # 取图像灰度的梯度值
    grad_x, grad_y = grad  # 分别取横纵图像梯度值
    grad_x = grad_x * depth / 100.
    grad_y = grad_y * depth / 100.
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A
    uni_y = grad_y / A
    uni_z = 1. / A
    vec_el = np.pi / 2.2  # 光源的俯视角度,弧度值
    vec_az = np.pi / 4.  # 光源的方位角度,弧度值
    dx = np.cos(vec_el) * np.cos(vec_az)  # 光源对x 轴的影响
    dy = np.cos(vec_el) * np.sin(vec_az)  # 光源对y 轴的影响
    dz = np.sin(vec_el)  # 光源对z 轴的影响
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)  # 光源归一化
    b = b.clip(0, 255)
    im = Image.fromarray(b.astype('uint8'))  # 重构图像
    im.save(r"E:\result111.jpg")
    print("保存成功,请查看")
if __name__ == '__main__':
    sketch()

第二种方式结果展示


文章作者: 沙九
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沙九 !
  目录
s's