人工智能基础-opencv-图像处理篇
一.图像预处理
图像翻转
cv2.flip
是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。这个函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。
img = cv2.imread('../images/car2.png')
#翻转 0:是垂直翻转 1:是水平翻转 -1:垂直加水平翻转
f_img = cv2.flip(img,-1)
要传入的参数有两个,一个是
img:为要传入处理的图片
翻转: -1:水平和垂直 1:水平翻转,0 垂直翻转
图像仿射变换
1.图像旋转
旋转操作可以将图像绕着某个点旋转一定的角度
需要的参数:
(h,w):图像的像素,宽,高
-
center:旋转中心点的坐标,格式为
(x, y)
。 -
angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。在上图变量为du
-
scale:缩放比例。如果设置为 1,则不进行缩放。
返回值
-
M:2x3 的旋转矩阵。
需要提前把参数定义好。例如:
cv2.getRotationMatrix2D
是 OpenCV 库中的一个函数,用于获取旋转矩阵。
随后把获取的旋转矩阵放入cv2.getRotationMatrix2D函数内。
矩阵为2x3 的变换矩阵,类型为 np.float32
。
2.图像平移
平移操作可以将图像中的每个点沿着某个方向移动一定的距离。
img = cv2.imread('../images/car.png')
(h,w) = img.shape[:2]
#定义平移水平和垂直移动的距离
ty,tx = 0,100
#创建一个平移矩阵
t_img = np.float32([[1,0,tx],[0,1,ty]])
w_img = cv2.warpAffine(img,t_img,(w,h))
cv2.imshow('w_img',w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
需要的参数为:
h,w : 图像的像素,宽和高
ty , tx:为需要平移的距离
t_img: 为一个平移矩阵 ,t_img = np.float32([[1,0,tx],[0,1,ty]])
img: 需要处理的图像
然后将参数放入cv2.warpAffine(img,t_img,(w,h)),用新图像w_img接收
3.图像缩放
缩放操作可以改变图像的大小
img = cv2.imread('../images/car.png')
#定义缩放的参数,参数大于1的时候是放大,小于1时是缩小
w1 = 0.5
h1 = 0.5
(h,w) = img.shape[:2]
print(h,w)
m = np.float32([[w1,0,0],[0,h1,0]])
t_img = cv2.warpAffine(img,m,(int(w*w1),int(h*h1)))#上面的缩放因子是float类型,全部转成int类型做运算。
需要的参数:
w1 = 0.5
h1 = 0.5
定义两个缩放因子
(h,w):图像的像素,获得像素然后与缩放因子做运算。
m:m = np.float32([[w1,0,0],[0,h1,0]]),这个公式解释如下图。
4.图像剪切
img = cv2.imread('../images/car5.png')
(h,w) = img.shape[:2]
#定义图像剪切的参数
sx = 0.2
sy = 0.5
#定义矩形
m = np.float32([[1,sx,0],[sy,1,0]])
#图像剪切
i_img = cv2.warpAffine(img,m,(w,h))
cv2.imshow('i_img',i_img)
最后把定义的参数放入cv2.warpAffine函数内进行仿射变换。
图像色彩空间转换
OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。
它可以方便我们对图像进行处理,并提高图像处理的效果和节省计算资源。
函数为:
cv2.cvtColor(src, code)
-
src
:输入图像,可以是一个NumPy数组或者一个OpenCV的Mat对象。 -
code
:指定转换的类型,可以使用预定义的转换代码,例如cv2.COLOR_BGR2GRAY
表示从BGR到灰度图像的转换。
1.RGB 转 Gray(灰度)
将图像基础格式RGB即彩色图像,转为灰度图像
gay_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
看后面的方法参数能看出来,BGR2GRAY,在BGR和GRAY中间有个2,即是把BGR格式转换呈GRAY格式,其它格式的转换也是同理。
2.RGB 转 HSV
HSV 颜色空间将颜色分解为色调(Hue)、饱和度(Saturation)和亮度(Value)三个分量。
HSV 颜色空间在图像处理和计算机视觉中有多种应用,包括颜色分割、图像增强、颜色校正、图像分析和图像压缩。
由于 HSV 颜色空间将颜色信息与亮度信息分离,因此在处理颜色相关的任务时,HSV 颜色空间通常比 RGB 颜色空间更方便和有效。
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
参数为:cv2.COLOR_BGR2HSV
图像二值化处理
图像二值化处理是将灰度图像转换为二值图像的过程,常用的方法包括全局阈值法、自适应阈值法和 Otsu 方法。二值化处理在图像处理中有很多应用,例如边缘检测、文本识别、目标检测等。通过 OpenCV 提供的函数,可以方便地实现这些二值化方法。
cv2.threshold
是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景。
retval, dst = cv2.threshold(src, thresh, maxval, type)
cv2.threshold
内的参数:
images:用于二值化的图像,图像性质为灰度。
thresh:设置的界定阈值,低于这个数的将被归为0
maxval:设置的最大阈值,通常为255.若超过界定阈值的将被赋为255.
dype:为阈值控制类型
阈值解释:阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。
下面是常用的几个阈值控制方法:
阈值类型,常用的有:
-
cv2.THRESH_BINARY
: 超过阈值的像素设为最大值,其余设为0。 -
cv2.THRESH_BINARY_INV
: 超过阈值的像素设为0,其余设为最大值。 -
cv2.THRESH_TRUNC
: 超过阈值的像素设为阈值,其余不变。 -
cv2.THRESH_TOZERO
: 超过阈值的像素不变,其余设为0。 -
cv2.THRESH_TOZERO_INV
: 超过阈值的像素设为0,其余不变。
图像掩膜
它通常用于创建掩模,以便从图像中提取特定颜色的区域。
掩膜是一个二值图像,其中白色区域(通常为 255)表示感兴趣的区域,黑色区域(通常为 0)表示不感兴趣的区域。
cv2.inRange(src, lowerb, upperb)
参数:
-
src: 输入的图像,可以是彩色图像或灰度图像。
-
lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。
-
upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。
返回值
-
返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域
图像检测轮廓
cv2.findContours
函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。
contours, hierarchy = cv2.findContours(image, mode, method)
参数:
-
image: 输入的二值图像。通常在调用该函数之前需要将图像转换为灰度图像并进行二值化处理(如使用
cv2.threshold
或cv2.Canny
)。 -
mode
: 轮廓检索模式:
-
cv2.RETR_EXTERNAL
: 只检索外部轮廓。 -
cv2.RETR_LIST
: 检索所有轮廓,并将其放入列表中。 -
cv2.RETR_TREE
: 检索所有轮廓,并建立层级关系。
-
-
method
: 轮廓逼近方法:
-
cv2.CHAIN_APPROX_SIMPLE
: 压缩轮廓,仅保留端点。 -
cv2.CHAIN_APPROX_NONE
: 保留所有轮廓点。
-
返回值
-
contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。
-
hierarchy: 轮廓的层级信息,包含轮廓之间的关系。
cv2.boundingRect 函数介绍
cv2.boundingRect
是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。最小外接矩形是一个完全包围轮廓的矩形,其边与图像的坐标轴平行。