Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之二 素描画风格效果

一、简单介绍

二、素描画风格效果实现原理

三、案例简单实现步骤


一、简单介绍

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

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

二、素描画风格效果实现原理

素描画风格效果的实现原理是将彩色图像转换为灰度图像,并使用边缘检测算法检测图像中的边缘,然后根据边缘信息来生成素描效果。

素描风格效果通常体现在边缘处的明暗变化,使得图像看起来更像手绘的素描画。

实现的基本原理:

  • 将图像转换为灰度图像: 使用灰度转换算法将彩色图像转换为灰度图像。可以采用简单的平均值法、加权平均法或者其他灰度转换方法来实现。
  • 边缘检测: 使用边缘检测算法检测图像中的边缘。常用的边缘检测算法包括 Sobel 算子、Canny 边缘检测算法等。这些算法可以提取图像中的边缘信息,并将边缘信息表示为明暗不同的像素值。
  • 生成素描效果: 根据边缘信息生成素描效果。通常可以通过将灰度图像与边缘图像进行混合,从而突出边缘处的明暗变化,达到素描效果。例如,可以通过增强边缘处的对比度或者模糊非边缘区域来实现。

同时,参考Photoshop素描的风格实现步骤:

(1)去色,将彩色图片转换成灰度图像。

图像的打开可以通过cv2.imread代码打开,cv2.cvtColor可以将图片转化为灰度图。你也可以在读取图片的时候增加一个额外的参数使得图像直接转化为灰度图

(2)复制去色图层,并且反色,反色为Y(i,j)=255-X(i,j)。

灰度图反色图像可以通过将灰度图每个像素点取反得到,由于灰度图的像素点的在0-255之间,将其取反的话就是255-当前像素点。

(3)对反色图像进行高斯模糊。

Gaussian blur能够很有效地减少图像中的噪声,能够将图像变得更加平滑一点,在数学上等价于用高斯核来对图像进行卷积操作。我们可以通过cv2.GaussianBlur来实现高斯模糊操作,参数ksize表示高斯核的大小。sigmaX和sigmaY分别表示高斯核在 X 和 Y 方向上的标准差。

(4)模糊后的图像叠加模式选择颜色减淡效果。

这一步骤自然就是需要得到最终的素描图结果了。在传统照相技术中,当需要对图片某个区域变得更亮或者变暗,可以通过控制它的曝光时间,这里就用到亮化(Dodging)和暗化(burning)的技术。

通过图像叠加对图像颜色减淡公式设计为:

C=MIN(A+(A×B)/(255-B),255)

其中,C为混合结果,A为去色后的像素点,B为高斯模糊后的像素点。也可以直接叠加两张图片。

涉及函数:

# cv2.cvtColor可以将图片转化为灰度图
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)# 灰度反色操作
img_gray_inv = 255 - img_gray# 高斯模糊
img_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),sigmaX=0, sigmaY=0)# 灰度图与高斯模糊底片的融合 (分为两种方式)
# 亮化操作
cv2.divide(image, 255 - mask, scale=scale)# 暗化操作
255 - cv2.divide(255 - image, 255 - mask, scale=scale)

三、案例简单实现步骤

1、编写代码

2、运行效果

3、具体代码

