【OpenCV】使用 Python 的铅笔素描图像

news2024/9/24 17:10:18

目录:使用 Python 的铅笔素描图像

  • 一、前言
  • 二、代码实战
    • 2.1 导包
    • 2.2 读取照片
    • 2.3 使用 OpenCV 显示图像
    • 2.4 灰度图像
    • 2.5 反转图像
    • 2.6 模糊图像
    • 2.7 减淡和融合
  • 三、结果展示
  • 五、源代码

一、前言

图片在 Python 中表示为一组数字。所以我们可以进行各种矩阵操作来得到令人兴奋的结果。

在本次博客中,将向你展示如何只用几行代码创建“铅笔”草图图像。

这个过程非常简单:

  • 灰度图像
  • 反转颜色
  • 模糊倒置图像
  • 将减淡混合应用于模糊和灰度图像

我们可以为此选择任何我们想要的图像。将演示如何创建可以应用于任何图像、视频或实时流的对象。

二、代码实战

2.1 导包

OpenCV 和 Numpy 是项目所需的唯一库。我们使用以下两行代码导入它们:

import cv2
import numpy as np

2.2 读取照片

这是使用 OpenCV 读取存储在磁盘上的图像的命令之一:

frame = cv2.imread("IMG_1181.JPG")

此命令读取位于当前文件夹中的文件“image.png”,并作为帧存储在内存中。但正如我所提到的,这可以是帧序列或通过其他方法加载的图像。

2.3 使用 OpenCV 显示图像

下一个重要步骤是在屏幕上显示图像:

