当前位置: 首页 > news >正文

【python】OpenCV—Cartoonify and Portray

在这里插入图片描述

参考来自

  • 使用Python+OpenCV将照片变成卡通照片

文章目录

  • 1 卡通化
    • code
    • cv2.medianBlur
    • cv2.adaptiveThreshold
    • cv2.kmeans
    • cv2.bilateralFilter
  • 2 肖像画
    • cv2.divide

1 卡通化

code

import cv2
import numpy as npdef edge_mask(img, line_size, blur_value):gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray_blur = cv2.medianBlur(gray, blur_value)edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,line_size, blur_value,)return edgesdef color_quantization(img, k):# transrorm the imagedata = np.float32(img).reshape((-1, 3))# determine criteriacriteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)# implementing k-meansret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)center = np.uint8(center)result = center[label.flatten()]result = result.reshape(img.shape)return resultif __name__ == "__main__":img = cv2.imread('2.jpg')line_size = 3blur_value = 3edges = edge_mask(img, line_size, blur_value)cv2.imwrite("edges.jpg", edges)total_color = 3img_quan_color = color_quantization(img, total_color)cv2.imwrite("img_quan_color.jpg", img_quan_color)blurred = cv2.bilateralFilter(img_quan_color, d=3, sigmaColor=200, sigmaSpace=200)cartton = cv2.bitwise_and(blurred, blurred, mask=edges)cv2.imwrite("cartton.jpg", cartton)# cv2.imshow("1", cartton)# cv2.waitKey(0)# cv2.destroyAllWindows()

输入图片

在这里插入图片描述
边缘
在这里插入图片描述
颜色量化
在这里插入图片描述

边缘和颜色量化合并

在这里插入图片描述


下面消融下一些细节配置

line_size 设置为 3~15

在这里插入图片描述


line_size = 3
blur_value 设置为 3~15
在这里插入图片描述


颜色量化

total_color = 3~15

在这里插入图片描述
在这里插入图片描述
越大颜色越丰富


双边滤波

d=3~15

在这里插入图片描述

cv2.medianBlur

该函数用于对图像进行中值滤波,主要用于消除图像中的椒盐噪声和脉冲噪声。它通过取邻域内所有像素值的中值来替代当前像素点的像素值,能够有效保护图像边缘信息,避免线性滤波器可能带来的图像细节模糊。

1)函数原型

dst = cv2.medianBlur(src, ksize)

2)参数说明

src:需要处理的图像,即源图像。图像可以具有任意数量的通道,这些通道可以独立处理。图像深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 中的一个。

ksize:滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。核大小必须是比 1 大的奇数,例如 3、5、7 等。

3)返回值

dst:进行中值滤波后得到的处理结果,与源图像 src 的尺寸和类型相同。

4)使用注意事项

在进行滤波时,应注意 ksize 参数的选择。过小的 ksize 可能无法有效去除噪声,而过大的 ksize 则可能导致图像细节损失。

由于中值滤波是非线性的,它可能无法处理一些非线性噪声。

中值滤波对于去除椒盐噪声和脉冲噪声特别有效,但对于其他类型的噪声可能效果有限。

cv2.adaptiveThreshold

该函数用于对图像进行自适应阈值处理,即根据图像的局部区域来计算阈值,并应用这个阈值对图像进行二值化。这种处理方式特别适用于光照不均匀的图像。

1)函数原型

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

2)参数说明

src:输入图像,必须是单通道图像(灰度图像)。

maxValue:阈值化后的最大值。当满足条件时,像素值将被设置为 maxValue,否则为 0。

adaptiveMethod:自适应阈值算法的选择。

  • cv2.ADAPTIVE_THRESH_MEAN_C:使用相邻区域的平均值减去常数 C 作为阈值。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:使用相邻区域的加权和(高斯加权)减去常数 C 作为阈值。

thresholdType:二值化类型。

  • cv2.THRESH_BINARY:大于阈值的像素值设置为 maxValue,小于等于阈值的像素值设置为 0。
  • cv2.THRESH_BINARY_INV:与 cv2.THRESH_BINARY 相反。

blockSize:用于计算阈值的邻域大小(必须是正奇数)。例如,3、5、7 等。

C:从计算出的阈值中减去的常数,通常为正数。

3)返回值

