imutils简介

news2024/11/23 12:32:28

imutils对一系列OpenCV函数进行二次封装,执行基本任务,如平移、旋转、调整大小和骨架提取。

1.安装

这个包假设您已经安装了NumPy和OpenCV(如果您打算使用opencv2matplotlib函数,还安装了matplotlib)。

要安装库,只需使用以下命令:

pip install imutils

2.对OpenCV函数的二次封装

让我们继续,看看我们可以用这个包做什么。

2.1平移

平移是指图像在x或y方向上的平移。要在OpenCV中平移图像,你需要提供(x, y)的平移量,表示为(tx, ty)以构造平移矩阵M:
M = [ 1 0 t x 0 1 t y ] M =

[ 1 0 t x 0 1 t y ] \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y\end{bmatrix} [1001txty]

M=[1001txty]
然后,您需要应用函数cv2. warpaffine

我们不再手工构造平移矩阵M,只需要调用imutilstranslate函数。

import imutils
import cv2

img = cv2.imread("translate.png")
cv2.imshow("src", img)
# 向右平移图像25像素,向上平移图像75像素
translate_img = imutils.translate(img, 25, -75)
cv2.imshow("translate_img", translate_img)
cv2.waitKey()

在这里插入图片描述

2.2旋转

在OpenCV中旋转图像是通过调用cv2.getRotationMatrix2Dcv2.warpAffine来完成的。需要进一步注意提供图像旋转点的(x, y)坐标。这些调用会迅速增加计算,使代码变得笨重且可读性较差。imutils中的rotate函数可以帮助解决这个问题。

import imutils
import cv2

img = cv2.imread("translate.png")
cv2.imshow("src", img)
# 在角度上循环以旋转图像
for angle in range(0, 360, 90):
    # 旋转图像并显示它
    rotated = imutils.rotate(img, angle=angle)  # 旋转后的图像在原图尺寸里面的部分,会丢失信息
    # rotated = imutils.rotate_bound(img, angle=angle)  # 旋转后的图像的最小外接矩形
    cv2.imshow("Angle=%d" % (angle), rotated)
cv2.waitKey()

在这里插入图片描述

2.3缩放

在OpenCV中调整图像大小是通过调用cv2.resize函数来完成的。然而,需要特别注意imutils.resize确保长宽比是不变的。imutils的这个resize函数保持了长宽比,并提供了关键字参数width和height,以便图像可以调整到预期的宽度/高度,同时(1)保持长宽比,(2)确保图像的尺寸不必由开发人员显式计算。

另一个可选关键字参数inter,也可以用于指定插值方法。

import imutils
import cv2

img = cv2.imread("translate.png")
cv2.imshow("src", img)
# 在不同的宽度上循环以调整图像的大小
for width in (400, 300, 200, 100):
    # 调整图像大小并显示它
    resized = imutils.resize(img, width=width)
    cv2.imshow("Width=%dpx" % (width), resized)
cv2.waitKey()

在这里插入图片描述

2.4骨架化

骨架化是在图像中构建物体的“拓扑骨架”的过程,该物体被假定为黑色背景下的白色物体。OpenCV没有提供显式构造骨架的函数,但提供了形态和二进制函数来实现这一点。

为方便起见,可以利用imutilsskeletonize函数来构造图像的拓扑骨架。

第一个参数size是结构化元素内核的大小。一个可选参数structuring,可以用来控制结构化元素-它默认为cv2.MORPH_RECT,但可以是任何有效的结构元素。

import imutils
import cv2

logo = cv2.imread("pyimagesearch.jpg")
cv2.imshow("src", logo)
# 骨架提取
gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)
skeleton = imutils.skeletonize(gray, size=(3, 3))
cv2.imshow("Skeleton", skeleton)
cv2.waitKey()

在这里插入图片描述

2.5 Matplotlib显示图片

在OpenCV的Python绑定中,图像以BGR顺序表示为NumPy数组。当使用cv2.imshow时,这工作得很好。但是,如果您打算使用Matplotlib,因为plt.imshow函数假设图像是RGB顺序的。调用cv2.cvtColor将解决这个问题,或者您可以使用opencv2matplotlib函数。

import imutils
import cv2
import matplotlib.pyplot as plt

logo = cv2.imread("translate.png")
cv2.imshow("src", logo)
# 错误用法:显示图像时不转换颜色空间
plt.figure("Incorrect")
plt.imshow(logo)
# 正确用法:在使用plt.imshow之前转换颜色空间
plt.figure("Correct")
plt.imshow(imutils.opencv2matplotlib(logo))
plt.show()
cv2.waitKey()

在这里插入图片描述

3.imutils的源码

3.1平移

def translate(image, x, y):
    # 定义平移矩阵并执行平移操作
    M = np.float32([[1, 0, x], [0, 1, y]])
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

    # 返回平移后的图像
    return shifted

