【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 中对应位置为真的元素。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十八天|93.复原IP地址 ,78.子集 ,90.子集II

93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; class Solution {ArrayList<String> results new ArrayList<>();public List<String> restoreIpAddresses(String s) {if(s.length() > 12){return new ArrayList<>();}char[] ipChars …

OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流

背景&#xff1a;需要将球机视频推送到阿里云nginx&#xff0c;使用网页和移动端进行播放&#xff0c;以前视频格式为RTMP&#xff0c;但是在网页上面播放RTMP格式需要安装flash插件&#xff0c;chrome浏览器不给安装&#xff0c;调研后发现可以使用nginx的模块nginx-http-flv-…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说&#xff0c;不需要去理解MySQL通信协议的内部实现细节&#xff0c;只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的&#xff0c;这意味着&#xff0c;在任何一个时刻&#…

9.抽象类和接口

抽象类 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类 比如&#xff1a; 我…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

高精度滚珠丝杆在自动化生产中的关键因素!

如今&#xff0c;自动化技术正以前所未有的速度改变着人们的生活和工作方式&#xff0c;特别是在高精度精密设备的制造与应用领域&#xff0c;提高生产效率和优化生产流程正变得越来越重要。在自动化生产中&#xff0c;滚珠丝杆的优化应用对于提高生产效率、保证产品质量至关重…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

面试二十六、c++语言级别的多线程编程

一、 多线程编程 ​​​​​ 这里的c语言级别的多线程和linux的有一定的区别&#xff0c;c语言级别提供的多线程比较严格&#xff0c;如果主线程结束了&#xff0c;但是子线程没有结束&#xff0c;进程就会异常终止&#xff0c;而linux不会&#xff0c;会继续执行。 二、模拟卖…

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

FL Studio21.2.8中文版水果音乐制作的革新之旅!

在数字化浪潮的推动下&#xff0c;音乐制作领域经历了翻天覆地的变化。从最初的模拟技术到如今的全数字化处理&#xff0c;音乐制作的门槛被大幅降低&#xff0c;越来越多的音乐爱好者和专业人士开始尝试自行创作和编辑音乐。在这个过程中&#xff0c;各种专业音乐制作软件成为…

CVE-2022-22947

漏洞描述 Spring Cloud Gateway 远程代码执行漏洞&#xff08;CVE-2022-22947&#xff09;发生在Spring Cloud Gateway应用程序的Actuator端点&#xff0c;其在启用、公开和不安全的情况下容易受到代码注入的攻击。攻击者可通过该漏洞恶意创建允许在远程主机上执行任意远程执行…

第二十五章新增H5基础(以及视频~兼容)

1.HTML5中新增布局标签 HTML5新增了页眉&#xff0c;页脚&#xff0c;内容块等文档结构相关标签&#xff0c;可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题&#xff0c…

UI案例——登陆系统

UI的登陆界面实例 在学习了UILabel&#xff0c;UIButton&#xff0c;UIView&#xff0c;UITextField的内容之后&#xff0c;我们就可以写一个简单的登陆界面 我们可以通过UILabel来编写我们显示在登陆界面上的文字比方说下面这两行字就是通过UILabel去实现的。 下面给出一下实现…

直播美颜插件详解:美颜SDK的技术原理

美颜SDK作为实现美颜功能的核心技术&#xff0c;已被广泛应用于各种直播和短视频应用中。那么&#xff0c;美颜SDK究竟是如何工作的&#xff1f;它背后的技术原理又是什么&#xff1f;本文将对直播美颜插件及其技术原理进行详解。 一、美颜SDK的概述 美颜SDK包含了各种图像处…

二叉树遍历 和 线索二叉树

文章目录 1.1 二叉树遍历1.1 前提问题1&#xff1a; 什么叫二叉树的遍历&#xff1f;二叉树的三种遍历&#xff1a;三个概念&#xff1a;遍历 和 访问 和 经过重要概念&#xff1a;遍历过程中的经过节点&#xff0c;不代表访问节点 问题2&#xff1a;遍历和访问的联系&#xff…

【代码+详解】算法题 : 最大公约数

❗❗❗必看: 下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答. ❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!! 文章目录 题目&…

思维导图——幕布

一、前言 幕布是一款专注于简化和组织信息的大纲笔记应用&#xff0c;它旨在帮助用户高效地整理知识点、优化工作流程以及规划个人生活。 二、软件特点 幕布工具的核心优势在于其能够快速将用户的输入转换成清晰的思维导图&#xff0c;便于视觉化地理解和记忆信息。 幕布还具…

分集增益Diversity Gain与复用增益Multiplexing Gain

文章目录 概念DoF&#xff08;Degrees of Freedom&#xff09;复用增益&#xff08;Multiplexing Gain&#xff09;自由度&#xff08;Degrees of Freedom, DoF&#xff09;两者的关系实际应用关系总结具体关系例子结论 近场MIMO的分集与复用与远场MIMO有何不同 概念 在通信领…

HttpClient cookie爬虫记录

记录一次java语言使用httpclient爬取网站接口数据的经历 需要用到的依赖&#xff1a; httpclient和httpcore是封装了http请求的工具类 jsoup可以将返回的网页html找到你需要的xml节点&#xff0c;很方便 <dependency><groupId>org.apache.httpcomponents</gr…

通过DirectML和ONNXRuntime运行Phi-3模型

更多精彩内容&#xff0c;欢迎关注我的公众号“ONE生产力”&#xff01; 上篇我们讲到通过Intel Core Ultra系列处理器内置的NPU加速运行Phi-3模型&#xff0c;有朋友评论说他没有Intel处理器是否有什么办法加速Phi-3模型。通常&#xff0c;使用GPU特别是NVIDA的GPU加速AI模型…