本程序的功能是将彩色图片转成黑白素描手绘图,使用python编写(主要使用opencv模块),在python源码里可以调节其参数,尽量调到最好的效果,使用颜色鲜艳的图片效果更佳。
+ ?3 R0 b. u/ [" b/ Z, j
. t' A) r0 X o* Z7 T+ U
将图片转为素描主要有4个步骤:
: c2 w1 b' [, ]) P1、首先将彩色图转换成灰度图;
1 X) ~8 V9 D0 F- ~5 X2、对灰度图进行求其反色的操作;
" K" d) l6 T% E3、对第2步得到的结果采用一个高斯模糊的操作;# y6 s! F' ~+ T9 y9 q3 ]( N4 `. B
4、采用颜色亮化(color dodge)的技术将第一步的灰度图和第三步操作后的图片进行混合。4 B9 o5 ]& i A3 Y I' V
- # -*- 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)
|