3.2旋转

def rotate(image, angle, center=None, scale=1.0):
    # 获取图像宽高
    (h, w) = image.shape[:2]

    # 如果center为None,则将其初始化为图像的中心
    if center is None:
        center = (w // 2, h // 2)

    # 旋转实现
    M = cv2.getRotationMatrix2D(center, angle, scale)
    rotated = cv2.warpAffine(image, M, (w, h))

    # 返回旋转后的图像
    return rotated

3.3缩放

def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    # 初始化要调整大小的图像的尺寸并获取图像大小
    dim = None
    (h, w) = image.shape[:2]

    # 如果width和height都为None,则返回原始图像
    if width is None and height is None:
        return image

    # 检查width是否为None
    if width is None:
        # 计算高度的比率和构造尺寸
        r = height / float(h)
        dim = (int(w * r), height)

    # 否则,height为None
    else:
        # 计算宽度的比率和构造尺寸
        r = width / float(w)
        dim = (width, int(h * r))

    # 调整图像大小
    resized = cv2.resize(image, dim, interpolation=inter)

    # 返回调整后的图像
    return resized

3.4骨架化

def skeletonize(image, size, structuring=cv2.MORPH_RECT):
    # 确定面积(即图像中的总像素数),
    # 初始化输出的骨架图像,构造形态结构元素
    area = image.shape[0] * image.shape[1]
    skeleton = np.zeros(image.shape, dtype="uint8")
    elem = cv2.getStructuringElement(structuring, size)

    # 继续循环直到从图像中移除所有像素
    while True:
        # 使用结构元素腐蚀和膨胀图像
        eroded = cv2.erode(image, elem)
        temp = cv2.dilate(eroded, elem)

        # 从原始图像中减去临时图像,然后在骨架和临时图像之间取位“或”
        temp = cv2.subtract(image, temp)
        skeleton = cv2.bitwise_or(skeleton, temp)
        image = eroded.copy()

        # 如果图像中没有更多的“白色”像素,那么就退出循环
        if area == area - cv2.countNonZero(image):
            break

    # 返回骨架提取后的结果
    return skeleton

3.5Matplotlib显示图片

def opencv2matplotlib(image):
    # OpenCV以BGR顺序表示图像;然而,Matplotlib期望图像在RGB顺序,所以简单地从BGR转换为RGB并返回
    return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

参考目录

https://www.pyimagesearch.com/2015/02/02/just-open-sourced-personal-imutils-package-series-opencv-convenience-functions/

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

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

相关文章

【OpenDDS开发指南V3.20】第九章:DCPS信息库

DCPS信息存储库选项 下表显示了DCPInfoRepo服务器的命令行选项: 表9-1 DCPS信息存储库选项 选项描述默认值-o file将DCPInfo对象的IOR写入指定文件repo.ior-NOBITS禁用发布内置主题发布内置主题-a address内置主题的侦听地址(发布内置主题时)随机端口-z启用详细传输日志记…

关系数据库概述

一、数据模型 一般地讲,数据模型是严格定义的一组概念的集合,通常由数据结构、数据操作和完整性约束三部分组成。 1.1 数据结构 数据结构描述数据库的组成对象以及对象之间的联系。数据结构是刻画一个数据模型性质最重要的方面。因此在数据库系统中&…

数据的存储【详解】【强烈推荐!!!】

数据的存储1. 数据类型介绍1.1 类型的基本归类2. 整型在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习3. 浮点型在内存中的存储3.1 一个例子3.2 浮点数存储规则1. 数据类型介绍 基本的内置类型、大小(字节)(VS编译器)…

bootstrap校验laydate起止日期联动失效

项目场景: 提示:这里简述项目相关背景: 项目中用到bootstrapValidator,以及laydate(by:贤心,插件效果美观)。 项目表单中,有两处需要联动校验:开始日期,结束…

第04讲:HTTP操作之ElasticSearch高级查询

3.1.4、高级查询 Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询 定义数据 : # POST /student/_doc/1001 {"name":"zhangsan", "nickname":"zhangsan", "sex":"男","age":30 } # POST…

MySQL innodb引擎架构分析-Change Buffer

系列文章目录 1. MySQL innodb引擎架构分析-Buffer Pool 2. MySQL innodb引擎架构分析-Redo log 3. MySQL innodb引擎架构分析- Double Write Buffer 4.MySQL innodb引擎架构分析-Change Buffer 文章目录系列文章目录前言一、Change Buffer是什么?二、Change Buffe…

日本市场的Starday开始对智能家居下重手

自从21世纪以来,物联网就开始进入大众视野,因此作为物联网基础应用的智能家居已经成为人们对生活场景的一种涉嫌。因此在国外市场当中,跨境电商卖家们通过物联网的智慧家居的售卖,获得了大量的资金,可知“跨境沃土”大…

LeetCode54.螺旋矩阵 LeetCode59.螺旋矩阵Ⅱ | 螺旋矩阵问题

LeetCode刷题记录 文章目录LeetCode54.螺旋矩阵思路代码LeetCode59 螺旋矩阵Ⅱ思路代码LeetCode54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例一 输入:matrix [[1,2,3],[4,5,6],[7,8,9…

Ubuntu-22 live-server版本安装完成后的配置

软件包管理工具 aptapt 用于取代 apt-get 、apt-cache &#xff0c;apt 将分散在 apt-get 、 apt-cache 的基础操作统一包含在一起apt 与 apt-get 、apt-cache 的对应关系操作aptapt-安装软件包sudo apt install <package>sudo apt-get install <package>卸载软件包…

AcWing 1015. 摘花生(DP)

一、问题描述 二、思路分析 这道题非常类似我们数字三角形那道题&#xff0c;大家如果这道题不会的话&#xff0c;可以先去看作者之前写的数字三角形问题的解法&#xff0c;然后再回来看这道题&#xff0c;或许就能有思路了。 传送门&#xff1a; DP母题——数字三角形 1、状…

Jetpack Compose中的列表

Cloumn 和 Row 如果是普通的不是特别长的列表&#xff0c;可以直接使用 Column 和 Row 组件&#xff0c;默认 Column 和 Row 组件是不支持滚动的&#xff0c;如果需要支持滚动可以在 Column 和 Row 组件上使用 Modifier.verticalScroll() 和Modifier.horizontalScroll() 修饰符…

就在今晚!如何在公益向善的路上坚持前行

&#xff08;本文阅读时间&#xff1a;3分钟&#xff09;如何从支教助学到慈善组织到社会创业&#xff1f;如何从内心深处找回向善的力量&#xff1f;如何在挣扎中坚定前行的方向&#xff1f;本期微软ATP Public 100 公益演讲特邀嘉宾还将为小伙伴们提供干货建议&#xff01;微…

JavaScript刷LeetCode拿offer-树的遍历

什么是树 一种分层数据的抽象模型。前端工作中常见的树包括&#xff1a;DOM树&#xff0c;级联选择&#xff0c;树形控件JS中没有树&#xff0c;可以用Object和Array构建树树的常用操作&#xff1a;深度/广度优先遍历&#xff0c;先中后序遍历 深度优先遍历 访问根节点对根节…

Windows Server【开机启动和任务计划程序】实现服务器重启后项目自启动(Windows Server 任务计划程序无法执行问题处理)

1.问题说明 有些时候我们希望计算机开机后就启动一些服务或应用程序&#xff0c;比如远程工具。这里介绍两种方式。 2.开机启动 使用WinR调出运行&#xff0c;输入&#xff1a; 1️⃣ shell:startup 用户开机自启动&#xff08;程序开机自启动只针对当前登录的用户&#xf…

2分布式微服务技术栈-SpringCloud<Feign>

分布式微服务技术栈Feign HTTP 客户端Feign-基于Feign远程调用Feign-自定义配置Feign HTTP 客户端 Feign-基于Feign远程调用 声明式 事务 spring 声明一个 远程调用 封装 所有 对 userservice 的 远程调用 类似于 controller 的 注解 把接口 注入进来 不仅是 http 客户端 …

Node.js 中的模块化

1、模块化的基本概念 1.1、什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2、编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&a…

探索性数据分析(Exploratory Data Analysis,EDA)

目录参考资料PART 02 探索性数据分析 探索性数据分析(Exploratory Data Analysis&#xff0c;简称EDA)&#xff0c;指对数据分析的过程中尽量不加入先验假设&#xff0c;而是通过作图表和统计等方式来探索数据结构和规律。 EDA最早由John W. Tukey在上世纪70年代被提出&#…

批量下载线上数据文件--业务诉求

诉求接到现场运维诉求&#xff0c;需要获取到指定业务节点的所有附件文件分析某个节点的业务信息&#xff0c;可以通过sql来筛选出全部需要的关联字段信息以及文件磁盘路径和上传路径通过脚本或命令&#xff0c;将sql筛选到的路径文件统一复制到指定目录将复制到的文件下载&…

再学C语言25:分支和跳转——continue、break和switch

一般地&#xff0c;进入循环体后&#xff0c;在下次循环判断之前程序执行循环体中所有语句 一、continue语句 continue&#xff1a;循环中&#xff0c;当运行到该语句时&#xff0c;其将导致剩余的迭代部分被忽略&#xff0c;开始下一次迭代 如果continue处于嵌套结构中&…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - 各式各样神奇的自注意力机制(Self-Attention)变型

文章目录一、Self-Attention 各式各样的变型二、How to make self-attention efficient&#xff1f;三、Notice四、Local Attention / Truncated Attention五、Stride Attention六、Global Attention七、Many Different Choices八、Can we only focus on Critical Parts?8.1 C…