dst:自适应阈值处理后的输出图像,与输入图像 src 的尺寸相同,但类型为二值图像。

4)注意事项

自适应阈值处理可以有效地处理光照不均匀的图像,因为它会根据每个像素的局部邻域来动态计算阈值。

blockSize 参数决定了计算阈值时考虑的邻域大小,可以根据图像的具体情况选择。

C 参数用于调整最终的阈值,可以根据需要进行调整。

cv2.kmeans

该函数用于执行 K-Means 聚类算法,将输入数据划分为 K 个集群,并返回每个数据点的集群标签和集群的质心。

1)函数原型
retval, labels, centers = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

2)参数说明

data:输入数据,通常是 NumPy 数组,其形状为 (N, M),其中 N 是数据点的数量,M 是每个数据点的维数。

K:需要划分的集群数量。

termCriteria:终止条件,通常是一个元组,包含三个参数 (type, maxIter, epsilon)。其中 type 可以是 cv2.TERM_CRITERIA_EPS、cv2.TERM_CRITERIA_MAX_ITER 或它们的组合(使用按位或运算符 | 连接),maxIter 是最大迭代次数,epsilon 是收敛的精度要求。

attempts:算法尝试的次数。算法使用不同的初始标签集进行多次运行,并返回最佳结果。这个参数指定了尝试的次数。

flags:初始化质心的方法。目前唯一可用的标志是 cv2.KMEANS_RANDOM_CENTERS,它使用随机值初始化质心。

centers(可选):用于传递预定义的质心数组。如果不提供,则会根据 flags 参数随机初始化质心。

3)返回值

retval:迭代次数。算法执行的实际迭代次数。

labels:每个数据点的集群标签。形状为 (N,) 的 NumPy 数组,其中 N 是数据点的数量。

centers:集群的质心。形状为 (K, M) 的 NumPy 数组,其中 K 是集群的数量,M 是数据点的维数。

4)使用注意事项

在使用 K-Means 算法时,选择合适的 K 值非常重要。K 值过小可能无法充分描述数据的分布,而 K 值过大可能导致过拟合。

由于 K-Means 算法是随机的,每次运行的结果可能略有不同。为了获得更稳定的结果,可以多次运行算法并取平均结果。

数据的预处理(如缩放、归一化)对 K-Means 算法的性能和结果有重要影响。确保在输入数据之前进行适当的预处理。

cv2.bilateralFilter

该函数使用双边滤波算法对图像进行平滑处理,去除噪声的同时保留边缘信息。

1)函数原型

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

2)参数说明

src:输入图像,应为8位或浮点型、1通道或3通道图像。

d:滤波时考虑的像素直径(不是半径)。对于较大的值,该滤波器将不会有太大差异,但会增加计算时间。它可以是大于1的整数,但通常建议使用不超过15的值。

sigmaColor:颜色空间的标准差。一个较大的值意味着像素邻域内有较大颜色变化的像素能够影响到滤波器的中心像素。这有助于在平滑图像时保留边缘。

sigmaSpace:坐标空间的标准差(以像素为单位)。如果参数值较大,那么只有在像素坐标空间中距离足够近的像素才会影响中心像素的值。这有助于在平滑图像时保留边缘。

dst(可选):输出图像,与源图像具有相同的尺寸和类型。

borderType(可选):像素外推法,决定如何处理边界像素。默认值为 cv2.BORDER_DEFAULT。

3)返回值

dst:滤波后的图像,与源图像具有相同的尺寸和类型。

4)使用注意事项

d 参数的选择:虽然较大的值可能不会显著改变滤波器的效果,但会增加计算时间。因此,在实际应用中,通常建议使用较小的值(如15或更小)。

sigmaColor 和 sigmaSpace 的选择:这两个参数共同决定了双边滤波器的行为。较大的 sigmaColor 值允许颜色变化较大的像素影响中心像素,而较大的 sigmaSpace 值则限制了仅在空间距离较近的像素才能影响中心像素。根据具体的应用场景,可能需要调整这两个参数的值以达到最佳效果。

边缘保留:与其他线性滤波方法(如高斯滤波)相比,双边滤波能够在平滑图像的同时更好地保留边缘信息。这是因为双边滤波在考虑像素之间的空间距离之外,还考虑了像素之间的灰度值相似性。

