Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单水彩画效果

news/2024/5/7 14:53:16/文章来源:https://blog.csdn.net/u014361280/article/details/137065245

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单水彩画效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单水彩画效果

一、简单介绍

二、简单图像浮雕效果实现原理

三、简单水彩画效果案例实现简单步骤

四、注意事项:


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单图像浮雕效果实现原理

水彩画是一种具有独特风格的绘画形式,其特点包括:

  • 色彩丰富:水彩画常常使用鲜艳的色彩,色彩层次丰富,可以呈现出丰富多彩的效果。

  • 柔和渐变:水彩画的色彩过渡通常比较柔和,可以呈现出平滑的渐变效果,使得画面更加柔和自然。

  • 透明质感:水彩画具有一种透明质感,颜色之间可以相互渗透,形成柔和的色彩层次。

  • 颜料晕染:在水彩画中,颜料常常会晕染开来,形成具有艺术感染力的效果。

要实现水彩画效果,可以采用以下方法:

  • 模糊处理:对图像进行模糊处理,可以使得图像中的细节变得柔和,呈现出水彩画的特有质感。常见的模糊方法包括高斯模糊、中值模糊等。

  • 边缘保留滤波:边缘保留滤波可以保留图像的边缘信息,同时对图像的其他部分进行模糊处理,从而增强图像的整体层次感和质感。

  • 颜色量化:对图像的颜色进行量化处理,可以降低图像的色彩深度,使得图像的色彩更加柔和,符合水彩画的特点。

  • 纹理增强:通过增强图像的纹理信息,可以使得图像更加丰富多彩,增强水彩画的艺术感染力。

  • 局部调整:根据实际需求,对图像的局部区域进行调整,可以进一步增强水彩画的效果,使得画面更加丰富多彩。

实现原理:

1、灰度转换:首先,将彩色图像转换为灰度图像,以减少处理的复杂度。

将彩色图像转换为灰度图像,通常可以使用以下函数:

gray_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

这里 color_image 是彩色图像,cv2.COLOR_BGR2GRAY 表示将BGR格式的彩色图像转换为灰度图像。

2、中值模糊处理:对灰度图像进行中值模糊处理,以减少图像中的噪声,使得后续的边缘检测更加准确。

对灰度图像进行中值模糊处理,可以使用以下函数:

blurred_image = cv2.medianBlur(gray_image, ksize)

这里 ksize 是中值模糊的核大小,一般取奇数,表示模糊的程度。

3、边缘检测:使用 Laplacian 算子进行边缘检测,以获取图像中的边缘信息。

使用 Laplacian 算子进行边缘检测,可以使用以下函数:

edges = cv2.Laplacian(blurred_image, ddepth, ksize)

这里 ddepth 表示输出图像的深度(通常设置为cv2.CV_64F),ksize 是 Laplacian 算子的核大小。

4、边缘二值化:对边缘图像进行二值化处理,得到一个边缘掩码,其中边缘部分为白色(255),非边缘部分为黑色(0)。

对边缘图像进行二值化处理,可以使用以下函数:

_, edge_binary = cv2.threshold(edges, threshold, max_val, cv2.THRESH_BINARY)

这里 threshold 是阈值,超过阈值的像素设为 max_val,否则设为0。

5、颜色量化:对原始彩色图像进行颜色量化处理,保留图像的边缘特征,同时降低图像的颜色深度。

对原始彩色图像进行颜色量化处理,保留图像的边缘特征,可以使用以下函数:

quantized_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2LAB)

这里将彩色图像转换到 LAB 色彩空间,这种颜色空间对颜色量化非常友好。

6、合并处理:将颜色量化后的图像与边缘掩码进行合并,只保留图像中的边缘部分,并对非边缘部分进行遮罩,从而生成水彩画效果的图像。

合并处理,可以通过以下函数实现:

result_image = cv2.bitwise_and(quantized_image, quantized_image, mask=edge_binary)

这里的关键函数是 cv2.bitwise_and(),它是 OpenCV 中用于按位与运算的函数。具体参数含义如下:

  • quantized_image: 颜色量化后的图像。
  • quantized_image: 作为第二个参数,这里与第一个参数相同,表示进行按位与运算的第二个图像。
  • mask: 边缘掩码,即二值化后的边缘图像。只有与该掩码中对应位置为白色的像素才会被保留,其他像素会被置为0。

