OpenCV算法库

简介: numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。

numba


numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。

Numba是一个用于Python的即时(Just-in-time, JIT)编译器。将面向数组和使用大量数学的python代码优化到与c,c++和Fortran类似的性能,而无需改变Python的解释器。

numba的使用方法


numba对代码进行加速时,给要优化的函数加上@jit优化器


from numba import jit
@jit
def f(a, b):
    return a + b


numba将在调用期间推断参数类型,然后基于这个信息生成优化后的代码。


Numba编译的函数可以调用其他编译函数。


from math import sqrt
@jit
def hypot(a, b):
    return sqrt(square(a) + square(b))


import numpy as np
import time
 
# 创建一个1000x1000的随机数组
arr = np.random.rand(1000, 1000)
 
# 记录开始时间
start_time = time.time()
 
# 计算数组元素之和
sum_result = np.sum(arr)
 
# 记录结束时间
end_time = time.time()
 
# 计算运算时间
elapsed_time = end_time - start_time
 
print("未使用Numba加速时的运算时间:", elapsed_time)


使用Numba加速


import numpy as np
import time
from numba import jit
 
# 创建一个1000x1000的随机数组
arr = np.random.rand(1000, 1000)
 
# 定义一个使用Numba加速的函数
@jit(nopython=True)
def sum_array(arr):
    return np.sum(arr)
 
# 记录开始时间
start_time = time.time()
 
# 调用加速后的函数计算数组元素之和
sum_result = sum_array(arr)
 
# 记录结束时间
end_time = time.time()
 
# 计算运算时间
elapsed_time = end_time - start_time
 
print("使用Numba加速时的运算时间:", elapsed_time)


imutils


imutils是一个专为OpenCV设计的Python封装库,它极大地简化了图像处理的过程


imutils提供了一系列的工具函数,使得在Python中使用OpenCV进行图像处理变得更加快捷和简便。这些功能涵盖了图像的显示、平移、旋转、缩放以及骨架化等多种操作。由于imutils是基于OpenCV构建的,它可以与OpenCV无缝集成,为开发者提供了一个更加友好的接口来进行日常的图像处理任务。要安装imutils,可以使用pip命令pip install imutils。不过,需要注意的是,在使用imutils之前,需要确保已经安装了NumPy和OpenCV库,如果需要使用到将OpenCV图像转换为Matplotlib图像的功能,还需要安装Matplotlib库。


imutils的使用方法


OpenCV中提供了图像平移的实现,要先计算平移矩阵,然后利用仿射变换实现平移,在imutils中可直接进行图像的平移。


translated = imutils.translate(img,x,y)


  • img:要移动的图像
  • x:沿x轴方向移动的像素个数
  • y: 沿y轴方向移动的像素个数


图片的缩放在imutils中自动保持原有图片的宽高比,只指定宽度weight和Height即可。


img = cv.imread("a.jpeg")
resized = imutils.resize(img,width=200)
print("原图像: ", img.shape)
print("缩放后:",resized.shape)
plt.figure(figsize=[10, 10])
plt.subplot(1,2,1)
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.title('原图')
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(cv.cvtColor(resized, cv.COLOR_BGR2RGB))
plt.title('缩放结果')
plt.axis("off")
plt.show()


图像旋转


import cv2
import imutils
 
image = cv2.imread('a.jpeg')
rotated = imutils.rotate(image, 90)                                                                                      
rotated_round = imutils.rotate_bound(image, 90)                                 
 
plt.figure(figsize=[10, 10])
plt.subplot(1,3,1)
plt.imshow(img[:,:,::-1])
plt.title('原图')
plt.axis("off")
plt.subplot(1,3,2)
plt.imshow(rotated[:,:,::-1])
plt.title('逆时针旋转90度')
plt.axis("off")
plt.subplot(1,3,3)
plt.imshow(rotated_round[:,:,::-1])
plt.title('顺时针旋转90度')
plt.axis("off")
plt.show()


骨架提取,是指对图片中的物体进行拓扑骨架(topological skeleton)构建的过程。imutils提供的方法是skeletonize(),第二个参数是结构参数的尺寸(structuring element),越小需要处理的时间越长。


import cv2
import imutils
image = cv2.imread('a.jpg')
 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)                                  
 
skeleton = imutils.skeletonize(gray, size=(3, 3))  
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(skeleton,cmap="gray"),plt.title('骨架提取结果')
plt.xticks([]), plt.yticks([])
plt.show()