2 肖像画

import cv2import os
# print(os.listdir("../../datasets/human_Wild_public/images/mpii_029329465.jpg"))
img = cv2.imread("C://Users/Administrator/Desktop/1.jpeg")gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
invert_g_i = 255 - gray_imgblurred_i_g_i = cv2.GaussianBlur(invert_g_i, (19, 19), 0)invert = 255 - blurred_i_g_isketck = cv2.divide(gray_img, invert, scale=256.0)
cv2.imwrite("C://Users/Administrator/Desktop/2.jpeg", sketck)# cv2.imshow("ori", img)
# cv2.imshow("pencil sketch", sketck)
# cv2.waitKey(0)

原图
请添加图片描述
灰度图
请添加图片描述
反向灰度图
请添加图片描述
求模糊
请添加图片描述
反回来
请添加图片描述
肖像画
请添加图片描述

cv2.divide

执行两个数组(图像)的逐元素相除操作。

1)函数原型

dst = cv2.divide(src1, src2[, dst[, scale[, dtype[, mask]]]])

2)参数说明

src1:第一个输入数组(通常是图像)。

src2:第二个输入数组(通常是图像),其元素将用作除数。

dst(可选):输出数组,与 src1 具有相同的尺寸和通道数。

scale(可选):可选的缩放因子。如果指定了,则结果将乘以这个值。默认值为 1。

dtype(可选):输出数组的可选深度。默认与输入数组的深度相同。

mask(可选):可选的 8 位单通道数组,用于指定哪些元素需要参与计算。

3)返回值

dst:输出数组,包含 src1 数组的元素与 src2 数组的元素相除的结果(如果提供了 scale,则乘以 scale)。

4)使用注意事项

如果 src2 中的任何元素为零,则结果将是未定义的(在浮点数中可能是 NaN 或无穷大)。因此,在使用 cv2.divide 之前,确保 src2 中没有零元素,或者准备处理可能出现的异常情况。

mask 参数允许你选择性地执行逐元素除法,只影响那些 mask 中对应位置为真的元素。

相关文章:

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…...

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中,企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力,成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人,并强调其功能体…...

mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日

解决方法也简单&#xff1a; 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…...

信息系统项目管理师0148:输出(9项目范围管理—9.3规划范围管理—9.3.3输出)

点击查看专栏目录 文章目录 9.3.3 输出 9.3.3 输出 范围管理计划 范围管理计划是项目管理计划的组成部分&#xff0c;描述将如何定义、制定、监督、控制和确认项 目范围。范围管理计划用于指导如下过程和相关工作&#xff1a; ①制定项目范围说明书&#xff1b;②根据详细项目范…...

解决 SQLyog 连接 MySQL 8 连不上和 SQLyog Trial 试用到期的问题

今天发现 SQLyog 突然连不上 MySQL 了&#xff0c;跟之前不一样的地方就是我升级了 MySQL&#xff0c;升级到了 MySQL 8。 原来是因为 MySQL 8 引入了新的密码验证机制。在 MySQL 8 中默认的密码验证插件从 mysql_native_password 更换为 caching_sha2_password。我的 SQLYog …...

go语言内置预编译 //go:embed xxx 使用详解

在go语言里面&#xff0c;我们可以使用一个“类注释”的语法来来让编译器帮助我们在编译的时候将一些文件或者目录读取到指定的变量中来供我们使用。 go:embed语法&#xff1a; //go:embed 文件或者目录路径 var 变量名 变量类型 说明&#xff1a; 文件或者目录路径 可以…...

数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法

频繁项集、闭项集和关联规则 频繁项集&#xff1a;出现的次数超过最小支持度计数阈值 闭频繁项集&#xff1a;一个集合他的超集(包含这个集合的集合)在数据库里面的数量和这个集合在这个数据库里面的数量不一样,这个集合就是闭项集 如果这个集合还是频繁的,那么他就是极大频…...

Locust:用Python编写可扩展的负载测试

Locust&#xff1a;简化性能测试&#xff0c;让负载模拟更直观- 精选真开源&#xff0c;释放新价值。 概览 Locust是一个开源的性能和负载测试工具&#xff0c;专门用于HTTP和其他协议的测试。它采用开发者友好的方法&#xff0c;允许用户使用普通的Python代码来定义测试场景。…...

