了解在Python中进行图像处理的OpenCV的基础知识

292 阅读5分钟

OpenCV被称为开源计算机视觉,是一个用于计算机视觉和图像处理任务的Python库。它有一个模块化的结构,包括几个共享和静态库。OpenCV可以在Python、C++、Java等语言中使用。OpenCV的一些应用包括边缘检测、人脸检测、物体检测、人脸识别等。

使用OpenCV,我们可以处理图像,从中提取所需的信息。OpenCV使用Numpy(Numerical Python),这是一个高度优化的数字运算库。人们可以很容易地从这里安装OpenCV。

如果想使用OpenCV,可以在Anaconda提示符下使用下面的命令来安装它。

conda install -c anaconda opencv

Python中的OpenCV基础知识

1.读取图像

## Import OpenCV library
import cv2  
import numpy as np
# Load an image
img = cv2.imread(r"dogs.jpg", 1)
# Show image
cv2.imshow('image',img)  #1st arg - window name, 2nd - our image
cv2.waitKey(0)
cv2.destroyAllWindows()

imread()函数以不同的形式读取图像。

图像形式描述标志
cv2.IMREAD_COLOR加载一个彩色图像。(默认情况下)1
cv2.IMREAD_GRAYSCALE以灰度模式加载图像0
cv2.IMREAD_UNCHANGED按原样加载图像,包括阿尔法通道-1

cv2.imshow()函数有图像屏幕的名称和要显示的图像参数。

cv2.waitKey()是一个键盘绑定函数。它的参数是以毫秒为单位的时间。该函数在指定的毫秒内等待任何键盘事件。如果你在这段时间内按下任何键,程序就会继续。如果传递了0,它就会无限期地等待一个按键。

cv2.destroyAllWindows() 简单地销毁了我们创建的所有窗口。如果你想销毁任何特定的窗口,请使用cv2.destroyWindow()函数,在该函数中你要传递确切的窗口名称作为参数。

2.获取图像的细节

print("Shape of image : ",img.shape) # returns a tuple of number of rows,columns, and channels
print("Sizeof Image : ",img.size) # returns total number of pixels is accessed
print("Datatype of image : ",img.dtype) # returns image dtype obtained

3.调整图像的大小和比例

我们调整图像和文件的大小和比例以防止计算压力。大型媒体文件往往存储了大量的信息。显示它需要大量的处理。在这里,我们实际上是试图摆脱这些信息的一部分。

通常情况下,我们试图降低图像的宽度和高度。在下面的代码中,图像的大小被重新调整为其总大小的75%。

import cv2 
# Load an image
img = cv2.imread(r"dogs.jpg", 1)

def rescaleFrame(frame,scale = 0.75):   # Rescale Image
    width = int(frame.shape[1] * scale)
    height = int(frame.shape[0] * scale)
    dimensions = (width, height)
    return cv2.resize(frame,dimensions,interpolation= cv2.INTER_AREA)  # Resize Image