这样处理后,结果图像中只会保留原始彩色图像的边缘部分,非边缘部分会被遮罩掉,生成水彩画效果的图像。

三、简单水彩画效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单水彩画效果"""import cv2def watercolor_effect(image):"""水彩画效果:param image::return:"""# 将图像转换为灰度图像gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 对灰度图像进行中值模糊处理blurred = cv2.medianBlur(gray, 15)# 对模糊处理后的图像进行边缘检测edges = cv2.Laplacian(blurred, cv2.CV_8U, ksize=5)# 对边缘图像进行二值化处理_, mask = cv2.threshold(edges, 100, 255, cv2.THRESH_BINARY_INV)# 对原始图像进行颜色量化quantized = cv2.edgePreservingFilter(image, flags=1, sigma_s=60, sigma_r=0.4)# 将颜色量化后的图像与边缘掩码进行合并watercolor = cv2.bitwise_and(quantized, quantized, mask=mask)return watercolordef main():# 读取图像image = cv2.imread('Images/DogFace.jpg')# 设置窗口属性,并显示图片cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)cv2.imshow("Dog", image)# 应用水彩画效果watercolor_image = watercolor_effect(image)# 设置窗口属性,并显示图片cv2.namedWindow("Watercolor Image", cv2.WINDOW_KEEPRATIO)cv2.imshow('Watercolor Image', watercolor_image)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == "__main__":main()

四、注意事项:

  1. 参数调整:水彩画效果的质量受到参数的影响,尤其是中值模糊处理、边缘检测和颜色量化的参数。可以根据实际情况调整参数,以获得最佳的效果。

  2. 灰度处理:在处理彩色图像之前,首先要将其转换为灰度图像。这是因为水彩画效果通常只应用于单通道图像。

  3. 效率考虑:水彩画效果的处理可能会比较耗时,尤其是在边缘检测和颜色量化方面。因此,在处理大尺寸图像时,需要考虑到效率问题。

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

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

相关文章

QTabWidget的tabbar不同方向显示 文字方向设置 图标跟随变化 实现方式 qt控件绘制原理

先来看结果图:(参考博客:QTabWidget中tab页文本水平或垂直设置_pyqt tab_widget.settabposition(qtabwidget.west) 字体-CSDN博客) 从图中可知,"普通"是qt自己的样式,但是很明显,在垂…

如何使用Python结合Pillow、matplotlib和OpenCV实现图片读取

使用Pillow库 matplotlib是一个绘图库,经常用于数据可视化,但它也可以用来展示图片。 from PIL import Image# 读取图片 image Image.open(.jpg)# 展示图片 image.show()使用OpenCV库 OpenCV是一个强大的计算机视觉和机器学习库。它不仅提供了大量的图像…

开源大数据集群部署(十八)Hive 安装部署

作者:櫰木 1 创建hive Kerberos主体 bash /root/bigdata/getkeytabs.sh /etc/security/keytab/hive.keytab hive2 安装 在hd1.dtstack.com主机root权限下操作: 解压包 [roothd3.dtstack.com software]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C …

【微服务】Nacos(注册中心)

文章目录 1.基本介绍1.概述2.Nacos下载和运行(java8/maven3.2.x)1.解压到没有中文路径的2.双击startup3.浏览器输入http://192.168.242.124:8848/nacos4.用户名和密码为nacos5.cmd输入netstat -anb | more查看监听端口 2.创建Nacos服务提供者 100041.项目…

VLAN的原理及配置

文章目录 一、VLAN的概述1、VLAN的概念2、VLAN的优势 二、静态VLAN三、静态VLAN的配置1.VLAN的范围2.VLAN基本配置 四、Trunk和access的作用参考 一、VLAN的概述 1、VLAN的概念 VLAN就是将网络从逻辑上划分为若按个小的网络,也就是虚拟局域网。 2、VLAN的优势 使…

鸿蒙OS开发案例:【API9】遍历沙漏文件夹并输入文件的大小

1.获取打印文件大小 /*** 获取打印文件大小*/static getFileSize(byteNum: number) {if (byteNum < 0) {return "shouldnt be less than zero!";} else if (byteNum < 1024) {return ${byteNum.toFixed(3)}B;} else if (byteNum < 1048576) {return (byteNu…

37.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-解码器细化类的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;36.数据解码器的…

剑指Offer题目笔记19(二分查找)

面试题68&#xff1a; 问题&#xff1a; ​ 输入一个排序的整形数组nums和一个目标值t&#xff0c;如果数组nums中包含t&#xff0c;则返回在数组中的下标&#xff0c;否则返回按照顺序插入到数组的下标。 解决方案&#xff1a; ​ 使用二分查找。每次二分查找都选取位于数组…

鸿蒙HarmonyOS应用开发之使用Node-API实现跨语言交互开发流程

使用Node-API实现跨语言交互&#xff0c;首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧&#xff1a;实现C方法的调用。代码比较简单&#xff0c;import一个对应的so库后&#xff0c;即可调用C方法。 Native侧&#xff1a;.cpp文件&#xff0c;实现模…

左手医生:医疗 AI 企业的云原生提效降本之路

相信这样的经历对很多人来说并不陌生&#xff1a;为了能到更好的医院治病&#xff0c;不惜路途遥远奔波到大城市&#xff1b;或者只是看个小病&#xff0c;也得排上半天长队。这些由于医疗资源分配不均导致的就医问题已是老生长谈。 云计算、人工智能、大数据等技术的发展和融…

centos2anolis

我的centos7原地升级到anolis7记录 注意&#xff1a;如果是桌面版请先卸载firefox&#xff0c;否则so文件冲突。 参考&#xff1a; CentOS 7和8Linux系统迁移到国产Linux龙蜥Anolis OS 8手册_disable pam_pkcs11 module in pam configuration-CSDN博客 关于 CentOS 迁移龙蜥…

[2021]Zookeeper getAcl命令未授权访问漏洞概述与解决

今天在漏洞扫描的时候蹦出来一个zookeeper的漏洞问题&#xff0c;即使是非zookeeper的节点&#xff0c;或者是非集群内部节点&#xff0c;也可以通过nc扫描2181端口&#xff0c;获取极多的zk信息。关于漏洞的详细描述参考apache zookeeper官方概述&#xff1a;CVE-2018-8012: A…

ps国潮样机合集,内含茶杯、包装礼盒、抱枕、手机等

ps国潮样机合集&#xff0c;内含茶杯、包装礼盒、抱枕、手机等 链接&#xff1a;https://pan.baidu.com/s/1T-pXLcbHhHsZYho0WoV00g?pwdi5gs 提取码&#xff1a;i5gs 部分展示图 首先&#xff0c;PS样机的作用&#xff1a; 产品验证&#xff1a;PS样机可以帮助设计师和制…

【二叉树】Leetcode 102. 二叉树的层序遍历【中等】

二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09; 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 解题思路…

第二篇:3.1 广告印象(AD Impression) - IAB与MRC及《增强现实广告效果测量指南1.0》

--- 我为什么要翻译美国IAB科技公司系列标准 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见度 …

最新的Flutter3.x版本获取应用包名的方法

以前的flutter项目可以在 AndroidManifest.xml 中获取应用包名&#xff0c; 最新的Flutter3.x版本要获取应用包名可以找到build.gradle 更多内容参考&#xff1a;最新的Flutter3.x版本如何获取应用包名

视图的作用

目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号&#xff08;视图的存在条件&#xff09; 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:​​​​​​h…

UMass、MIT等提出3D世界具身基础模型,机器人根据生成的世界模型无缝连接3D感知、推理和行动

在最近的研究中&#xff0c;视觉-语言-动作&#xff08;VLA&#xff0c;vision-language-action&#xff09;模型的输入基本都是2D数据&#xff0c;没有集成更通用的3D物理世界。 此外&#xff0c;现有的模型通过学习「感知到动作的直接映射」来进行动作预测&#xff0c;忽略了…

数据结构——线性表(一)

线性表&#xff0c;顾名思义&#xff0c;是具有像线一样的性质的表。如同学生们在操场上排队&#xff0c;一个跟着一个排队&#xff0c;有一个打头&#xff0c;有一个收尾&#xff0c;在其中的学生都知道前一个是谁&#xff0c;后一个是谁&#xff0c;这样就像一根线将他们都串…

html页面使用@for(){},@if(){},利用jquery 获取当前class在列表中的下标

基于以前的项目进行修改优化&#xff0c;前端代码根据List元素在html里进行遍历显示 原先的代码&#xff1a; 其中&#xff0c;noticeGuide.Id是标识noticeGuide的唯一值&#xff0c;但是不是从0开始的【是数据库自增字段】 但是在页面初始化加载的时候&#xff0c;我们只想…