美文网首页IT技术
2020-07-24 不给你的女朋友来张素描吗?使用python

2020-07-24 不给你的女朋友来张素描吗?使用python

作者: 昨天今天下雨天1 | 来源:发表于2020-07-24 08:54 被阅读0次

    本工具使用python编写,将彩色图片转成黑白素描手绘图。
    在python源码里可以调节其参数,尽量调到最好的效果。
    使用颜色鲜艳的图片效果更佳!!参考文章:http://www.askaswiss.com/2016/01/how-to-create-pencil-sketch-opencv-python.html

    将图片转为素描主要有4个步骤:

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

    主要使用的是opencv模块。

    原图:


    12321111-24787f45561b4404.jpg

    素描图:


    12321111-f8ec538fac43e5b2.jpg

    源码:

    # -*- coding:utf-8 -*-
     
     
    import cv2
    import numpy as np
    from tkinter import filedialog, Tk
    from os import getcwd
    from re import findall
     
     
    def open_path():
        # 图片路径
        root = Tk()
        root.withdraw()
        file_path = (filedialog.askopenfilename(title='选择图片文件', filetypes=[('All Files', '*')]))
        return file_path
     
     
    def dodgeNaive(image, mask):
        # determine the shape of the input image
        width, height = image.shape[:2]
     
        # prepare output argument with same size as image
        blend = np.zeros((width, height), np.uint8)
     
        for col in range(width):
            for row in range(height):
                # do for every pixel
                if mask[col, row] == 255:
                    # avoid division by zero
                    blend[col, row] = 255
                else:
                    # shift image pixel value by 8 bits
                    # divide by the inverse of the mask
                    tmp = (image[col, row] << 8) / (255 - mask)
                    # print('tmp={}'.format(tmp.shape))
                    # make sure resulting value stays within bounds
                    if tmp.any() > 255:
                        tmp = 255
                        blend[col, row] = tmp
     
        return blend
     
     
    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(src_image_name):
        print('转换中......')
        img_rgb = cv2.imread(src_image_name)
        img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
        # 读取图片时直接转换操作
        # img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
     
        img_gray_inv = 255 - img_gray
        img_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),
                                    sigmaX=0, sigmaY=0)
        img_blend = dodgeV2(img_gray, img_blur)
     
        # cv2.imshow('original', img_rgb)
        # cv2.imshow('gray', img_gray)
        # cv2.imshow('gray_inv', img_gray_inv)
        # cv2.imshow('gray_blur', img_blur)
        cv2.imwrite(dst_image_name, img_blend)
        save_path = getcwd() + "\\" + dst_image_name  # 保存路径
        print('转换完成!!!\n')
        print('保存路径:' + save_path)
        cv2.imshow(save_path, img_blend)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
     
     
    if __name__ == '__main__':
        print('请选择图片(路径不要含中文):')
        src_image_name = open_path()  # 文件路径
        print(src_image_name+'\n')
        image_name = ''.join(findall(r'[^\\/:*?"<>|\r\n]+$', src_image_name))  # 获取文件名
        dst_image_name = 'Sketch_' + image_name
        rgb_to_sketch(src_image_name)
    
    

    打包后exe蓝奏云下载地址:https://www.lanzous.com/ib1434d

    相关文章

      网友评论

        本文标题:2020-07-24 不给你的女朋友来张素描吗?使用python

        本文链接:https://www.haomeiwen.com/subject/evwdlktx.html