cv2.imshow('image', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像将在一个标题为“image”的新窗口中打开。

2.4 灰度图像

首先,我们需要对图像进行灰度处理(将其转换为黑白)。我们可以使用 cv2 库或 numpy.

numpy 没有任何用于灰度的内置函数,但我们也可以很容易地将我们的图像转换为灰度,公式如下所示:

grayscale = np.array(np.dot(frame[..., :3], [0.299, 0.587, 0.114]), dtype = np.uint8)
grayscale = np.stack((grayscale, ) * 3, axis = -1)

在这里,我们将 RGB 图像通道与适当的值相乘并将它们连接到单个通道。

因此,我们需要返回到 3 层图像,使用 numpy stack 函数来实现。

2.5 反转图像

现在我们需要反转图像,白色应该变成黑色。

它简单地从每个图像像素中减去 255 。因为,默认情况下,图像是 8 位的,最多有 256 个色调:

inverted_img = 255 - grayscale

2.6 模糊图像

现在我们需要模糊倒置的图像。通过对倒置图像应用高斯滤波器来执行模糊。这里最重要的是高斯函数或 sigma 的方差。随着 sigma 的增加,图像变得更模糊。Sigma 控制色散量,从而控制模糊程度。可以通过反复试验选择合适的 sigma 值:

blur_img = cv2.GaussianBlur(inverted_img, ksize = (0, 0), sigmaX = 8)

2.7 减淡和融合

颜色减淡和融合模式并通过降低对比度来加亮基色以反映混合色。

def dodge(front: np.ndarray, back: np.ndarray) -> np.ndarray:
    result = back * 255.0 / (255.0 - front) 
    result[result > 255] = 255
    result[back == 255] = 255
    return result.astype('uint8')
final_img = dodge(blur_img, grayscale)

三、结果展示

在这里插入图片描述
就是这样!

五、源代码

import cv2
import numpy as np
frame = cv2.imread("IMG_1181.JPG")
grayscale = np.array(np.dot(frame[..., :3], [0.299, 0.587, 0.114]), dtype = np.uint8)
grayscale = np.stack((grayscale, ) * 3, axis = -1)
inverted_img = 255 - grayscale
blur_img = cv2.GaussianBlur(inverted_img, ksize = (0, 0), sigmaX = 8)
def dodge(front: np.ndarray, back: np.ndarray) -> np.ndarray:
    result = back * 255.0 / (255.0 - front) 
    result[result > 255] = 255
    result[back == 255] = 255
    return result.astype('uint8')
final_img = dodge(blur_img, grayscale)
cv2.imshow('image', final_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

跨域问题(三种解决方法)

跨域就是一个域名的网页去请求另一个域名的资源,比如你刚刚在A网站输入了自己的账号密码,然后访问B网站,B网站无法获取账号密码 两个请求的协议(比如http),域名(比如说localhost或者192.168.0.…

python 时间

目录标题python的时间模块1、时间戳2、时间元组3、获取格式化的时间可以自定义输出格式日期格式化的符号4、显示某月的日历5、sleep模块python的时间模块 1、时间戳 时间戳,以1970为时间基准,但是太过于遥远的时间就不可以了,windows最源支持…

基于springboot实验室管理系统(程序+数据库)

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

C进阶:征服指针之指针笔试题强化(3)

目录 ​​​​​​​ 🐲T1. ​​​​​​​ ​​​​​​​ 🤖 T2. ​​​​​​​ ​​​​​​​ 🐬 T3. ​​​​​​​ ​​​​​​​ 🐳 T4. ​​​​​​​ ​​​…

并发编程——5.共享模型之无锁

目录5.共享模型之无锁5.1.问题提出5.1.1.案例5.1.2.解决思路——锁5.1.3.解决思路——无锁5.2.CAS 与 volatile5.2.1.CAS5.2.2.volatile5.2.3.为什么无锁效率高5.2.4.CAS 的特点5.3.原子整数5.4.原子引用5.4.1.概述5.4.2.案例5.4.3.ABA 问题及解决5.5.原子数组5.6.字段更新器5.…

数位统计DP

目录 算法简介 算法讲解 数字计数 数位统计DP的递推实现 数位统计DP的记忆化搜索实现 算法实践 一 Windy数 二 手机号码 附录: 算法简介 数位统计 DP 用于数字的数位统计,是一种比较简单的 DP 套路题。 一个数字的数位有个位、十位、百位,等等,如果题目和…

Python3入门基础(03)数据结构

Python3 数据结构 Python3 中有四种标准的数据结构: List(列表)Tuple(元组)Set(集合)Dictionary(字典) Python 3 的六个标准数据类型中: 不可变数据&…

MATLAB算法实战应用案例精讲-【人工智能】语义分割

前言 语义分割是一种典型的计算机视觉问题,其涉及将一些原始数据(例如,平面图像)作为输入并将它们转换为具有突出显示的感兴趣区域的掩模。许多人使用术语全像素语义分割(full-pixel semantic segmentation),其中图像中的每个像素根据其所属的感兴趣对象被分配类别ID。…

跟领导提离职了,现在后悔,想留下来,怎么办?

提完离职后悔了,怎么办?是坚持不变,继续离开?还是厚着脸皮留下来?有些网友支持楼主留下,让他舔回去。有人说,等领导挽留,哪怕是做个样子,就同意留下来,如果完…

第9章 前端调用POST-Api注意事项

1 “ has been blocked by CORS policy: Response to preflight request doesnt pass access control check: It does not have HTTP ok status.”。异常 1.1 通过跨域策略解决 1.1.1 在appsettings.json文件中定义跨域策略配置 // 跨域(Cors)配置的域名及其端口集&#xff0…

央视春晚彩排的关键时刻,主持人朱军终于回归了

盼望着、盼望着,春节临近了,春晚的零点钟声即将开始敲响了。一年一度的央视春晚,已经开启了第一次彩排,众多明星都参与其中,看来今年的春晚要热闹了。 虽然只是第一次彩排,但是很多明星艺人都已经亮相&…

Colyseus:轻量级多人游戏免费开源解决方案

点击上方“青年码农”关注回复“源码”可获取各种资料Colyseus 是一个独特的多人游戏框架,被用于许多 H5 小游戏和手机游戏中,使用容易,且选项众多,可满足开发者多样化的需求。如果你在制作多人联网游戏时遇到过各种扩展性需求和细…

数据卷(Data Volumes)

目录 1.Docker宿主机和容器之间文件拷贝 利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 2.数据卷 3.数据卷容器 1.Docker宿主机和容器之间文件拷贝 利用MySQL镜像安装MySQL服务 docker run -p 3307:3306 --name mysql2 -di -v /home/…

Qt中用thrift验证flume

一.flume简介 flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。 在flume中分为了3个组件,分别为source,channel和sink。 Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种…

在阿里做了7年软件测试原来是........

你了解软件测试岗吗? 很多人做测试3,5年,甚至年限多长。 但并不懂软件测试岗所要求的技术和能力,只是拘于当前的工作环境和培训班的宣传。 在一个微信里中看到如下的对话: 某人说,工作中开始做自动化了。…

8253练习题(8253端口地址怎么求?怎么求初值?怎么看出工作方式)

目录 一:简单(题目把计数初值和工作方式都给你了) 二:给了你输入时间周期和初值,你会不会求输出? 三:简单 四:初值计数方式都不给,初值还是给的时间和频率混合 五&a…

前端_swapCache方法 发布文章

swapCache方法 swapCache方法用来手工执行本地缓存的更新,它只能在applicationCache对象的updateReady事件被触发时调用,updateReady事件只有服务器上的manifest文件被更新,并且把manifest文件中所要求的资源文件下载到本地后触发。顾名思义…

[极客大挑战 2019]Secret File(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具: fiddler或burpsuite抓包 解题过程: 又是要找秘密, 先检查一下源代码 发现了一个链接与背景颜色融合了 点进去看看 找到了SECRET但肯定没这么简单 点击SECRET页面发生…

15. 我是怎么用一个特殊 Cookie ,限制住别人的爬虫的

爬虫训练场,第15篇博客。 博客详细清单,参考 https://pachong.vip/blog 本次案例,用定值 Cookie 实现反爬 文章目录Cookie 生成Python Flask 框架生成 CookieFlask make_response 加载模板Flask 判断指定 cookie 是否存在补充知识点Cookie 生…

【AcWing每日一题】4818. 奶牛大学

Farmer John 计划为奶牛们新开办一所大学! 有 N 头奶牛可能会入学。 每头奶牛最多愿意支付 ci 的学费。 Farmer John 可以设定所有奶牛入学需要支付的学费。 如果这笔学费大于一头奶牛愿意支付的最高金额,那么这头奶牛就不会入学。 Farmer John 想赚…