【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱

Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;环境配置 2. 安装Neo4j&#xff08;1&#xff09;下载&#xff08;2&#xff09;解压安装&#xff08;3&#xff09;环境配置…...

探索智慧林业系统的总体架构与应用

背景&#xff1a; 随着人们对森林资源保护和管理的重视&#xff0c;智慧林业系统作为一种新兴的林业管理手段&#xff0c;正在逐渐受到广泛关注和应用。智慧林业系统的总体架构设计与应用&#xff0c;将现代信息技术与林业管理相结合&#xff0c;为森林资源的保护、管理和利用…...

【JSP】如何在IDEA上部署JSP WEB开发项目

以我的课设为例&#xff0c;教大家拿到他人的项目后&#xff0c;如何在IDEA上部署。 需要准备&#xff1a; JDK17&#xff08;或者JDK13&#xff09;IntelliJ IDEA 2023.2.6MySQL 8.0Tomcat 9.0 一&#xff0c;新建项目添加文件 1.1复制“位置”的路径 1.2找到该文件夹 1.3…...

用HTML实现拓扑面,动态4D圆环面,可手动调节,富有创新性的案例。(有源代码)

文章目录 前言一、示例二、目录结构三、index.html&#xff08;主页面&#xff09;四、main.js五、Tour4D.js六、swissgl.js七、dat.gui.min.js八、style.css 前言 如果你觉得对代码进行复制粘贴很麻烦的话&#xff0c;你可以直接将资源下载到本地。无需部署&#xff0c;直接可…...

java调用GDAL及JTS实现生成泰森多边形(Voronoi图)的一种方法

目录 一、关于泰森多边形 1.泰森多边形的特性 2.本文的目的 二、实现思路 1.gdal和jts库的maven坐标 2.jts生成泰森多边形的关键代码 3.使用GDAL读取源文件信息的关键代码 4.使用GDAL将生成的泰森多边形写入文件 三、实现结果 1.实现的效果 2.完整代码示例 一、关于…...

Type-C音频转接器方案

在数字化时代&#xff0c;音频设备作为我们生活中不可或缺的一部分&#xff0c;其连接方式的便捷性和高效性显得尤为重要。Type-C音频转接器&#xff0c;作为一种新型的音频连接解决方案&#xff0c;正逐渐走进我们的生活&#xff0c;以其独特的优势改变着我们的音频体验。 一、…...

linux 服务器上离线安装 node nvm

因为是离线环境 如果你是可以访问外网的 下面内容仅供参考 也可以继续按步骤来 node 安装路径 Node.js — Download Node.js nvm 安装路径 Tags nvm-sh/nvm GitHub 后来发现 nvm安装后 nvm use 版本号 报错 让我去nvm install 版本 我是内网环境 install不了 下面 你要 把安…...

Web前端三大主流框架:React、Angular和Vue的比较与选择

Web前端三大主流框架&#xff1a;React、Angular和Vue的比较与选择 Web前端技术的快速发展为开发者提供了丰富的工具和框架&#xff0c;其中React、Angular和Vue是当前最受欢迎的三大框架。这三个框架各有特点&#xff0c;适用于不同的项目需求和开发团队。本文将对React、Ang…...

C# MemoryCache 缓存应用

摘要 缓存是一种非常常见的性能优化技术&#xff0c;在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache&#xff0c;它可以很方便地存储数据并在后续的请求中快速读取&#xff0c;从而提高应用程序的响应速度。 正文 通过使用 Microsoft.Extensions.Caching.Me…...

【学习笔记】Linux前置准备

视频学习资料 基础&#xff1a; 黑马0基础&#xff08;前面四章即可&#xff0c;包含软件基础安装配置&#xff09; 进阶&#xff1a; 黑马程序员-Linux系统编程 黑马程序员-Linux网络编程 我也还没看&#xff0c;看了眼目录感觉把八股里面很多场景都讲到了&#xff0c;感觉有…...

各种空气能热泵安装图

空气能热泵安装图 循环式空气能热泵安装图 直热循环式空气能热泵安装图 泳池空气能热泵安装图 循环式水源热泵热安装系统原理图 直热循环式水源热泵安装系统图 空气水源热泵安装图...

软件杯 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...