今天分享的代码主要功能是批量将任意图片转化为素描图,我转了几个效果还是不错的,你也赶快去试试吧!
代码我已编好,你拿走运行即可
# encoding=utf8
'''
Python-opencv批量将任意图片转化为素描图
'''
# 导入包
import cv2
import numpy as np
import os
# 定义方法
def dodgeNaive(image, mask):
# 确定输入图像的形状
width, height = image.shape[:2]
# 准备与图像大小相同的输出参数
blend = np.zeros((width, height), np.uint8)
for col in range(width):
for row in range(height):
# 对每个像素执行此操作
if mask[col, row] == 255:
# 避免被零除
blend[col, row] = 255
else:
# 将图像像素值移位8位
# 除以掩模的倒数
tmp = (image[col, row] << 8) / (255 - mask)
# print('tmp={}'.format(tmp.shape)) # 调试代码
# 确保结果值保持在范围内
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, dst_image_name):
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) # 调试转换1
# cv2.imshow('gray', img_gray) # 调试转换2
# cv2.imshow('gray_inv', img_gray_inv) # 调试转换3
# cv2.imshow('gray_blur', img_blur) # 调试转换4
# cv2.imshow("pencil sketch", img_blend) # 调试转换5
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(dst_image_name, img_blend)
def imageSketch(imagepath, squarepath):
'''读取图片并进行批量素描图转换'''
files = os.listdir(imagepath) # 读取指定目录中的所有文件
for f in files:
file_p = os.path.join(imagepath, f) # 图片原始位置
squar_p = os.path.join(squarepath, f) # 素描图保存位置
if not os.path.exists(squarepath):
os.mkdir(squarepath) # 如果目不存在就创建
rgb_to_sketch(file_p, squar_p)
print(file_p, '==>' ,squar_p)
if __name__ == '__main__':
# 存放待处理图片的目录
imagepath = r'D:\Test\image'
# 图片处理结果保存目录
squarepath = r'D:\Test\square'
# 执行方法
imageSketch(imagepath, squarepath)
# src_image_name = r'D:\Test\image\24e4 (1).jpeg'
# dst_image_name = r'D:\Test\square\24e4 (1).jpeg'
# rgb_to_sketch(src_image_name, dst_image_name)