"""
素描画风格效果(1)去色,将彩色图片转换成灰度图像。图像的打开可以通过cv2.imread代码打开,cv2.cvtColor可以将图片转化为灰度图。你也可以在读取图片的时候增加一个额外的参数使得图像直接转化为灰度图(2)复制去色图层,并且反色,反色为Y(i,j)=255-X(i,j)。灰度图反色图像可以通过将灰度图每个像素点取反得到,由于灰度图的像素点的在0-255之间,将其取反的话就是255-当前像素点。(3)对反色图像进行高斯模糊。Gaussian blur能够很有效地减少图像中的噪声,能够将图像变得更加平滑一点,在数学上等价于用高斯核来对图像进行卷积操作。我们可以通过cv2.GaussianBlur来实现高斯模糊操作,参数ksize表示高斯核的大小。sigmaX和sigmaY分别表示高斯核在 X 和 Y 方向上的标准差。(4)模糊后的图像叠加模式选择颜色减淡效果。这一步骤自然就是需要得到最终的素描图结果了。在传统照相技术中,当需要对图片某个区域变得更亮或者变暗,可以通过控制它的曝光时间,这里就用到亮化(Dodging)和暗化(burning)的技术。"""import cv2
import numpy as npdef dodgeNaive(image, mask):"""该版本,比较耗时,请使用 dogeV2:param image::param mask::return:"""# determine the shape of the input imagewidth, height = image.shape[:2]# prepare output argument with same size as imageblend = np.zeros((width, height), np.uint8)for col in range(width):for row in range(height):# do for every pixelif mask[col, row] == 255:# avoid division by zeroblend[col, row] = 255else:# shift image pixel value by 8 bits# divide by the inverse of the masktmp = (image[col, row] << 8) / (255 - mask)# print('tmp={}'.format(tmp.shape))# make sure resulting value stays within boundsif tmp.any() > 255:tmp = 255blend[col, row] = tmpreturn blenddef dodgeV2(image, mask, scale):"""灰度图与高斯模糊底片的融合:param image::param mask::param scale: 风格化效果,值显示的效果不同,越大,越白:return:"""return cv2.divide(image, 255 - mask, scale=scale)def burnV2(image, mask, scale):"""灰度图与高斯模糊底片的融合:param image::param mask::param scale:风格化效果,值显示的效果不同,越大,越暗:return:"""return 255 - cv2.divide(255 - image, 255 - mask, scale=scale)def rgb_to_sketch(src_image_name, dst_image_name):""":param src_image_name: 原始图片:param dst_image_name: 要保留的风格化图片:return:"""img_rgb = cv2.imread(src_image_name)# 将图像转化为灰度图img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)# 灰度反色操作img_gray_inv = 255 - img_gray# 高斯模糊img_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),sigmaX=0, sigmaY=0)# 素描画风格处理img_blend = dodgeV2(img_gray, img_blur, 250)# img_blend = burnV2(img_gray, img_blur, 250)# 图片显示# 设置窗口属性,并显示图片cv2.namedWindow("original", cv2.WINDOW_KEEPRATIO)cv2.imshow('original', img_rgb)cv2.namedWindow("gray", cv2.WINDOW_KEEPRATIO)cv2.imshow('gray', img_gray)cv2.namedWindow("gray_inv", cv2.WINDOW_KEEPRATIO)cv2.imshow('gray_inv', img_gray_inv)cv2.namedWindow("gray_blur", cv2.WINDOW_KEEPRATIO)cv2.imshow('gray_blur', img_blur)cv2.namedWindow("sketch drawing effect", cv2.WINDOW_KEEPRATIO)cv2.imshow("sketch drawing effect", img_blend)cv2.waitKey(0)cv2.destroyAllWindows()# 保存图片cv2.imwrite(dst_image_name, img_blend)if __name__ == '__main__':src_image_name = 'Images/DogFace.jpg'dst_image_name = 'Images/sketch_example.jpg'rgb_to_sketch(src_image_name, dst_image_name)

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

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

相关文章

react native 实现自定义底部导航与路由文件配置

首先先把需要的一些库引入 yarn install react-navigation/native yarn install react-native-screens react-native-safe-area-context yarn install react-navigation/native-stack yarn add react-navigation/bottom-tabs 创建路由文件及四个底部导航页面 router文件下的bot…

opengl使用着色器的示例程序

使用了glew库和freeglut库 #include <GL/glew.h> #include <GL/freeglut.h> #include <iostream>// 窗口大小 const GLint WIDTH = 800, HEIGHT = 600;

python 深度学习 记录遇到的报错问题12

本篇继python 深度学习 记录遇到的报错问题11_undefined symbol: __nvjitlinkadddata_12_1, version-CSDN博客 目录 一、AttributeError: module ‘tensorflow‘ has no attribute ‘app‘ 二、AttributeError: module tensorflow has no attribute placeholder 三、Attribu…

pytorch升级打怪(八)

保存模型和加载已有模型 保存并加载模型保存加载 保存并加载模型 在本节中&#xff0c;我们将研究如何通过保存、加载和运行模型预测来保持模型状态。 import torch import torchvision.models as models保存 PyTorch模型将学习的参数存储在内部状态字典中&#xff0c;称为s…

掘根宝典之C++RTTI和类型转换运算符

什么是RTTI RTTI是运行阶段类型识别的简称。 哪些是RTTI? C有3个支持RTTI的元素。 1.dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针&#xff0c;否则该运算符返回0——空指针。 2.typeid运算符返回一个指出对象类型的信息 3.type_info结构存储…

后端配置拦截器的一个问题【问题】

后端配置拦截器的一个问题【问题】 前言版权后端配置拦截器的一个问题问题解决 最后 前言 2024-3-14 00:07:28 以下内容源自《【问题】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://jsss-1.blog…

el-form 的表单校验,如何验证某一项或者多项;validateField 的使用

通常对form表单的校验都是整体校验&#xff1a; this.$refs.form.validate( valid > {if (valid) {// 校验通过&#xff0c;业务逻辑代码...} }); 如果需要对表单里的特定一项或几项进行校验&#xff0c;应该如何实现&#xff1f; 业务场景&#xff1a;下图点探测按钮时…

