Python和OpenCV创建超快的“for”像素循环

news2024/11/18 10:38:42

这篇博客将介绍如何使用Python和OpenCV创建超快的“for”像素循环(逐像素循环),即Cython快速优化for循环;

使用Python和OpenCV逐像素循环图像是一个非常缓慢的操作,即使图像在内部由NumPy数组表示。

为什么会这样?为什么NumPy中的单个像素访问速度如此之慢?
NumPy操作是用C实现的。这使得能够避免Python循环的昂贵开销。在使用NumPy时,性能会提高多个数量级(与标准Python列表相比)。一般来说,如果可以使用NumPy数组将问题框定为向量操作,将能够较大提升速度。
这里的问题是访问单个像素不是向量操作。因此即使NumPy可以说是几乎任何编程语言都可以使用的最好的数值处理库,但当与Python的for循环+单个元素访问相结合时,失去了很多性能增益。

在计算机视觉之旅中,需要实现一些算法,无论是需要从头开始实现局部二进制模式、创建自定义卷积算法,还是仅仅不能依赖矢量化操作,都需要了解如何使用OpenCV和Python优化循环。

1. 效果图

在这里插入图片描述

python:2.7 s ± 38.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
cython:4.14 ms ± 28.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
使用Python耗时2700ms,Cython实现了每次调用4.14ms。这意味着通过使用Cython,可以将逐像素循环的速度提高2个数量级以上!

受萨蒂亚·马利克(SatyaMallick)最初的博客文章的启发,我决定使用Python来完成同样的事情。
不幸的是,Python只有一小部分函数调用可用作绑定(与C++相比)。因此需要使用Cython“滚动自己的”更快的“for”循环方法。
结果非常引人注目——仅使用CPU的一个内核,通过使用Cython能够将阈值函数从每次函数调用244ms(纯Python)提高到小于40.8μs(Cython)。
还可以进行一些优化。通过启用OpenMP支持,实际上可以将for-loop计算分布在多个CPU/内核上-这样做能进一步提高速度。
下一篇博客将介绍如何使用OpenMP通过OpenCV和Python增强我们的for-pixel循环。

2. 原理

pip install numpy
pip install cython
pip install matplotlib
pip install jupyter

Cython是什么以及如何使用它来加速Python内部的操作

可以将Cython视为Python与C语言的结合,它提供了类似C语言的性能。
Cython与Python的不同之处在于,代码是使用CPython解释器翻译成C的。这允许脚本主要用Python编写,并带有一些装饰符和类型声明。

使用Cython的最佳时机是在图像中逐像素循环。OpenCV和scikit image已经优化了——对模板匹配之类的函数的调用,就像在OCR银行支票和信用卡时所做的那样,已经在底层C中进行了优化。仅函数调用中有少量开销。

用Python编写任何自定义图像处理函数来逐像素(可能是使用内核)分析或修改图像,那么函数运行得非常慢。然而如果利用Cython,它使用主要的C/C++编译器进行编译,可以获得显著的性能提升。

如何使用OpenCV和Python将逐像素循环提升两个数量级以上。将实现一个简单的阈值函数。对于图像中的每个像素,将检查输入像素是否大于或等于某个阈值T。
如果像素通过阈值测试,将输出值设置为255。否则,输出像素将设置为0。
使用此函数,将能够对输入图像进行二值化,这与OpenCV和scikit image的内置阈值方法的工作原理非常相似。
将使用一个简单的阈值函数作为示例,因为它将(1)不关注实际的图像处理代码,(2)学习如何在手动循环图像中的每个像素时获得速度提升。

源码

def threshold_slow(T, image):
    # grab the image dimensions
    h = image.shape[0]
    w = image.shape[1]

    # loop over the image, pixel by pixel
    for y in range(0, h):
        for x in range(0, w):
    # threshold the pixel
    image[y, x] = 255 if image[y, x] >= T else 0

    # return the thresholded image
    return image


%timeit threshold_slow(5, image)

参考

  • https://pyimagesearch.com/2017/08/28/fast-optimized-for-pixel-loops-with-opencv-and-python/
  • https://learnopencv.com/parallel-pixel-access-in-opencv-using-foreach/

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

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

相关文章

C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

目录 思维导图: 回调函数 qsort函数介绍 模拟实现qsort 写在最后: 思维导图: 回调函数 什么是回调函数? 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数,当这个指针被用来调用…

57、JDBC和连接池

目录 一、JDBC基本介绍 二、JDBC快速入门 三、JDBC API 1、ResultSet [结果集] 2、Statement 3、PreparedStatement 4、DriverManager 四、封闭JDBCUtils 五、事务 六、批处理 七、数据库连接池 4、数据库连接池种类 (1) c3p0数据库连接池&…

MacBookPro 遇到pip: command not found问题的解决

学习Pyhton的时候,需要安装第三方插件pyecharts,执行以下命令: pip install pyecharts总是报错 pip: command not found 我很郁闷,于是上网搜索尝试各种命令, 命令1:curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 命…

Codeforces Round 507(div. 1) C(分类讨论,并查集)

