大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用3-批量图片生成素描图片的应用,将一张图像转换为素描风格的图像的其实是模拟了人类视觉在观察物体时受到的光照条件。素描风格的图像在灰度值上表现出明暗交替的效果,这种效果是通过对原始图像进行梯度计算和光照调整的过程来实现的,本文使用两种方法实现。
一、彩色图像转换为素描风格
将一张彩色或灰度图像转换为素描风格的图像可以分为以下几个步骤:
1.首先将彩色图像转换成灰度图像,以便更好地处理图像的灰度变化。
2.计算图像的梯度(即每个像素相对于相邻像素之间的差异),以便理解图像中的明暗信息。可以使用 Sobel 滤波器或其他梯度滤波器来计算梯度值。
3.根据光照条件,计算每个像素的灰度值。这通常涉及将梯度值与光线方向向量进行点积,并在最终公式中进行调整,以便调整图像的明暗程度。
4.对图像进行阈值化或调整,以展现梯度和光照效果,以便更好地突出图像的明暗变化,从而生成类似于素描风格的图像。
二、图片转素描实现的方法
实现方法:利用每个像素点在灰度区间上的变化来模拟阴影效果,从而生成一张类似于素描图的效果图。素描图片生成函数设置 depth
可以调节图像生成的效果,depth
越大,图像的梯度越明显,depth
越小,生成的素描图效果越淡化,我们可以根据实际情况进行调节,也可以遍历depth选出最佳的depth值
。下面是实现代码:
方法一:
from PIL import Image
import numpy as np
import os
def img2sketch(path,save_path,depth):
a = np.asarray(Image.open(path).convert('L')).astype('float') #根据灰度变化来模拟人类视觉的明暗程度
grad=np.gradient(a) #提取梯度值
grad_x,grad_y=grad #解构赋给grad_X,grad_y
grad_x=grad_x*depth/100.
grad_y=grad_y*depth/100.
A = np.sqrt(grad_x **2 + grad_y **2 +1.)
uni_x =grad_x/A
uni_y =grad_y /A
uni_z=1./A
vec_el= np.pi/2.2 #光源的俯视角度弧度值
vec_az =np.pi /4. #光源的方位角度弧度值
dx =np.cos(vec_el)*np.cos(vec_az) #光源对x轴影响
dy =np.cos(vec_el)*np.sin(vec_az) #光源对y轴影响
dz =np.sin(vec_el) #光源对Z轴影响
b = 255*(dx*uni_x+dy*uni_y+dz*uni_z) #光源归一化
#将像素值限制在0~255之间,转换成8位整型数组,最后通过Image.fromarray函数将图像重构并保存到指定路径中
b=b.clip(0,255)
im=Image.fromarray(b.astype('uint8'))
im.save(save_path)
if __name__ =="__main__":
input_path ='D:/image'
output_path = "D:/output_image"
depth = 8 # depth设置为8,可以进行调节
# 遍历文件夹
for filename in os.listdir(input_path):
# 判断文件类型是否为图片
if filename.endswith('.jpg') or filename.endswith('.png') or filename.endswith('.jpeg'):
# 生成素描图片的路径
sketch_path = os.path.join(output_path, 'sketch_' + filename)
# 生成素描图片
img2sketch(os.path.join(input_path, filename), sketch_path, depth)
方法二:
import cv2
def img2sketch2(image_path, output_path):
# 读取图像
img = cv2.imread(image_path)
# 转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 通过高斯滤波器进行模糊处理
img_gray_blur = cv2.GaussianBlur(img_gray, (21, 21), 0, 0)
# 边缘检测
img_edge = cv2.Canny(img_gray_blur, 0, 40, apertureSize=3)
# 反色处理
img_edge = cv2.bitwise_not(img_edge)
# 保存结果
cv2.imwrite(output_path, img_edge)
return output_path
if __name__ =="__main__":
input_path ='D:/image'
output_path = "D:/output_image"
# 遍历文件夹
for filename in os.listdir(input_path):
# 判断文件类型是否为图片
if filename.endswith('.jpg') or filename.endswith('.png') or filename.endswith('.jpeg'):
# 生成素描图片的路径
sketch_path = os.path.join(output_path, 'sketch_' + filename)
# 生成素描图片
img2sketch(os.path.join(input_path, filename), sketch_path)
实现的效果:
以上图片是AI绘图工具生成的,有更多好玩的项目持续关注。