使用opencv实现图像素描效果(含批量修改代码)

这是一个我觉得比较有用的小脚本,可以将我们的彩色图片转换成素描图,并且转换的效果我们还可以通过下面这句代码cv2.divide(img_gray, img_blur, scale=225)中的scale参数去调整,这个不妨自己尝试一下,不同的图像可能需要不同的数值

下面先来看一下效果如何
在这里插入图片描述
素描效果

from cv2 import cv2
import myutils
import os
def rgb_to_sketch(pic_path):
	img_rgb = cv2.imread(pic_name)
	img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)##转为灰度图
	##可改变图片的尺寸,只设置h或者只设置w就会按照等比例放大或缩小;若都指定,则按照指定的大小变换
	img_gray=myutils.resize(img_gray, height = 500)
	img_blur = cv2.GaussianBlur(img_gray, ksize=(21, 21), sigmaX=0, sigmaY=0)##高斯滤波
	##可改变scale的值来改变生成效果,scale越小,会让一些原本比较亮的区域变得更加清晰
	img_blend = cv2.divide(img_gray, img_blur, scale=225)##图像相除实现素描效果
	return img_blend

下面是批量转换操作,可以将指定文件夹下的所有图片转换成素描图
dir_path:图片所在的文件夹的路径

def convert_batch(dir_path):
	is_exist=os.path.exists(dir_path)
	if((is_exist==False)):
		print("该文件夹不存在,请输入正确的文件夹路径")
		return
	pic_name_list=os.listdir(dir_path)
	#print(pic_name_list)
	for pic_name in pic_name_list:
		pic_path = dir_path + "/" + pic_name
		img_blend = rgb_to_sketch(pic_path)
		pre_dst_name=pic_name.split('.')[0]
		dst_dir_path=dir_path+"_sketch"
		if not os.path.exists(dst_dir_path):
			os.makedirs(dst_dir_path)
		cv2.imwrite(dst_dir_path+'/'+pre_dst_name+"_sketch.jpg", img_blend)
		print("素描生成成功,图片名字是---%s"%(pre_dst_name+"_sketch.jpg"))

在myutils中其实就一个函数,它是对resize的一点修改,是为了方便实现hw的等比例缩放,函数如下:

import cv2
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
	dim = None
	(h, w) = image.shape[:2]
	if width is None and height is None:
		return image
	if width is None:
		r = height / float(h)
		dim = (int(w * r), height)
	else:
		r = width / float(w)
		dim = (width, int(h * r))
	resized = cv2.resize(image, dim, interpolation=inter)
	return resized
发布了27 篇原创文章 · 获赞 20 · 访问量 1563

猜你喜欢

转载自blog.csdn.net/qq_39507748/article/details/104445893