初学者在Python中的基本图像处理库 - OpenCV和imutils

处理图像处理和操作的最常用的库之一是 Python 的 OpenCV。对于图像分类、目标检测或光学字符识别,在人工智能领域与图像相关的任何工作大多数时候都需要某种形式的图像处理和操作。

在本教程中,我们将专注于 OpenCV 的一些基本功能。这些功能基础且有时非常有用。我们将通过示例学习它们。在开始之前,这是我们今天将要使用的库。

import cv2
import matplotlib.pyplot as plt

我们将从如何移动或平移图像开始,本教程将使用一个简单的笑脸图像。在这行代码中,使用 `cv2.imread` 函数读取图像并将其存储为数组。

image = cv2.imread('smiley.jpg')

如果你对OpenCV完全不了解,这是‘image’变量的样子:

array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],


       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],


       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],


       ...,


       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],


       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],


       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], dtype=uint8)

可以使用`.imshow()`函数显示图像。Matplotlib和OpenCV库都有`.imshow`函数。

plt.imshow(image)

f13df18e266f27b8ed4fee58d5c51514.jpeg

平移或移动

我们将从如何移动或平移图像开始。本教程将使用一个简单的笑脸图像。定义如何移动图像并将其保存在一个名为`move`的变量中。让我们将图像向右移动100像素,向下移动30像素。因此,`move`变量将如下所示:

move = np.float32([[1, 0, 100], [0, 1, 30]])

在这里,1和0是固定的。[0, 2] 位置上的100将使图像向右移动,[1, 2] 位置上的30将使图像向下移动。

shift = cv2.warpAffine(image, move, (image.shape[1], image.shape[0]))
plt.imshow(shift)

fec5927e00709ec74dbfa16f49285648.jpeg

如果要将图像向左和向上移动,只需使用负号:

move = np.float32([[1, 0, -100], [0, 1, -30]])
shift = cv2.warpAffine(image, move, (image.shape[1], image.shape[0]))
plt.imshow(shift)

c577e7e2f02b8e49b6901c12958e6b5c.jpeg

使用 imutils 库也可以实现相同的效果。以下是语法:

import imutils
moved = imutils.translate(image, -100, -30)

它将生成与上一个图像完全相同的图像。正如您所见,使用 imutils 简单一些。

调整大小

调整大小操作在图像预处理中非常常见。我们根据需要增加或减小图像的高度和宽度。以下是在 OpenCV 中调整大小的语法:

resized = cv2.resize(image, image_shape, interpolation=cv2.INTER_AREA)

我使用 'interpolation' 作为 cv2.INTER_AREA。还有其他选项。稍后我们将讨论它们。让我们从 image_shape 开始。注意要注意纵横比,以确保图像看起来不失真。为此,需要将输出图像的纵横比保持为输入图像的纵横比。如果我们希望输出图像的高度为500,那么输出图像的图像形状需要是:

rsz = 500.0 / image.shape[1]
image_shape = (500, int(image.shape[0] * rsz))

同样,如果我们需要输出图像的宽度为300,我们计算输出图像的高度。

rsz = 300.0 / image.shape[0]
image_shape = (int(image.shape[1] * rsz), 300)
resized = cv2.resize(image, image_shape, interpolation=cv2.INTER_AREA)

第三个参数 'interpolation' 有几个不同的选项。以下是它们的名称:

  • cv2.INTER_LINEAR

  • cv2.INTER_NEAREST

  • cv2.INTER_CUBIC

  • cv2.INTER_LANCZOS4

如果您不提供任何 'interpolation' 方法,OpenCV 使用的默认方法是 cv2.INTER_LINEAR 方法,提供双线性插值。

imutils 库使这一切变得更容易。它为我们计算了纵横比。它只需要高度或宽度。它会自行计算宽度或高度。以下是语法:

im = imutils.resize(image, width=300)

在这里,我们提供了宽度和高度将自动计算,以保持纵横比不变。

裁剪

如果您曾经使用过图像,那么您肯定以某种方式执行过裁剪。裁剪图像的一种常见方法是简单地使用数组的切片。正如我们在开头讨论的那样,图像只是一个NumPy数组。这里我在这里裁剪笑脸:

part = image[0:600, 0:600]
plt.imshow(part)

a5c2781dc3a5a870aa336df833b31a0c.jpeg

这样,它取了顶部600个像素和左侧600个像素。以下是另一个例子:

part = image[100:600, 100:600]
plt.imshow(part)

728818eb0a0c15fd9c5fb1ebfb64e0a3.jpeg

这次我们从顶部和左侧都从第100个像素开始。因此,这里我们从顶部的第100个像素到第599个像素,还有从左侧的第100个像素到第599个像素。请随时尝试其他范围。

·  END  ·

HAPPY LIFE

ce1dc1a99cf9a622175de825fef16a5d.png

本文仅供学习交流使用,如有侵权请联系作者删除

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tcpdump在手机上的使用

首先手机得root才可以,主要分析手机与手机的通信协议 我使用的是一加9pro, root方法参考一加全能盒子、一加全能工具箱官方网站——大侠阿木 (daxiaamu.com)https://optool.daxiaamu.com/index.php tcpdump,要安装在/data/local/tmp下要arm6…

ES(ElasticSearch)技术栈简介

