您的位置:首页 >宏观经济 >

在 Python 中使用 OpenCV 进行图像处理

时间:2022-11-21 12:16:20 来源:

任务描述

· 使用 Python 代码自己创建图像。

· 拍摄 2 张图像,裁剪两张图像的一部分并交换它们。

· 拍摄 2 张图像并将它们组合成一张图像。例如拼贴画。

首先,我们将探索有关 Python 中图像处理和 OpenCV 库的各种细节。

什么是图像处理?

图像是计算机世界中的多维数组。黑白图像的 2D 数组和 RGB 的 3D 数组。

彩色图像在计算机中以三维 (3D) 数组的形式存储,其中仅存储 0-255 个值,此外 0 和 255 分别代表黑色和白色。

图像处理通过数字计算机处理数字图像。图像处理专注于开发能够对图像进行处理的计算机系统。该系统的输入是数字图像,系统使用有效算法处理该图像,并提供图像作为输出。

像素是图像的最小单位。从技术上讲,它是数组中行和列特定位置的一个条目。每个像素由三种颜色组成,即红色、绿色和蓝色。在组合这些不同的颜色时形成。多个像素一起形成一个完整的图像。

视频处理是指逐帧对视频进行操作。帧只是视频的特定实例,即单个时间点的图像。即使在一秒钟内,我们也可能有多个帧。视频是连续不断的图像流。

Python 提供了许多用于图像处理的库,包括:

OpenCV - 图像处理库主要专注于实时计算机视觉,广泛应用于 2D 和 3D 特征工具包、面部和手势识别、人机交互、移动机器人、对象识别等领域。

**Numpy 和 Scipy 库 **- 用于图像操作和处理。

Sckikit - 为图像处理提供大量算法。

Python Imaging Library (PIL) - 对图像执行基本操作,如创建缩略图、调整大小、旋转、在不同文件格式之间转换等。

在这里,我们将使用 OpenCV 模块。

OpenCV 是最流行的计算机视觉库之一。如果你想在计算机视觉领域开始你的旅程,那么对 OpenCV 概念的透彻理解至关重要。

OpenCV是一个用于计算机视觉、机器学习和图像处理的大型开源库。OpenCV 支持多种编程语言,如 Python、C++、Java 等。它可以处理图像和视频以识别物体、面部,甚至是人类的笔迹。

当它与各种库集成时,例如Numpy,一个高度优化的数值运算库,那么在 Numpy 中可以进行的任何操作都可以与 OpenCV 结合使用。

一般颜色代码是 RGB,但在 OpenCV 中使用的颜色代码格式是 BGR(蓝绿红)。

安装 OpenCV

要在你的系统上安装 OpenCV,请运行以下 pip 命令:

pip install opencv-python

旋转图像

首先,导入 cv2 模块。

import cv2

现在要读取图像,使用 cv2 模块的 imread() 方法,在参数中指定图像的路径并将图像存储在变量中,如下所示:

img = cv2.imread("pyimg.jpg")

该图像现在被视为一个矩阵,其中行和列值存储在 img 中。

实际上,如果你检查 img 的类型,它会给你以下结果:

>>>print(type(img))<class 'numpy.ndarray'>

这是一个 NumPy 数组!这就是为什么使用 OpenCV 进行图像处理如此简单的原因。你一直在使用 NumPy 数组。

要显示图像,可以使用 cv2 的 imshow() 方法。

cv2.imshow('Original Image', img) cv2.waitKey(0)

waitkey() 函数将时间作为参数(以毫秒为单位)作为窗口关闭的延迟。在这里,我们将时间设置为零以永久显示窗口,直到我们手动关闭它。

要旋转此图像,你需要图像的宽度和高度,因为稍后将在旋转过程中使用它们。

height, width = img.shape[0:2]

shape 属性返回图像矩阵的高度和宽度。如果你打印

img.shape[0:2]

好的,现在我们有了图像矩阵,我们想要得到旋转矩阵。为了得到旋转矩阵,我们使用 cv2 的*getRotationMatrix2D()方法。getRotationMatrix2D()*的语法是:

cv2.getRotationMatrix2D(center, angle, scale)

这里的中心是旋转的中心点,角度是以度为单位的角度,比例是使图像适合屏幕的比例属性。

要获得我们图像的旋转矩阵,代码是:

rotationMatrix = cv2.getRotationMatrix2D((width/2, height/2), 90, .5)

下一步是在旋转矩阵的帮助下旋转我们的图像。

为了旋转图像,我们有一个名为wrapAffine的 cv2 方法,它以原始图像、图像的旋转矩阵以及图像的宽度和高度作为参数。

rotatedImage = cv2.warpAffine(img, rotationMatrix, (width, height))

旋转后的图像存储在 rotateImage 矩阵中。要显示图像,请使用 imshow(),如下所示:

cv2.imshow('Rotated Image', rotatedImage)cv2.waitKey(0)

使用网络摄像头捕获图像:

import cv2 cap = cv2.VideoCapture(0) # here, 0 — to access internal webcam & 1 to access external webcam ret , photo = cap.read()

# clicks the photoret cv2.imwrite(“my”,photo)

# stores in a file cap.release() cv2.imshow(“my”, photo)

# displays the photo cv2.waitKey() # used to set the expiry time for the picture to be displayed cv2.destroyAllWindows() #used to destroy or close the picture window without crashing it

使用网络摄像头的视频流:

import cv2 cap = cv2.VideoCapture(0) ret, photo = cap.read() while True: ret, photo = cap.read() cv2.imshow('hi', photo) if cv2.waitKey(10) ==13: break cv.destroyAllwindows()

将图像转换为灰度(黑白)

转换灰度图像的简单方法是像这样加载它:

img = cv2.imread("pyimg.jpg", 0)

还有另一种使用 BGR2GRAY 的方法。

要将彩色图像转换为灰度图像,请使用 cv2 模块的 BGR2GRAY 属性。这在下面的示例中得到了证明:

导入 cv2 模块:

import cv2

阅读图片:

img = cv2.imread("pyimg.jpg")

使用 cv2 模块的 cvtColor() 方法,该方法将原始图像和 COLOR_BGR2GRAY 属性作为参数。将生成的图像存储在变量中:

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

显示原始图像和灰度图像:

cv2.imshow("Original Image", img)cv2.imshow("Gray Scale Image", gray_img)cv2.waitKey(0)

调整图像大小

要调整图像大小,可以使用 openCV 的 resize() 方法。在 resize 方法中,你可以指定 x 和 y 轴的值,也可以指定表示图像大小的行数和列数。

导入并读取图像:

import cv2img = cv2.imread("pyimg.jpg")

现在使用带有轴值的调整大小方法:

newImg = cv2.resize(img, (0,0), fx=0.75, fy=0.75)cv2.imshow('Resized Image', newImg)cv2.waitKey(0)

现在使用行和列值来调整图像大小:

newImg = cv2.resize(img, (550, 350))cv2.imshow('Resized Image', newImg)cv2.waitKey(0)

我们说我们想要 550 列(宽度)和 350 行(高度)。

使用 Python 代码创建图像

输出如下:

拍摄 2 张图像,裁剪两张图像的一部分并交换它们。

结果:

拍摄 2 张图像并将它们组合成一张图像。例如拼贴画。

输出:

水平拼贴

垂直拼贴

原文标题:在 Python 中使用 OpenCV 进行图像处理


郑重声明:文章仅代表原作者观点,不代表本站立场;如有侵权、违规,可直接反馈本站,我们将会作修改或删除处理。