Python 井字棋游戏

井字棋是一种在3 * 3格子上进行的连珠游戏&#xff0c;又称井字游戏。井字棋的游戏有两名玩家&#xff0c;其中一个玩家画圈&#xff0c;另一个玩家画叉&#xff0c;轮流在3 * 3格子上画上自己的符号&#xff0c;最先在横向、纵向、或斜线方向连成一条线的人为胜利方。如图1所示…

【数据可信流通,从运维信任到技术信任】

1. 数据可信流通体系 信任的基石&#xff1a; 身份的可确认利益可依赖能力有预期行为有后果 2.内循环——>外循环 内循环&#xff1a;数据持有方在自己的运维安全域内队自己的数据使用和安全拥有全责。 外循环&#xff1a;数据要素在离开持有方安全域后&#xff0c;持有方…

蓝桥杯刷题(六)

[蓝桥杯 2022 省 A] 求和 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两…

Linux内存管理笔记----TLB

1. TLB介绍 TLB是Translation Lookaside Buffer的简称&#xff0c;可翻译为“地址转换后援缓冲器”&#xff0c;也可简称为“快表”。 简单地说&#xff0c;TLB就是页表的Cache&#xff0c;属于MMU的一部分&#xff0c;其中存储了当前最可能被访问到的页表项&#xff0c;其内…

Java 文件处理完全指南:创建、读取、写入和删除文件详细解析

Java 文件操作 文件处理简介 文件处理是任何应用程序的重要部分。Java 提供了许多用于创建、读取、更新和删除文件的方法。 Java 文件处理 Java 中的文件处理主要通过 java.io 包中的 File 类完成。该类允许我们处理文件&#xff0c;包括创建、读取、写入和删除文件。 创建…

总是很困怎么办

总是感到困倦可能是由多种原因导致的&#xff0c;如睡眠不足、营养不足、健康问题或压力过大等。以下是一些建议&#xff0c;帮助你缓解困倦感&#xff1a; 保证充足睡眠&#xff1a; 确保每晚获得足够的睡眠时间&#xff0c;成年人通常需要7至9小时的睡眠。建立一个规律的睡眠…

Answer.AI开启家用70亿参数模型训练新篇章

Answer.AI开启家用70亿参数模型训练新篇章 摘要 2024年3月6日&#xff0c;Answer.AI推出首个项目&#xff1a;一套开源系统&#xff0c;首次实现在家用台式机上&#xff0c;仅需两块标准游戏GPU&#xff08;RTX 3090或4090&#xff09;&#xff0c;高效训练70亿大型语言模型。…

[leetcode ~dp ]279. 完全平方数

给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 不是。 …

2023年度VSCode主题推荐(个人常用主题存档)

前言 早在2018年的时候发了一篇关于VSCode主题风格推荐——VS Code 主题风格设置&#xff0c;时过境迁&#xff0c;如今常用的主题皮肤早已更替。 今天下午在整理VSCode插件的时候&#xff0c;不小心把常用的那款&#xff08;亮色&#xff09;主题插件给删除了&#xff0c;无…

202444读书笔记|《作家榜名著:菜根谭》——大聪明的人,小事必朦胧,大懵懂的人,小事必伺察

202444读书笔记|《作家榜名著&#xff1a;菜根谭》——大聪明的人&#xff0c;小事必朦胧&#xff0c;大懵懂的人&#xff0c;小事必伺察 修省篇&#xff08;三八则&#xff09;应酬篇&#xff08;五一则&#xff09;评议篇&#xff08;四八则&#xff09;闲适篇&#xff08;四…

添可、希亦、追觅洗地机好不好用?实物终极PK测评分享!

随着人们对家庭生活品质的追求不断地提高&#xff0c;对智能清洁家电的需求也不断地上涨。作为在智能清洁家电领域的资深研究员&#xff0c;结合我八年的使用经验以及专业的眼光&#xff0c;今天就给大家一起来聊聊希亦、追觅、添可洗地机好不好用&#xff0c;以及三款洗地机产…

科技成果鉴定测试如何进行?第三方检测机构进行鉴定测试的好处

科技成果鉴定测试&#xff0c;作为科技领域中一项重要的质量检验手段&#xff0c;具有广泛的应用范围。旨在为科技成果的研发者和使用者提供客观、科学、权威的鉴定结果&#xff0c;从而评估科技成果的技术水平和市场竞争力。   科技成果鉴定测试是对科技成果进行系统、全面的…

Java项目:62 基于ssm的校园驿站管理系统+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员管理快递仓库信息&#xff0c;管理待发货信息&#xff0c;管理已收快递&#xff0c;管理物流以及留言信息&#xff0c;管理员工和用户资…