ElasticSearch简介 Elaticsearch,简称为es, es是一个基于apache开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Ja…

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归: 举例:蝉(昆虫物种&…

深度学习(7)--卷积神经网络项目详解

一.项目介绍: 用Keras工具包搭建训练自己的一个卷积神经网络(Simple_VGGNet,简单版VGGNet),用来识别猫/狗/羊三种图片。 数据集: 二.卷积神经网络构造 查看API文档 Convolution layers (keras.io)https://keras.io/api/layers/…

氢气传感器报警值:守护实验室安全的隐形卫士

随着科技的发展,我们的生活变得越来越便捷,但是与此同时,安全问题也日益凸显。其中,氢气作为一种清洁能源,被广泛应用于各个领域,但是如果不加以控制,氢气泄漏也可能带来严重的安全隐患。因此&a…

burp靶场--xss上篇【1-15】

burp靶场–xss https://portswigger.net/web-security/cross-site-scripting 1. 什么是xss: 跨站脚本 (XSS) 是一种通常出现在 Web 应用程序中的计算机安全漏洞。XSS 允许攻击者将恶意代码注入网站,然后在访问该网站的任何人的浏览器中执行该代码。这可能允许攻击…

计算机设计大赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

如何将rmvb视频转换成mp4格式?如何播放rmvb视频?

RMVB文件格式的特性及使用场景 RMVB以其独特的可变比特率压缩方式而著称。这一特性使其能够根据视频内容自动调整比特率,不仅保证了视频质量,同时高效减小了文件大小。这种优势使得RMVB常见于在线视频、电视剧以及一些高清电影资源中。 RMVB文件格式的…

exec函数族和守护进程

exec函数族 进程调用exec函数族执行某个程序 进程当前内容被指定程序替换 实现让父子进程实现不同的程序: 父进程创建子进程 子进程调用exec函数族 父进程不受影响 execl和execlp #include <stdio.h> int execl (const char * path, const char * arg , ...); i…

微信小程序(二十六)列表渲染基础核心

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.列表渲染基础写法 2.外部索引和自身索引 源码&#xff1a; index.wxml <view class"students"><view class"item"><text>序号</text><text>姓名</text…

大数据 - Hadoop系列《四》- MapReduce(分布式计算引擎)的核心思想

上一篇&#xff1a; 大数据 - Hadoop系列《三》- MapReduce&#xff08;分布式计算引擎&#xff09;概述-CSDN博客 目录 13.1 MapReduce实例进程 13.2 阶段组成 13.4 概述 13.4.1 &#x1f959;Map阶段&#xff08;映射&#xff09; 13.4.2 &#x1f959;Reduce阶段执行过…

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例&#xff0c;神经网络一般包括backbone和head&#xff08;计算机视觉领域&#xff09; 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别&#xff0c;一般写作num…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第23套

少儿编程 蓝桥杯青少组科技素养题真题及解析第23套 1、英国计算机科学家艾伦图灵于 1950 年提出了著名的“图灵测试”,用于判断计算机是否具有智能。“图灵测试”是通过()的方法进行判断的 A、让两台计算机对话 B、让人类与计算机对话 C、给计算机出题 D、让计算机分辨图…

HarmonyOS使用Web组件加载页面

1、加载网络页面 在Web组件创建时&#xff0c;指定默认加载的网络页面 。在默认页面加载完成后&#xff0c;如果开发者需要变更此Web组件显示的网络页面&#xff0c;可以通过调用loadUrl()接口加载指定的网页。 默认在Web组件加载完“www.baidu.com”页面后&#xff0c;点击按…

云原生 k8s 可能使用到的端口整理【不定期更新】

k8s 因为涉及到的组件太多了&#xff0c;所以端口有很多&#xff0c;这里整理了日常所接触的接口&#xff0c;后续有新的再更新。 如果是通过公网 IP 进行安装的时候需要根据实际情况有选择的进行放开&#xff1b;一般只有云厂商会提供公网 IP 访问&#xff0c;自建的话不建议 …

APUE学习之进程间通信(IPC)(下篇)

目录 一、进程间通信&#xff08;IPC&#xff09; 二、信号量&#xff08;Semaphore&#xff09; 1、基本概念 2、同步关系与互斥关系 3、临界区与临界资源 4、信号量的工作原理 5、信号量编程 6、实战演练 三、共享内存&#xff08;Shared Memory&#xff09; 1、…

多线程c++

目录 1.join和detach区别 2.lock_guard和unique_lock 3.原子操作 4.条件变量condition_variable 5.future 和 promise 1.join和detach区别 ①不使用join和detach #include <iostream> #include <thread> #include <windows.h>using namespace std;v…

Linux文本三剑客-grep

1.grep简介&#xff1a; grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来&#xff0c;都是按行处理的。 grep 最主要…

腾讯云云监控实践:使用云审计 CloudAudit SDK 精准管理腾讯云资源

文章目录 一、什么是腾讯云的操作审计 CloudAudit二、CloudAudit 有哪些优势三、CloudAudit 应用场景举例3.1 安全分析3.2 资源变更跟踪3.3 合规性审计 四、使用云审计 SDK 进行云监控4.1 安装环境包 PHP4.2 下载并解压云审计 PHP SDK4.3 创建的腾讯云持久证书&#xff08;如果…

解决:ModuleNotFoundError: No module named ‘selenium’

解决&#xff1a;ModuleNotFoundError: No module named ‘selenium’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named selenium背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&#xff0…