使用Python 3.x介绍OpenCV

bnmcvzx 2018-09-05

使用Python 3.x介绍OpenCV

你想进入计算机视觉,图像处理和人工智能的世界吗?你需要从哪个地方开始呢?在你继续创造一个能够记住人脸的人工智能之前,你必须先学习当然的基础知识。OpenCV可能正是您正在寻找的东西。因此,我们将研究使用OpenCV和Python进行基本图像处理和操作的简单但非常方便的知识,这些知识在您探索计算机视觉的过程中可能会变得至关重要。如果你已经是一名图像处理专家,这篇文章对你来说可能看起来非常小,但是尽管如此,。

在这篇文章里进行图像处理实验。

使用Python 3.x介绍OpenCV

首先让我们开始学习加载我们的图像,Python代码如下:

#importing the OpenCV library

import cv2

#returns the image in the form of a Numpy array

image = cv2.imread("dbz.jpg")

#displaying images

cv2.imshow("original", image)

cv2.waitKey(0)

使用函数cv2.imread()读取图像。图像应该在工作目录中,或者应该给出完整的图像路径。

imread的第二个参数是一个标志,指定应该读取图像的方式。

  • cv2.IMREAD_COLOR :加载彩色图像。任何图像的透明度都将被忽略。这是默认标志。
  • cv2.IMREAD_GRAYSCALE :以灰度模式加载图像
  • cv2.IMREAD_UNCHANGED :加载图像,包括alpha通道。

但是,我知道我们一般很懒,所以输入那些长旗名不是一个选项,为此我们可以简单地分别使用数字1,0和-1作为上述标志。因此,我们接下来要做的是以灰度加载图像。

因此,我们需要做的就是在cv2.imread行中包含一个参数0,以灰度行显示我们的图像,我们的Python代码现在看起来像这样:

import cv2

#returns the image in the form of a Numpy array.

#use second argument as 0 to load image in grayscale

image = cv2.imread("dbz.jpg",0)

#displaying images

cv2.imshow("original", image)

cv2.waitKey(0)

print(image.shape)

使用Python 3.x介绍OpenCV

现在您一定在想cv2.waitKey(0)命令到底做了什么?命令cv2.waitKey()是一个键盘绑定函数。它的参数是以毫秒为单位的时间。该函数等待任何键盘事件的指定毫秒。如果您在那个时间按下任何键,程序将继续。如果传递了0,它将无限期地等待键击。它还可以设置为检测特定的击键,如按下a键等,我们将在下面讨论。

cv2.imread()函数以Numpy数组的形式返回图像。是的,我们可以得到Numpy数组的形状来了解图像的分辨率。我们可以在代码中使用print(image.shape)来实现这一点。

使用Python 3.x介绍OpenCV

这样我们就知道图像的分辨率是353 x 500这意味着图像是353像素高,500像素宽,但我们也看到有第三个数字作为输出。这个数字只是告诉我们图像中颜色通道的数量即红色,蓝色和绿色,因为我们的图像是RGB格式。RGB图像(有时称为truecolor图像)存储为一个m×n×3的数据数组,它为每个单个像素定义红色、绿色和蓝色组件。每个像素的颜色是由存储在像素位置的每个颜色平面上的红色、绿色和蓝色强度的组合决定的。

让我们继续学习如何调整图像大小。我们可以使用命令cv2.resize()来做到这一点。我们把图像的分辨率修改为150 x 100。Python代码如下:

#importing the OpenCV library

import cv2

#returns the image in the form of a Numpy array

image = cv2.imread("dbz.jpg")

#resizing our image

resized = cv2.resize(image, (150,100), interpolation = cv2.INTER_AREA)

#displaying resized image

cv2.imshow("resized", resized)

cv2.waitKey(0)

可以手动指定图像的大小,也可以指定缩放因子。使用不同的插值方法。优选的插值方法是cv.INTER_AREA用于缩放,cv.INTER_CUBIC(慢)和cv.INTER_LINEAR用于变焦。默认情况下,使用的插值方法是cv.INTER_LINEAR,用于所有调整大小的目的。如您所见,我们使用cv2.INTER_AREA作为缩放因子。

使用Python 3.x介绍OpenCV

现在让我们学习如何旋转图像,使用以下命令来执行此操作。首先,我们存储图像的高度和宽度并计算其中心。然后我们形成一个新的旋转矩阵,它将描述我们的图像在围绕其中心旋转时的外观,我们将通过使用cv2.getRotationMatrix2D()来实现。第二个参数是我们想要旋转图像的度数,即,在这种情况下为90度。第三个参数将缩放因子表示为1.0,这意味着我们不会以任何方式调整图像大小。cv2.warpAffine()用于以我们需要的旋转形式实际返回图像。Python代码如下:

h, w, c = image.shape

#calculate center of image

Center = (w / 2, h / 2)

# rotate the image by 90 degrees

X = cv2.getRotationMatrix2D(Center, 90, 1.0)

rotate = cv2.warpAffine(image, X, (w, h))

cv2.imshow("rotated_goku", rotate)

cv2.waitKey(0)

使用Python 3.x介绍OpenCV

我们要学习的下一件事就是裁剪我们的形象,这确实很容易。我们只需使用Y轴和X轴所需的坐标传递图像,即可裁剪出我们需要的图像部分。

cropped = image[50:200, 100:300]

cv2.imshow("cropped", cropped)

使用Python 3.x介绍OpenCV

如果需要,您还可以使用cv2.line(),cv2.rectangle,cv2.circle()等函数在图像上绘制随机内容。所有这些函数都将第一个参数作为绘制图形的图像。最后一个参数描述了绘制的图形的厚度,如果它被指定为-1,那么整个图形将被着色,但是您不能使用-1作为线条的最后一个参数,原因很明显,它已经被着色了。Python代码如下:

import cv2

#returns the image in the form of a Numpy array

image = cv2.imread("dbz.jpg")

#draw a red line from origin to 150,150

cv2.line(image,(0,0),(150,150),(0,0,255),15)

#draw a black rectangle with upper left and lower right co-ordinates as (50,50) and (250,250)

cv2.rectangle(image,(50,50),(250,250),(0,0,0),10)

#draw a pink circle with center as (70,70), with radius 30

cv2.circle(image,(70,70),30,(255,0,255),5)

#display image

cv2.imshow("line_original", image)

cv2.waitKey(0)

使用Python 3.x介绍OpenCV

使用Python 3.x介绍OpenCV

这篇文章将涉及的最后一件事是关于在图像上写东西并永久保存它。cv2.putText()用于将一些文本写入图像。第一个参数显然是我们的原始图像,下一个是要显示的字符串。第三个参数描述了我们要放置文本的坐标,下一个参数是我们将使用的字体样式。接下来的两个参数描述了文本的颜色和字符的分离。参数cv2.LINE_AA描述了反锯齿用于显示字符串。Python代码如下:

import cv2

image = cv2.imread("dbz.jpg")

#putting text on our image

cv2.putText(image,'GOKU!!!',(200,30),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255),2,cv2.LINE_AA)

#displaying image

cv2.imshow("original", image)

#writing image to memory

cv2.imwrite("goku.png", image)

cv2.waitKey(0)

使用Python 3.x介绍OpenCV

相关推荐