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吧!