找回密码
  注册[Register]
查看: 1701|回复: 32

[windows] 不给你的女朋友来张素描吗?使用python将图片转素描

    [复制链接]
发表于 2020-4-19 14:08 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

本帖最后由 woshi98 于 2020-4-19 14:10 编辑

本工具使用python编写,将彩色图片转成黑白素描手绘图。
在python源码里可以调节其参数,尽量调到最好的效果。
使用颜色鲜艳的图片效果更佳!!
将图片转为素描主要有4个步骤:
  • 首先将彩色图转换成灰度图;
  • 对灰度图进行求其反色的操作;
  • 对第2步得到的结果采用一个高斯模糊的操作;
  • 采用颜色亮化(color dodge)的技术将第一步的灰度图和第三步操作后的图片进行混合。


主要使用的是opencv模块。

原图:
1.jpg

素描图:
2.jpg


原图:
3.jpg
素描图:
4.jpg

原图:
5.jpg
素描图: 6.jpg

软件运行界面:
7.png


源码:
  1. # -*- coding:utf-8 -*-


  2. import cv2
  3. import numpy as np
  4. from tkinter import filedialog, Tk
  5. from os import getcwd
  6. from re import findall


  7. def open_path():
  8.     # 图片路径
  9.     root = Tk()
  10.     root.withdraw()
  11.     file_path = (filedialog.askopenfilename(title='选择图片文件', filetypes=[('All Files', '*')]))
  12.     return file_path


  13. def dodgeNaive(image, mask):
  14.     # determine the shape of the input image
  15.     width, height = image.shape[:2]

  16.     # prepare output argument with same size as image
  17.     blend = np.zeros((width, height), np.uint8)

  18.     for col in range(width):
  19.         for row in range(height):
  20.             # do for every pixel
  21.             if mask[col, row] == 255:
  22.                 # avoid division by zero
  23.                 blend[col, row] = 255
  24.             else:
  25.                 # shift image pixel value by 8 bits
  26.                 # divide by the inverse of the mask
  27.                 tmp = (image[col, row] << 8) / (255 - mask)
  28.                 # print('tmp={}'.format(tmp.shape))
  29.                 # make sure resulting value stays within bounds
  30.                 if tmp.any() > 255:
  31.                     tmp = 255
  32.                     blend[col, row] = tmp

  33.     return blend


  34. def dodgeV2(image, mask):
  35.     return cv2.divide(image, 255 - mask, scale=256)


  36. def burnV2(image, mask):
  37.     return 255 - cv2.divide(255 - image, 255 - mask, scale=256)


  38. def rgb_to_sketch(src_image_name):
  39.     print('转换中......')
  40.     img_rgb = cv2.imread(src_image_name)
  41.     img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
  42.     # 读取图片时直接转换操作
  43.     # img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

  44.     img_gray_inv = 255 - img_gray
  45.     img_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),
  46.                                 sigmaX=0, sigmaY=0)
  47.     img_blend = dodgeV2(img_gray, img_blur)

  48.     # cv2.imshow('original', img_rgb)
  49.     # cv2.imshow('gray', img_gray)
  50.     # cv2.imshow('gray_inv', img_gray_inv)
  51.     # cv2.imshow('gray_blur', img_blur)
  52.     cv2.imwrite(dst_image_name, img_blend)
  53.     save_path = getcwd() + "\" + dst_image_name  # 保存路径
  54.     print('转换完成!!!\n')
  55.     print('保存路径:' + save_path)
  56.     cv2.imshow(save_path, img_blend)
  57.     cv2.waitKey(0)
  58.     cv2.destroyAllWindows()


  59. if __name__ == '__main__':
  60.     print('请选择图片(路径不要含中文):')
  61.     src_image_name = open_path()  # 文件路径
  62.     print(src_image_name+'\n')
  63.     image_name = ''.join(findall(r'[^\\/:*?"<>|\r\n]+
  64. [/size]
  65. [/font][/color]


  66. [color=#444444][font=-apple-system, BlinkMacSystemFont, &quot]打包后exe蓝奏云下载地址:[/font][/color][hide]https://www.lanzoux.com/ib1434d[/hide]
  67. , src_image_name))  # 获取文件名
  68.     dst_image_name = 'Sketch_' + image_name
  69.     rgb_to_sketch(src_image_name)
复制代码





打包后exe蓝奏云下载地址:
游客,如果您要查看本帖隐藏内容请回复


如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-4-19 14:09 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 14:09 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 14:17 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 14:22 | 显示全部楼层
好的,非常感谢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 14:23 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 14:23 | 显示全部楼层
正需要,支持楼主,在大牛我只看好你!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 14:40 | 显示全部楼层
感谢楼主分享!大牛有你更精彩!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 15:32 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-4-19 17:18 | 显示全部楼层
感谢楼主分享!大牛有你更精彩!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-5-19 21:15 , Processed in 0.043493 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表