使用 OpenCV 将图像转换为铅笔素描的 8 个步骤

news2024/9/30 19:33:35

使用 OpenCV 从彩色图像创建铅笔素描图像

f3a5b25fe6768fbaa6a9acd602064238.gif

这个项目是我为 LetsGrowMore 的数据科学实习生创建的任务。

LetsGrowMore :https://letsgrowmore.in/vip/

目录

  • 什么是 OpenCV?

  • 第 1 步:读取图像

  • 第 2 步:将图像转换为灰度

  • 第 3 步:将灰度图像转换为反转灰度

  • 第 4 步:模糊负片图像

  • 第 5 步:反转模糊图像

  • 第 6 步:将灰度与倒置模糊图像混合

  • 第 7 步:使用 Matplotlib 将其与原始图像一起显示

  • 第 8 步:保存图片

  • 我学到了什么

  • 接下来要尝试的事情

  • 参考

什么是 OpenCV?

OpenCV (Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。

它提供了广泛的功能,包括对象检测、人脸识别和跟踪。

在这里,我们将使用 Open CV 将彩色图像转换为铅笔素描。

在这里,我使用 Google Colab 作为我的 IDE。

第 1 步:读取图像

import cv2
import matplotlib.pyplot as plt

#imported cv2_imshow specific for google colab
from google.colab.patches import cv2_imshow

#to read the image
image= cv2.imread('desktop.png')

#to display the image
cv2_imshow(image)
0bda2879e235411d3bf360716d15f837.jpeg

OpenCV使用BGR配色方案,所以这里不用改颜色。但是当我们使用 Matplotlib 时,我们需要转换,因为它使用RGB配色方案

第 2 步:将图像转换为灰度

#converting the image to grayscale
gray= cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
cv2_imshow(gray)
cb45be15dd900d0e8c2ca92e778beb89.jpeg

第 3 步:将灰度图像转换为反转灰度

反转灰度图像也称为负像。这样做是为了增强图像的细节。

#converting image to inverted grayscale

inv_gray= 255-gray
cv2_imshow(inv_gray)
ecb2fbf88a1033401b795a3deb6388ec.jpeg

第 4 步:模糊负片图像

使用反复试验找到内核大小;对于较大的图像,内核大小应该更大。

对于较小的图像,它应该是小数字,如 3x3 或 5x5。在小图像中赋予大内核值将删除图像的实际结构。

blur_img=cv2.GaussianBlur(inv_gray,(101,101),0)
cv2_imshow(blur_img)
fb748ea2f5c9df16fde1d172503b4ce4.jpeg

第 5 步:反转模糊图像

#inverting the blurred image

inv_blur=255-blur_img
cv2_imshow(inv_blur)
c6102bbfd5484354d70077e8f13713a5.jpeg

第 6 步:将灰度与倒置模糊图像混合

为了完成我们的铅笔素描,我们需要混合灰度和倒置模糊图像。

我们将使用CV2 divide方法来执行该操作

CV2 divide:两个数组或标量除以数组的每个元素。

sketch_img= cv2.divide(gray,inv_blur,scale=255.0)
cv2_imshow(sketch_img)
a04b76e56ac6955a57671ce136cd4b19.jpeg

我们做到了!!

第 7 步:使用 Matplotlib 将其与原始图像一起显示

正如我已经提到的,由于我们在这里使用 Matplotlib 并排显示图像,因此我们需要转换原始图像和素描图像。

这是因为,OpenCV 使用BGR配色方案,而 matplotlib 使用RGB配色方案。素描图片也一样。

plt.figure(figsize=(14,7))

plt.subplot(1,2,1)
plt.title('Actual image in Matplotlib')
plt.imshow(image)
plt.axis('off')

plt.subplot(1,2,2)
plt.title('Color converted image in Matplotlib')
im = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(im)
plt.axis('off')
plt.show()


plt.figure(figsize=(14,7))
plt.subplot(1,2,1)
plt.title('Actual image in Matplotlib')
plt.imshow(sketch_img)
plt.axis('off')

plt.subplot(1,2,2)
plt.title('Color converted image in Matplotlib')
rgb_sketch=cv2.cvtColor(sketch_img, cv2.COLOR_BGR2RGB)
plt.imshow(rgb_sketch)
plt.axis('off')
plt.show()
fc897084b29d954a5589cd87d637ec05.jpeg 646e47cc447b7012784f65335014f8bc.jpeg
#displaying original image and pencil sketch image side by side

plt.figure(figsize=(14,7))

plt.subplot(1,2,1)
plt.imshow(im)
plt.axis('off')

plt.subplot(1,2,2)
plt.imshow(rgb_sketch)
plt.axis('off')
plt.show()
987a35c12ef4e1595be0b2cc4d5c08f0.jpeg

第 8 步:保存图片

终于我们到了最后一步。保存图片。imwrite用于保存图片。

# saving the picture

# Filename
filename = 'sketch.png'

cv2.imwrite(filename, sketch_img)

你可以在这里查看我的 GitHub 代码!!

https://github.com/Kavya2099/LGMVIP-DataScience/tree/main/Task%201

学到了什么

  • OpenCV 是初学者计算机视觉知识的重要来源

  • Matplotlib 始终将图像显示为 BGR ,openCV 以 RGB 配色方案显示图像

  • 应根据图像大小使用高斯模糊中的内核大小。如果图像尺寸较大,则内核尺寸应具有较高的值

接下来要尝试的事情!

  • 铅笔同时绘制多个图像

  • 在模糊图像中尝试中值模糊而不是高斯模糊

  • 在 Numpy 中使用 concat 方法并排显示图像而不是 Matplotlib

参考

  • https://towardsdatascience.com/generate-pencil-sketch-from-photo-in-python-7c56802d8acb

  • https://stackoverflow.com/questions/19580102/inverting-image-in-python-with-opencv

  • https://www.askpython.com/python/examples/images-to-pencil-sketch

  • https://pyimagesearch.com/2021/04/28/opencv-smoothing-and-blurring/#:~:text=To%20average%20blur%20an%20image,image%20with%20increasing%20sizes%20kernels

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

65250a6b8e066aaccd2c7302b4529bd2.jpeg

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

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

相关文章

MarkDown中写UML图的方法

目录序UML图之顺序图顺序图的四个要素关于消息箭头的语法Mermaid中顺序图的简单例子样例用小人表示对象为对象设置别名激活对象UML图之类图类图中常见的关系关于不同类型关系的语法Mermaid中类图的简单例子样例类定义的两种方式为类定义成员双向关系的表示多重性关系的表示UML之…

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…

微信授权登录流程以及公众号配置方法(golang后端)

一、准备一个已经认证OK的微信公众号和已经备案的域名,且解析好配置好https证书。 1.如上图 微信公众号 > 基本配置 ,设置开发者密码 2.设置IP白名单,白名单填写提供后端服务的服务器公网IP 二、公众号服务器配置。 1.找到基本配置 2.将服…

C语言基础应用(二)数据的转换与输入输出

学习了C语言的基本数据类型后,我们可能会想这些数据如何进行运算,是否可以让不同类型的数据直接进行运算呢? 一、数据类型转换 1.1 int类型与float类型之间的转换 int i 5; // j值为2.000000 因为左右操作数均为整型float j i/2; // …

人脸识别原理与模型方法综述

概述 一、人脸识别流程 二、优点特性 1、便捷性 采集设备简单,使用快捷。一般来说,常见的摄像头就可以用来进行人脸图像的采集, 不需特别复杂的专用设备。图像采集在数秒内即可完成。 2、友好性 通过人脸识别身份的方法与人类的习惯一致&am…

C# 用NPOI读取EXCEL

1. 复制DLL文件 ICSharpCode.SharpZipLib.dll NPOI.dll NPOI.OOXML.dll NPOI.OpenXml4Net.dll NPOI.OpenXmlFormats.dll 2. 在工程中添加引用 3. using System.IO; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using NPOI.OpenXml4Ne…

顿悟日记(一)

目录2023年1月顿悟日记:2023年2月24日顿悟日记:2023年2月25日顿悟日记:2023年2月26日顿悟日记:顿悟的经历是如此的奇妙,且让人亢奋的事情。 2023年1月顿悟日记: 1.我是面向对象还是面向过程? …

Linux下使用Shell脚本实现进程监控

本文介绍一种在Linux系统下为实现某些关键进程状态的实时监控而使用shell脚本的编写方法。在这里主要通过监控某些进程是否退出作为判断依据,如果某个进程退出了,则进行对应的恢复处理,如重新拉起相关的进程等。下面介绍该脚本的实现流程。首…

MyBatis之增、删、查、改

目录 前言 一、配置MyBatis开发环境 1.1 创建数据库和表 1.2 添加框架支持 1.3 创建目录结构 1.4 配置数据库连接 1.5 配置MyBatis中的XML文件路径 二、添加业务代码 2.1 查询数据库操作 2.1.1 添加实体类 2.1.2 添加mapper接口 2.1.3 在xml中实现mapper接口 2.1.…

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

目录 一、背景和挖掘目标 1、问题背景 2、传统方法的缺陷 3、原始数据情况 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体过程 第1步:数据获取 第2步:数据预处理 第3步:构建模型 三、思考和总结 项目地址:Data…

jQuery:入门

jQuery 入门 Date: January 19, 2023 目标: 能够说出什么是 jQuery 能够说出 jQuery 的优点 能够简单使用 jQuery 能够说出 DOM 对象和 jQuery 对象的区别 jQuery 概述 JavaScript 库 仓库: 可以把很多东西放到这个仓库里面。找东西只需要到仓库里…

vue中子组件间接修改父组件传递过来的值

一、前言 Vue官方文档Props单向数据流讲解 Vue中遵循单向数据流,所有的 props 都遵循着单向绑定原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递。这避免了子组件意外修改父组件的状态的情况&a…

分布式算法 - ZAB算法

ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议), 它应该是所有一致性协议中生产环境中应用最多的了。为什么呢?因为它是为 Zookeeper 设计的分布式一致性协议!什么是 ZAB 协议? ZAB 协议…