在使用OPenCV时,应检查当前正在使用哪个版本的OpenCV,然后使用适当的函数或方法。在imutils中的is_cv2()、is_cv3()和is_cv4()是可用于自动确定当前环境的OpenCV的版本简单的功能。


DNN模块


DNN模块是指OpenCV中的深度神经网络(Deep Neural Networks)模块


OpenCV的DNN模块是一个强大的工具,它允许开发者在计算机视觉应用中利用深度学习模型进行分类、分割、检测和跟踪等任务。这个模块支持加载和使用由不同深度学习框架训练的模型,包括但不限于Caffe、TensorFlow和Torch/PyTorch等。


  1. 模型加载与推断:DNN模块可以加载预训练的深度学习模型,并使用这些模型对新数据进行推断或预测。


  1. 性能优化:OpenCV在加载模型时会使用自己的DNN模块对模型进行重写,以提高模型的运行效率。


  1. 通用性:DNN模块不局限于特定的深度学习框架,它能够处理多种框架训练出的模型,这使得开发者可以自由选择适合自己的框架进行模型训练。


  1. 实用性:DNN模块的应用非常广泛,可以用于实时目标检测等复杂的计算机视觉任务。例如,可以使用Caffe框架下的MobileNet-SSD模型进行高效的目标检测。


dnn.blobFromImage


  • 根据输入图像,创建维度N,通道数C,高H和宽W次序的blobs


blobFromImage(image, 
                  scalefactor=None, 
                  size=None, 
                  mean=None, 
                  swapRB=None, 
                  crop=None, 
                  ddepth=None):


dnn.NMSBoxes


根据给定的检测boxes和对应的scores进行NMS(非极大值抑制)处理


NMSBoxes(bboxes, 
             scores, 
             score_threshold, 
             nms_threshold, 
             eta=None, 
             top_k=None)


dnn.readNet


加载深度学习网络及其模型参数


readNet(model, config=None, framework=None)
相关文章
|
1月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
232 1
|
16天前
|
存储 算法 数据可视化
算法金 | D3blocks,一个超酷的 Python 库
D3Blocks是一个基于d3.js的Python图形库,用于创建吸引人的数据可视化图表,如D3graph、Elasticgraph和Sankey图。拥有超过470个Star,其特点包括简易性、功能丰富、易用性、可定制性和及时更新。通过pip安装后,用户能轻松创建粒子图和其他图表。文中展示了实战应用,如能源数据集的网络图,通过调整节点和边的属性实现个性化展示。关注作者,享受智能乐趣。
48 8
算法金 | D3blocks,一个超酷的 Python 库
|
15天前
|
机器学习/深度学习 算法 计算机视觉
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
|
25天前
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用"添加库"功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
1月前
|
Linux 开发工具 计算机视觉
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt是跨平台的开发工具,推荐使用QtCreator进行Windows和Linux开发。在Windows下,使用Visual Studio创建动态库时,需要配置.lib文件并确保运行时.dll与.exe在同一目录。在QtCreator中添加DLL动态库,可以通过右键项目,选择添加库,然后在Details界面配置库文件、包含路径和平台,最后更新PRO文件并进行清除、qmake和构建步骤。运行时同样需确保.dll文件与可执行文件在同一目录。
|
1月前
|
数据采集 人工智能 自然语言处理
综述170篇自监督学习推荐算法,港大发布SSL4Rec:代码、资料库全面开源!
【5月更文挑战第20天】港大团队发布SSL4Rec,一个全面开源的自监督学习推荐算法框架,基于170篇相关文献的深入分析。SSL4Rec利用未标记数据提升推荐系统性能,解决了传统方法依赖大量标记数据的问题。开源代码与资料库促进研究复现与交流,为推荐系统领域带来新思路和工具。尽管面临数据需求大和依赖数据质量的挑战,但SSL4Rec展现出巨大的发展潜力和跨领域应用前景。[链接:https://arxiv.org/abs/2404.03354]
49 1
|
1月前
|
机器学习/深度学习 监控 算法
开源计算机视觉库OpenCV详解
开源计算机视觉库OpenCV详解
|
1月前
|
计算机视觉 Python
OpenCV 库创建了一个简单的动画
OpenCV 库创建了一个简单的动画
33 2
|
1月前
|
算法 计算机视觉
【OpenCV】- 分水岭算法
【OpenCV】- 分水岭算法
|
1月前
|
机器学习/深度学习 算法 数据挖掘
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