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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试 | 目录扫描

0x00 免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担…

electron源码保护

electron 程序发布后,如果未对程序做保护,则极容易受到破坏,比如被轻松破解密码,或者被修改程序,所以必须对程序做一些安全防护。虽然没有100%的安全防护,但是提升破解难度,直至破解代价超出了范…

MyBatis:使用代码整合

文章目录 MyBatis:Day 04框架1. 依赖:pom.xml2. 外部配置文件:db.properties3. 核心配置文件:mybatis-config.xml4. 实体类5. 接口:xxxMapper.java6. 实现类:xxxMapper.xml7. 测试 MyBatis:Day …

利用C#实现动态替换桌面快捷方式对应的应用程序

公司有一个特殊的业务可能会用到这个,至于什么业务就不展开了。本文的内容作为备用方案。 实现思路: 1 获取当前exe程序运行的全路径 2 获取桌面的所有快捷方式 3 遍历快捷方式,获取快捷键方式对应程序的运行路径,并与当前…

Java编程中的20种常见异常及其原因,你知道多少

本文介绍了在Java编程中可能遇到的20种常见异常,包括空指针异常、类未找到异常、数组下标越界异常等,并简要解释了每种异常发生的原因。这些异常可能由于编程错误、运行时资源不足或权限受限等多种原因触发,了解它们有助于更高效地进行程序调…

黑马程序员Dubbo快速入门,Java分布式框架dubbo教程

分布式系统中的相关概念 (一)互联网项目架构目标-特点 (二)互联网项目架构目标-目标 (三)集群和分布式 (四)架构演进 Dubbo概述 (一)dubbo概述 1、dub…

针对Vue前后端分离项目的渗透思路

引言 在目前的开发环境下,越来越多的厂商选择 Vue.js 来实现前端功能的编写,且成熟的前端框架已经可以实现后端代码实现的功能,导致后端目前只负责提供 Api 接口和文档,方便前端的同时去调用。本文主要介绍如何针对这类前后端分离…

java版鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统源代码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

java紫砂壶交易购物系统 mysql

网络紫砂壶可充通过色彩、图片、说明、设置动画加强了产品了宣传,大大达到了陶瓷业的“色型”要求。实现产品管理方便,起到立竿见影的效果,不用因为更改菜色而重新印刷。只要在后台鼠标轻轻一点,全线马上更新。采用B/S模式&#x…

mybatisPlus初识

文章目录 什么是mybatisplus依赖入门案例自动填充乐观锁悲观锁乐观锁 mybatisPlus实现乐观锁批量查询根据指定条件查询 什么是mybatisplus mybatisplus是mybatis的增强工具&#xff0c;支持多种类型的数据库。 依赖 <dependency><groupId>com.baomidou</group…

快速了解车联网V2X通信

自动驾驶拥有极其巨大的潜力&#xff0c;有可能改变我们的出行方式。它不仅有望永远改变车辆的设计和制造&#xff0c;还会永远改变汽车的所有权乃至整个交通运输业务。要实现全自动驾驶的目标&#xff0c;开发人员需要开发极为复杂的软件&#xff0c;软件中融入的人工智能(AI)…

从一到无穷大 #7 Database-as-a-Service租户隔离挑战与解决措施

文章目录 引言计算侧多租户隔离2DFQSQLVMRetro 其他隔离方法其他 引言 在云环境中租户之间的资源共享对于运营商的成本效益来说非常重要&#xff0c;但是一个主要问题是租户之间的资源隔离&#xff0c;这通常与Qos息息相关&#xff0c;从多租户的角度讲&#xff0c;安全性/性能…

〖Python网络爬虫实战⑲〗- 数据存储之CSV文件

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

DolphinScheduler海豚调度教程

DolphinScheduler 教程 &#xff08;一&#xff09;入门指南 简介 关于Dolphin Apache DolphinScheduler是一个分布式易扩展的可视化DAG工作流任务调度开源系统。解决数据研发ETL 错综复杂的依赖关系&#xff0c;不能直观监控任务健康状态等问题。DolphinScheduler以DAG流式…

欧拉奔赴品牌2.0时代,女性汽车真实用户需求被定义?

每年的上海国际汽车工业展览会&#xff0c;不仅是各大汽车品牌的技术“秀场”&#xff0c;也是品牌的营销“修罗场”。今年上海车展出圈的营销事件特别多&#xff0c;热度甚至一再蔓延到汽车行业外&#xff0c;其中欧拉也贡献了不少流量。 据了解&#xff0c;在2023上海车展欧…

ModuleNotFoundError: No module named ‘mmcv._ext‘

mmsegmentation使用pyinstaller打包出现问题 mmsegmentation是商汤开源的语义分割框架&#xff0c;里面包含了大量SOTA模型&#xff0c;十分适合从事语义分割工作的小白学习。 最近想将mmsegmentation打包成exe进行使用&#xff0c;但是遇到了一个问题&#xff0c;在打包的过…

Photon AI Translator 和做产品的一些思考

近 4 个月内我一直在做 Apple 平台的产品&#xff0c;虽然从使用量来说「简体中文」用户是占多数&#xff0c;但我一直有做多语言的支持&#xff1a;英语、简体中文和繁体中文。习惯上 Google 翻译的我&#xff0c;基本上在使用 Xcode 过程中也会一直在浏览器开着 Google Trans…

目标跟踪--卡尔曼滤波 与 匈牙利算法

目前主流的目标跟踪算法都是基于Tracking-by-Detecton策略&#xff0c;即基于目标检测的结果来进行目标跟踪。 跟踪结果中&#xff0c;每个bbox左上角的数字是用来标识某个人的唯一ID号。那么问题就来了&#xff0c;视频中不同时刻的同一个人&#xff0c;位置发生了变化&#x…

《智能手机心率和呼吸率测量算法的前瞻性验证》阅读笔记

目录 一、论文摘要 1.背景 2.方法 3.结果 4.结论 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff…

【算法】冒泡排序

一.冒泡排序 主要思想&#xff1a; 反复交换相邻的元素&#xff0c;使较大的元素 逐渐冒泡到数组的末尾&#xff0c;从而实现排序的效果 实现过程&#xff1a; 1.遍历待排序数组&#xff0c;比较相邻的元素&#xff0c;如果前面的元素比后面的元素大&#xff0c; 就交换这两…