计算机视觉的应用3-批量图片风格迁移之素描图片生成的应用

news2024/9/25 13:24:16

大家好,我是微学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绘图工具生成的,有更多好玩的项目持续关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【干货】一文说透分布式一致性协议(下)

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:大能老师 | 慕课网讲师 前情提示:如需阅读“一文说透分布式一致性协议(上)”&#…

对多个点进行直线拟合操作

在图像处理中,通常会遇到根据给定的点集(比如轮廓)拟合出一条直线的情形。 import numpy as np import matplotlib.pyplot as plt import cv2def Cal_kb_linear_fitline(pointLocs):loc np.array(pointLocs) # loc 必须为矩阵形式&#xff…

二分类结局变量Logistic回归临床模型预测(二)——基线特征及三线表绘制(二)

本节讲的是二分类结局变量的临床模型预测,与之前讲的Cox回归不同,https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/1300…

蓝牙耳机哪款性价比高一些?2023年性价比最高的蓝牙耳机推荐

随着科技的进步,蓝牙耳机已然成为我们生活中的一部分,无论是通勤、追剧、运动或者玩游戏,大都会用到蓝牙耳机。那么,哪款蓝牙耳机的性价比高一些?相信大多数人在选择产品的时候,都会看性价比。接下来&#…

手把手带你写一份优秀的开发求职简历(五)技术能力如何凸显优势

前言 前面的几小节,把个人信息和教育背景的模块做了讲述,这两个模块处于简历的第一屏最顶部,可以说HR会第一眼看见,所以很重要,同时也通过一些讲述告诉求职者从这些方面如何扬长避短,抓住HR的招聘心理。 …

Android基于JNA集成调用第三方C/C++的so库

Android基于JNA集成调用第三方C/C的so库 (1)引入JNA。 基于JNA开源项目,JNA对Android NDK的封装,简化Android层JNI集成调用C/C的so库。 GitHub - java-native-access/jna: Java Native AccessJava Native Access. Contribute to…

为AI造“楚门世界” 人类围观对话机器人社交、谈恋爱

不满足于跟ChatGPT聊天,技术狂人开始为对话机器人创造“楚门的世界”,从上帝视角围观AI如何“吃饭”、社交、谈恋爱...... 最近,一位神秘人创建了一个AI社交网站Chirper,人类不能参与,只能围观上万名AI在这里的聊天和…

社交技能讲座笔记

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 感谢张鹏老师做了一堂实用的社交技能讲座。我特地做了一些笔记(其中包含我的一些理解): 1.整理好外观,让别…

【大数据之Hadoop】二十三、Yarn命令行操作及生产环境下的配置

1 Yarn常用命令 Yarn状态查询可以在hadoop103:8088页面查看,也可以通过命令查看。 先运行案例再查看运行情况。 (1)yarn application 查看任务 yarn application -list //列出所有application yarn application -list -appStates 状态 …

c++ 11标准模板(STL) std::vector (五)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

Qt音视频开发43-采集屏幕桌面并推流(支持分辨率/矩形区域/帧率等设置/实时性极高)

一、前言 采集电脑屏幕桌面并推流一般是用来做共享桌面、远程协助、投屏之类的应用&#xff0c;最简单入门的做法可能会采用开个定时器或者线程抓图&#xff0c;将整个屏幕截图下来&#xff0c;然后将图片传出去&#xff0c;这种方式很简单但是性能要低不少&#xff0c;一般采…

R语言的贝叶斯时空数据模型

时间&#xff0d;空间数据&#xff08;以下简称“时空数据”&#xff09;是最重要的观测数据形式之一&#xff0c;很多科学研究的数据都以时空数据的形式得以呈现&#xff0c;而科学研究目的可以归结为挖掘时空数据中的规律。另一方面&#xff0c;贝叶斯统计学作为与传统统计学…

FCOS3D Fully Convolutional One-Stage Monocular 3D Object Detection 论文学习

论文地址&#xff1a;Fully Convolutional One-Stage Monocular 3D Object Detection Github地址&#xff1a;Fully Convolutional One-Stage Monocular 3D Object Detection 1. 解决了什么问题&#xff1f; 单目 3D 目标检测由于成本很低&#xff0c;对于自动驾驶任务非常重…

可视化工作流管理

​本场景是可视化工作流&#xff0c;通过可视化的精益看板将价值流进行可视化&#xff0c;通过精益思维消除瓶颈、加速流动&#xff0c;提升效率。 创建工作流任务看板 •通过Leangoo可视化工作流项目模板&#xff0c;创建一个工作流看板。 •通过看板&#xff0c;我们可以将…

K_A35_017 基于STM32等单片机驱动TTP229矩阵触摸传感器 串口与OLED0.96双显示

K_A35_017 基于STM32等单片机驱动TTP229矩阵触摸传感器 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明时序:对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RCTTP229矩阵触摸模块1.2、STM32F103C8T6TTP229矩阵触摸模块 五、基…

医院安全(不良)事件报告系统 PHP语言实现

医院安全&#xff08;不良&#xff09;事件报告制度 一、目的 规范医院安全&#xff08;不良&#xff09;事件的主动报告&#xff0c;增强风险防范意识&#xff0c;及时发现医疗不良事件和安全隐患&#xff0c;将获取的医疗安全信息进行分析反馈&#xff0c;并从医院管理体系…

UG NX二次开发(C++)-UF_OBJ_cycle_all获取所有的体对象

文章目录 1、前言2、在UG NX创建多个体对象3、用UF_OBJ_cycle_all来创建一个新的方法4、测试结果4.1 用UF_OBJ_cycle_objs_in_part&#xff08;&#xff09;结果4.2 用 UF_OBJ_cycle_all&#xff08;&#xff09;结果 5、结论 1、前言 在前面的一篇博客中&#xff0c;我们介绍…

Linux线程:概念、特点、线程间资源共享情况

1. 线程概念 线程是轻量级的进程&#xff1b;Linux中&#xff0c;线程本质上仍是进程。 进程是OS分配资源的最小单位&#xff0c;线程是OS调度的最小单位。 NPTL 当前Linux线程库为redHat开发的NPTL&#xff0c;查看本地线程库版本&#xff1a; getconf GNU_LIBPTHREAD_VE…

在VM VirtualBox6.1中安装redhat7.3过程实录

最近试用皕杰报表工具&#xff0c;需要把报表部署到linux系统&#xff0c;因而在VM VirtualBox虚拟机上安装linux操作系统&#xff0c;现把过程记录下来&#xff0c;作为今后的备忘。 打开VM VirtualBox虚拟机&#xff0c;见下图&#xff1a; 点击控制菜单选择新建&#xff1…

第二十九章 Unity关节Joint

关节组件将刚体连接到另一个刚体或空间中的固定点。关节施加使刚体移动的力&#xff0c;而关节限制功能可以限制该移动。Unity 提供的以下关节可以对刚体组件施加不同的力和限制&#xff0c;从而使这些刚体具有不同的运动&#xff1a; Hinge Joint铰链关节&#xff1a;使两个刚…