在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。
图像翻转:
cv2.flip
是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。
语法:
cv2.flip(src, flipCode[, dst]) -> dst
参数:
-
src:输入图像,可以是任意类型和深度的多通道图像。
-
flipCode
:指定翻转类型的整数标志:
-
0
:沿 X 轴翻转(垂直翻转) -
1
:沿 Y 轴翻转(水平翻转) -
-1
:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)
-
-
dst:可选参数,输出图像。如果未提供,输出图像将与输入图像具有相同的尺寸和类型。
import cv2
# 加载图像
image = cv2.imread("save_image/car.png")
# 翻转: -1:水平和垂直 1:水平翻转,0 垂直翻转
img = cv2.flip(image, -1)
# 显示原始图像和翻转后的图像
cv2.imshow('img', img)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
图像仿射变换:
仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。
仿射变换函数:
cv2.warpAffine(src, M, dsize, dst) →
参数:
-
src: 输入图像。
-
M: 2x3 的变换矩阵,类型为
np.float32
。 -
dsize: 输出图像的尺寸,形式为
(width, height)
。 -
dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。
图像旋转:
旋转操作可以将图像绕着某个点旋转一定的角度
语法:
cv2.getRotationMatrix2D(center, angle, scale) -> M
参数:
-
center:旋转中心点的坐标,格式为
(x, y)
。 -
angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。
-
scale:缩放比例。如果设置为 1,则不进行缩放。
返回值
-
M:2x3 的旋转矩阵。
import cv2
# 加载图像
image = cv2.imread("images/car.png")
# 获取图像的尺寸
(h, w) = image.shape[:2]
# 设置旋转中心和旋转角度
center = (w // 2, h // 2)
# 计算旋转矩阵
# 旋转角度(可修改)
angle = 40
# 缩放比例 1.0 表示不缩放
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 进行旋转
rotated_image = cv2.warpAffine(image, M, (w, h))
cv2.imshow('Rotated Image', rotated_image)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
图像平移:
平移操作可以将图像中的每个点沿着某个方向移动一定的距离
import cv2
import numpy as np
# 读取图像
img = cv2.imread("images/car5.png")
#获取图片像素
(h, w) = img.shape[:2]
# 定义平移矩阵
#tx 图片x轴移动200,ty是图片y轴移动50px
tx, ty = 200, 50
#获取平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 应用平移变换
translated = cv2.warpAffine(img, M, (w, h))
# 显示结果
cv2.imshow('Translated Image', translated)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像缩放:
缩放操作可以改变图像的大小
import cv2
import numpy as np
# 读取图像
img = cv2.imread("images/car5.png")
h, w, channels = img.shape
# 定义缩放因子
sx, sy = 1.5, 1.5
M = np.float32([[sx, 0, 0], [0, sy, 0]])
# 应用缩放变换
scaled = cv2.warpAffine(img, M, (int(w * sx), int(h* sy)))
# 显示结果
cv2.imshow('Scaled Image', scaled)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像剪切:
剪切操作可以改变图像的形状,使其在某个方向上倾斜
import cv2
import numpy as np
# 读取图像
img = cv2.imread("images/car5.png")
rows, cols, _ = img.shape
# 定义剪切因子
shx, shy = 0.2, 0.2
M = np.float32([[1, shx, 0], [shy, 1, 0]])
# 应用剪切变换
sheared = cv2.warpAffine(img, M, (cols, rows))
# 显示结果
cv2.imshow('Sheared Image', sheared)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像色彩空间转换:
OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。
色彩空间转换有几个重要的作用:
-
方便图像处理:在不同的颜色空间中,对应的通道代表了不同的属性,例如在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于不同的处理需求,选择不同的颜色空间进行处理可以更加方便。
-
提高图像处理效果:在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪点。
-
节省计算资源:在某些情况下,使用特定的颜色空间可以帮助我们节省计算资源。例如,在RGB空间中,每个像素需要3个通道来表示,而在灰度空间中,每个像素只需要一个通道就可以表示。因此,如果我们只需要处理亮度信息而不需要颜色信息时,将图像转换为灰度空间可以节省计算资源。
语法:
cv2.cvtColor(src, code)
参数:
-
src
:输入图像,可以是一个NumPy数组或者一个OpenCV的Mat对象。 -
code
:指定转换的类型,可以使用预定义的转换代码,例如cv2.COLOR_BGR2GRAY
表示从BGR到灰度图像的转换。
RGB转Gray(灰度):
RGB 转 Gray(灰度),将彩色图像转换为灰度图像,可以减少数据量并简化算法。
image = cv2.imread("../images/car.png")
# 将图像从BGR到灰度图像的转换
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 显示原始图像和转换后的灰度图像
cv2.imshow('old Image', image)
cv2.imshow('new Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
RGB转HSV:
RGB 转 HSV,HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。
import cv2
#在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。
# 例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
#转换后的图像
cv2.imshow('new Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像二值化处理:
语法:
retval, dst = cv2.threshold(src, thresh, maxval, type)
参数:
-
src: 输入的灰度图像。
-
thresh: 阈值,决定分割的界限。
-
maxval: 当像素值超过阈值时,赋予的最大值(通常为255)。
-
type
: 阈值类型,常用的有:
-
cv2.THRESH_BINARY
: 超过阈值的像素设为最大值,其余设为0。 -
cv2.THRESH_BINARY_INV
: 超过阈值的像素设为0,其余设为最大值。 -
cv2.THRESH_TRUNC
: 超过阈值的像素设为阈值,其余不变。 -
cv2.THRESH_TOZERO
: 超过阈值的像素不变,其余设为0。 -
cv2.THRESH_TOZERO_INV
: 超过阈值的像素设为0,其余不变。
-
返回值
-
retval: 实际使用的阈值(可能与输入值不同)。
-
dst: 输出的二值图像。
import cv2
# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用阈值
thresh_value = 127
retval, binary_image = cv2.threshold(image, thresh_value, 255, cv2.THRESH_BINARY)
# 显示结果
cv2.imshow('原图', image)
cv2.imshow('二值图像', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像掩模:
它通常用于创建掩模,以便从图像中提取特定颜色的区域。
语法:
cv2.inRange(src, lowerb, upperb)
参数:
-
src: 输入的图像,可以是彩色图像或灰度图像。
-
lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。
-
upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。
返回值
-
返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域
import cv2
import numpy as np
# 读取图像
image = cv2.imread("images/car.png")
# 将图像从 BGR 转换到 HSV 颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义颜色范围,(蓝色区域)
lower = np.array([100, 100, 100])
upper = np.array([140, 255, 255])
# 使用 inRange 函数创建掩模
mask = cv2.inRange(hsv_image, lower, upper)
cv2.imshow('01', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像检测轮廓:
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: 轮廓的层级信息,包含轮廓之间的关系。
import cv2
# 读取图像并转换为灰度图像
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化处理
retval, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 把灰度图像转换彩色图像
output_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2BGR)
# 绘制轮廓
cv2.drawContours(output_image, contours, -1, (0, 255, 0), 2)
# 显示结果
cv2.imshow('Contours', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()