Java基本数据类型

1.概述 佛说,大千世界,无奇不有。在这个世界里,物种的多样性,遍地开花,同样,在Java的世界里,也有着异曲同工之妙,Java秉承面向对象的特性,必然少不了区分对象的类型&…

【安全知识】——端口复用隐藏后门

作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 精彩的人生是在有限的生命中实现无限价值端口复用是…

【C++】类和对象的六个默认成员函数

类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特征拷贝构造函数典型调用场景:赋值运算符重载运算符重载赋值运算符重载取地址及const取地址操作符重载类的6个默认成员函数 到底什么是类的6个默认成员函数呢?相信大家一定对此怀…

2023安装archlinux笔记

本文只是个笔记,不是详细教程,仅供参考。 安装过程基本与 《2021年vmware安装archlinux》 https://blog.csdn.net/lxyoucan/article/details/115226297 差不多。 无U盘安装 不想格式化U盘了,直接从硬盘安装。参考一下文章。 《没有U盘纯硬…

什么是全站加速(DCDN)

全站加速(DCDN) 在阅读本文之前,如果你还没有看过 你管这玩意儿叫CDN 这篇文章,可以先去看一下,然后再来阅读本文,效果会更好一些。 什么是全站加速 全站加速DCDN(Dynamic Route for Content…

每日分享(苹果CMS V10仿韩剧TV主题模板源码)

demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.低代码引擎技术白皮书 PDF高清版 低代码引擎是一款为低代码平台开发者提供的,具备强大定制扩展能力的低代码设计器研发框架。本白皮书从应用、基础协议和原理三个方面对低代码引擎的技术进行了全面的介绍…

计算机网络体系结构及分层参考模型

文章目录一、分层设计思想的提出二、网络分层的必要性三、什么是计算机网络体系结构四、计算机网络参考模型OSI参考模型/五层参考模型/TCP/IP参考模型一、分层设计思想的提出 最早提出分层思想的是 ARPANET网。1969年11月,美国国防部开始建立一个命名为ARPANET的网络…