frame_resized = rescaleFrame(img)
# Show image
cv2.imshow('Original image',img)
cv2.imshow('Resized image', frame_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.为图像绘制形状和添加文本

import numpy as np
import cv2
img = np.zeros([512, 512, 3], np.uint8) # draw a blank image
img = cv2.rectangle(img, (384, 0), (510, 128), (0, 0, 255),thickness= 4)  # Draw a rectangle
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv2.LINE_AA) # Add text in image
cv2.imshow("shapes", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用np.zeros()绘制的图像,默认情况下是绘制一个空白的图像。

cv2.rectangle()函数需要以下参数来绘制一个矩形。

图像名称(img),角的顶点(point1),与point1相对的矩形顶点(point2),矩形的颜色(0,0,255)代表红色。

2. cv2.putText()函数在图像中添加文本。它需要以下参数。

图像名称(img),要添加到图像中的文本,添加文本的位置,其他参数包括文本的字体、字体大小、颜色、厚度和线条类型。

同样地,也可以画一个圆、日食、直线和折线。下面是对它们的描述。

OpenCV的基本功能

在这一节中,我们将看一下通常应用于图像数据的一些函数。这些是建立机器学习和深度学习模型的预处理步骤。

图像模糊

图像模糊是指使图像不那么清晰或明显。它是在各种低通滤波器内核的帮助下完成的。它有助于去除图像中的噪音和平滑图像。有三种类型的模糊。它们是高斯模糊、中值模糊和双侧模糊。高斯模糊是通过高斯函数对图像进行模糊处理的结果。

边缘串联

Canny边缘检测是一种流行的边缘检测算法。它适用于模糊的图像,以获得图像的边缘或特征。

图像扩张

图像扩张增加了物体的面积。通过扩张,我们可以得到更好的去噪效果。它有助于连接图像中物体的一些破碎部分。下面的代码显示了对图像进行的上述操作。

img = cv2.imread(r"dog_1.jpg", 1)
# Blur Image
blur = cv2.GaussianBlur(img,(5,5),cv2.BORDER_DEFAULT)
# Edge Cascade
cascade = cv2.Canny(img,125,175)
# Edge cascade of Blurred image
canny = cv2.Canny(blur,125,175)
# Dilating the image
dilated = cv2.dilate(canny, (7,7), iterations = 4) # (7,7) - kernel size & iterations can be changed 

cv2.imshow('Original image',img)
cv2.imshow('Edge cascade',cascade)
cv2.imshow('Blurred image Edge cascade',canny)
cv2.imshow('Dilated image',dilated)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像转换

基本的图像转换技术包括图像的翻译、旋转、翻转、裁剪和调整大小。

平移

平移基本上是将图像沿X和Y轴移动。使用平移,你可以向上(-y),向下(y),向左(-x),向右(+x)或以任何组合来移动图像。

旋转

旋转是将图像旋转一定的角度。OpenCV允许你指定任何你想要旋转图像的旋转点。

翻转

翻转是对一个图像进行镜像。我们可以垂直(0)、水平(1)、垂直和水平(-1)地翻转图像。0,1,-1这些值指定了翻转图像的翻转代码。

下面的代码显示了应用于图像的所有变换。

import cv2 as cv
import numpy as np
img = cv.imread(r"dog_1.jpg", 1)
cv.imshow('Dog', img)

# Translation
def translate(img, x, y): # x,y specify the axis for translation
    transMat = np.float32([[1,0,x],[0,1,y]]) # translation matrix
    dimensions = (img.shape[1], img.shape[0]) # image width, height 
    return cv.warpAffine(img, transMat, dimensions)
translated = translate(img, -50, 50)
cv.imshow('Translated', translated)

# Rotation
def rotate(img, angle, rotPoint=None):  # angle of roation, rotation point as input
    (height,width) = img.shape[:2]
    if rotPoint is None:
        rotPoint = (width//2,height//2) # rotate around center
    rotMat = cv.getRotationMatrix2D(rotPoint, angle, 1.0)
    dimensions = (width,height)
    return cv.warpAffine(img, rotMat, dimensions)
rotated = rotate(img, -45) # clockwise rotation
cv.imshow('Rotated', rotated)
rotated_rotated = rotate(img, -90) # rotated image can again be rotated
cv.imshow('Rotated Rotated', rotated_rotated)

# Flipping
flip = cv.flip(img, -1)
cv.imshow('Flip', flip)
cv.waitKey(0)

结论

我们已经学习了如何使用OpenCV在python中处理图像的基本知识。最重要的是,这些操作可以应用于视频数据,因为OpenCV可以用来处理视频。

继续探索OpenCV吧!

参考文献

docs.opencv.org/3.4/db/deb/…

docs.opencv.org/3.4/dc/da5/…

docs.opencv.org/3.4/d9/d61/…

towardsdatascience.com/transformat…