openCV 二 图像处理
官网:https://docs.opencv.org/3.2.0/df/d9d/tutorial_py_colorspaces.html
改变颜色空间
本教程颜色空间转换:BGR ↔ Gray and BGR ↔ HSV.
cv2.cvtColor(input_image, flag)
- input_image:输入图像
- flag:openCV标志位,决定颜色空间转换类型,如:(BGR → Gray->flags cv2.COLOR_BGR2GRAY)、(BGR → HSV->cv2.COLOR_BGR2HSV)
获取所有颜色空间转换标志
import cv2 flags = [i for i in dir(cv2) if i.startswith('COLOR_')] print(flags)
目标追踪
现在我们知道如何转换BGR图像到HSV图像,我们可以使用这个去抽取一个颜色对象。HSV比BGR颜色空间更容易去表示一个颜色,在我们的应用中,我们尝试去抽取一个蓝色的颜色对象,具体描述:
1、提取视频的每一帧
2、从BGR颜色空间转换到HSV颜色空间
3、我们为HSB图像设置一个蓝色范围的阈值
4、现在单独提取这个蓝色对象
官方示例代码:
import cv2 import numpy as np cap = cv2.VideoCapture(0) while (1): # 获取每一帧 _, frame = cap.read() # Convert BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of blue color in HSV lower_blue = np.array([110, 50, 50]) upper_blue = np.array([130, 255, 255]) # 将HSV图像阈值化以仅获得蓝色 mask = cv2.inRange(hsv, lower_blue, upper_blue) # 按位与操作 res = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow('frame', frame) cv2.imshow('mask', mask) cv2.imshow('res', res) k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows()
蓝色物体追踪展示:
注意:
1、在这张图片上有一些噪声,在之后的章节中我们将看到如何移除他们
2、这是物体追踪的最简单方式,一但你学习了轮廓函数,你将可以做更多的事情
如何找到要追踪的HSV值
很多常见的问题可以在stackoverflow.com,最简单的方式是使用cv2.cvtColor()函数,你可以传递一个你想要的BGR值而不是一张图片。例如:寻找绿色的HSV值:
import cv2 import numpy as np green = np.uint8([[[0,255,0 ]]]) hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV) print(hsv_green)
图像的几何变换
目标:
学习对图像使用应用不同的几何变换,如:平移、旋转、放射变换等。
缩放
缩放仅仅是改变图像的大小,OpenCV自带了函数cv2.resize()来完成这个目标。图片的大小可以手动指定,也可以通过缩放因子来指定。图像所方式有很多插值方法可以使用,默认使用cv2.INTER_LINEAR。
import cv2 import numpy as np img = cv2.imread('messi5.jpg') res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) #OR height, width = img.shape[:2] res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
收缩时推荐:cv2.INTER_AREA
放大时推荐:cv2.INTER_CUBIC (slow) & cv2.INTER_LINEAR
平移
import cv2 import numpy as np img = cv2.imread('messi5.jpg',0) rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('img',dst) cv2.waitKey(0) cv2.destroyAllWindows()
警告:warpAffine的第三个参数是输出图像的大小,他的形式应该是(width,height),宽等于列的数量,高等于行的数量,关于M矩阵的信息可以参考https://blog.csdn.net/keith_bb/article/details/56331356
旋转
为了找到旋转的变换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D。检查下面的例子,旋转90度的图像相对于中心没有任何缩放。
img = cv2.imread('messi5.jpg',0) rows,cols = img.shape M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(img,M,(cols,rows))
放射变换
在仿射变换中,原图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中得到三个点,以及它们在输出图像中的对应位置。然后cv2。getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv2.warpaffine。
img = cv2.imread('drawing.png') rows,cols,ch = img.shape pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.warpAffine(img,M,(cols,rows)) plt.subplot(121),plt.imshow(img),plt.title('Input') plt.subplot(122),plt.imshow(dst),plt.title('Output')
平滑图像
1、学习使用各种低通过滤器过滤图像
2、对图像使用自定义过滤器
二维卷积(图像滤波)
与一维信号一样,图像也可以用各种低通滤波器(LPF)、高通滤波器(HPF)等进行滤波。LPF有助于去除噪声,模糊图像等。HPF滤波器有助于在图像中找到边缘。
OpenCV提供了一个函数cv2.filter2D()来卷积内核与图像。例如,我们将尝试对图像进行平均滤波。一个5x5的平均滤波内核如下所示:
操作方法是这样的:将该内核保持在一个像素之上,将该内核之下的所有25个像素相加,取其平均值,然后用新的平均值替换中心像素。它继续对图像中的所有像素进行此操作。请尝试此代码并检查结果
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('opencv_logo.png') kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()