题目链接: Problem - C - Codeforceshttps://codeforces.com/contest/1039/problem/C 题意: 计算机网络由个服务器组成,每个服务器有到范围内的加密秘钥。设是分配给第i台服务器的加密密钥。对服务器通过数据通信通道直接连接。由于加密算…

高性能分布式缓存Redis-第二篇章

高性能分布式缓存Redis-第二篇章一、持久化原理1.1、持久化流程(落盘)1.2、RDB详解1.2.1、介绍1.2.2、触发&原理1.2.3、实现1.2.4、RDB总结1.3、AOF详解1.3.1、概念1.3.2、AOF 持久化的实现1.3.2、开启1.3.4、命令追加1.3.5、文件写入和同步&#xf…

SQL 别名

通过使用 SQL,可以为表名称或列名称指定别名。 SQL 别名 通过使用 SQL,可以为表名称或列名称指定别名。 基本上,创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法 SELECT column_name AS alias_name FROM table_name; 表的 SQL …

dubbo学习笔记4(小d课堂)

dubbo高级特性 服务分组及其配置 我们再来创建一个实现类: 接下来我们在xml中去进行配置: 现在我们去运行看是否会有错误呢? 我们有两个服务实现类,那运行的时候到底执行哪个呢? 但是我们想的是可以指定执行哪个实现…

设计模式——访问者模式

访问者模式一、基本思想二、结构图一、基本思想 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进…

【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击

【安全硬件】Chap.7 对实体芯片采取物理手段破解;芯片IC逆向工程和拆分制造;物理上对芯片的攻击分类;侧信道攻击;Kocher针对RSA的计时攻击前言1. 逆向工程Reverse Engineering逆向工程识别芯片上2输入NAND门逆向工程技术Decapulat…

CSS 实例系列

Hello 小伙伴们早上、中午、下午、晚上和深夜好,这里是 jsliang~本 CSS 系列文章:主推学以致用。结合面试题和工作实例,让小伙伴们深入体验 61 个工作常见的 CSS 属性和各种 CSS 知识。主推纯 CSS。尽可能使用 HTML CSS 完成学习目的&#x…

nohup命令详解

nohup命令详解一、背景说明:启动服务的时候,如果使用如下命令,则会在start.sh脚本所在的目录下,产生一个名为 nohup.out 的输出文件nohup ./startup.sh &可以看到下面这个例子,一开始当前目录是没有nohup.out文件的…

RocketMQ 多语言 SDK 开源贡献召集令

作者:艾阳坤 目前 Apache RocketMQ 5.0 SDK [ 1] 正在社区开源,开发与迭代也在火热进行中,欢迎广大社区的朋友们能够参与其中。我们欢迎任何形式的贡献,包括但不限于新 feature、bugfix、代码优化、生态集成、测试工作、文档撰写…

我与 CSDN 的 2022 年终总结

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 转眼间2023年已经过去…

《后端技术面试 38 讲》学习笔记 Day 02

《后端技术面试 38 讲》学习笔记 Day 02 08丨软件设计的方法论:软件为什么要建模? 原文摘抄 所谓软件建模,就是为要开发的软件建造模型。模型是对客观存在的抽象,我们常说的数学建模,就是用数学公式作为模型&#xf…

flask + Pandas + echarts 使用饼状图等将二手房数据进行分析+可视化

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 pandas 数据处理 flask web 框架 echarts 图表 bootstrap jinja 模版 三、菜鸟实战 初始化 Flask 框架,设置路由 各行政区房屋数量柱状图分析 区域二手房房源朝向分布情况 二手房单价最…

Higress Kruise Rollout: 渐进式交付为应用发布保驾护航

作者:扬少 前言 在业务高速发展过程中,如何最大化保障功能迭代过程中业务流量无损一直是开发者比较关心的问题。通常在应用发布新功能阶段,我们会采用灰度发布的思想对新版本进行小流量验证,在符合预期之后再进行全量发布&#…

11、JS笔记-内置对象

1.内置对象 js中对象分为三种: 自定义对象、内置对象、浏览器对象(js独有) 内置对象: js语言自带的对象,供开发者使用,提供一些常用或基本的功能(属性和方法) 2.Math对象 Math中所…

【云原生】k8s配置资源管理

内容预知 1.Secret的资源配置 1.1 Secret配置的相关说明 1.2 陈述式创建Secret配置 1.3 声明式base64编码创建Secret 1.4 将secret以volume形式挂载到pod中 1.5 将Secret导入到pod中,充当环境变量 1.6 实战运用:使用secret配置免密交互拉取habor…

Qt之对话框

文章目录一、对话框的概念二、与QWidget的区别三、对话框2种显示方法四、对话框返回值的概念本节示例提示:以下是本篇文章正文内容,下面案例可供参考 一、对话框的概念 对话框是和用户简短交互的一种窗口。如:登录界面,关于界面…

知识付费图文音视频课程公众号系统开发

知识付费图文音视频课程公众号系统开发 功能特性;为你介绍音视频课程点播系统的功能特性。 微信H5;目前只支持微信公众号H5访问。 课程管理;后台可上传多个课程分类与课程。 名师推荐;后台可以维护教师列表,并推荐到首页显示。 分享海报;可以自定义多个分享海报。 …