OpenCV图像预处理1

ops/2024/11/2 19:30:19/

目录

图像翻转

图像仿射变换

仿射变换函数

图像旋转

图像平移

图像缩放

图像倾斜

图像色彩空间转换

RGB 转 Gray

RGB 转 HSV

图像二值化处理

图像掩模

图像位与操作

图像检测轮廓

绘制轮廓


图像翻转

cv2.flip(src, flipCode[, dst]) -> dst

用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。

参数:

  • src:输入图像,可以是任意类型和深度的多通道图像。

  • flipCode

    :指定翻转类型的整数标志:

    • 0:沿 X 轴翻转(垂直翻转)

    • 1:沿 Y 轴翻转(水平翻转)

    • -1:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)

  • dst:可选参数,输出图像。如果未提供,输出图像将与输入图像具有相同的尺寸和类型。

img = cv2.imread('pic/test.jpg')
flip_img = cv2.flip(img, flipCode=0)
cv2.imshow('flip_img ', flip_img)cv2.waitKey(0)
cv2.destroyAllWindows()img = cv2.imread('pic/test.jpg')
flip_img = cv2.flip(img, flipCode=1)
cv2.imshow('flip_img ', flip_img)cv2.waitKey(0)
cv2.destroyAllWindows()img = cv2.imread('pic/test.jpg')
flip_img = cv2.flip(img, flipCode=-1)
cv2.imshow('flip_img ', flip_img)cv2.waitKey(0)
cv2.destroyAllWindows()

图像仿射变换

仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。

仿射变换函数

cv2.warpAffine(src, M, dsize, dst)

 参数:

  • src: 输入图像。

  • M: 2x3 的变换矩阵,类型为 np.float32

  • dsize: 输出图像的尺寸,形式为 (width, height)

  • dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。

图像旋转

旋转操作可以将图像绕着某个点旋转一定的角度

获取旋转矩阵

旋转矩阵是一个 2x3 的矩阵,可以用来将图像围绕指定的中心点旋转指定的角度,并且可以选择是否进行缩放。

cv2.getRotationMatrix2D(center, angle, scale) -> M

参数:

  • center:旋转中心点的坐标,格式为 (x, y)

  • angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。

  • scale:缩放比例。如果设置为 1,则不进行缩放。

返回值

  • M:2x3 的旋转矩阵。

img = cv2.imread('pic/test.jpg')# 获取图像尺寸
(h, w) = img.shape[:2]
# 设置旋转中心
center = (h // 2, w // 2)
# 旋转角度
angle = 45
# 缩放比例
scale = 2M = cv2.getRotationMatrix2D(center, angle, scale)
rotate_img = cv2.warpAffine(img, M, (w, h))cv2.imshow('Rotate_img', rotate_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像平移

平移操作可以将图像中的每个点沿着某个方向移动一定的距离

img = cv2.imread('pic/test.jpg')
# 获取图片像素
(h, w) = img.shape[:2]
# 定义平移矩阵:tx 图片x轴移动200,ty是图片y轴移动50px
tx, ty = 200, 50
# 获取平移矩阵
M = np.float32([[1, 0, tx], [0, 1, ty]])
# 应用平移变换
move_img = cv2.warpAffine(img, M, (w, h))cv2.imshow('move_img', move_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像缩放

缩放操作可以改变图像的大小

img = cv2.imread('pic/test.jpg')
h, w, channels = img.shape# 缩放因子
sx, sy = 0.5, 0.8M = np.float32([[sx, 0, 0], [0, sy, 0]])
# 应用缩放变换
scaled_img = cv2.warpAffine(img, M, (int(w * sx), int(h * sy)))cv2.imshow('scaled_img', scaled_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像倾斜

改变图像的形状,使其在某个方向上倾斜

img = cv2.imread('pic/car5.png')
h, w, _ = img.shape# 定义倾斜因子
shx, shy = -0.2, -0.2M = np.float32([[1, shx, 0], [shy, 1, 0]])incline_img = cv2.warpAffine(img, M, (w, h))
print(incline_img.shape)cv2.imshow('scaled_img', incline_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像色彩空间转换

OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。

色彩空间转换的重要作用:

(1)方便图像处理:在不同的颜色空间中,对应的通道代表了不同的属性,例如在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于不同的处理需求,选择不同的颜色空间进行处理可以更加方便。

(2)提高图像处理效果:在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪点。

(3)节省计算资源:在某些情况下,使用特定的颜色空间可以帮助我们节省计算资源。例如,在RGB空间中,每个像素需要3个通道来表示,而在灰度空间中,每个像素只需要一个通道就可以表示。因此,如果我们只需要处理亮度信息而不需要颜色信息时,将图像转换为灰度空间可以节省计算资源。

cv2.cvtColor()是OpenCV中的一个函数,用于图像颜色空间的转换。它可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图像的转换,或者从BGR到HSV的转换等。

cv2.cvtColor(src, code)

RGB 转 Gray

RGB 转 Gray(灰度),将彩色图像转换为灰度图像,可以减少数据量并简化算法。

img = cv2.imread('pic/test.jpg')
gray_img= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_img', gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

RGB 转 HSV

HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。

img = cv2.imread('pic/test.jpg')
hsv_img= cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('gray_img', hsv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像二值化处理

cv2.threshold 是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。

功能:将灰度图像转换为二值图像,根据指定的阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。

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: 输出的二值图像。

# 读取图像并转换为灰度图
img = cv2.imread('pic/test.jpg',cv2.IMREAD_GRAYSCALE)
# 阈值
thresh = 127
maxval = 255ret_val, ret_img = cv2.threshold(img, thresh, maxval,cv2.THRESH_BINARY)cv2.imshow('ret_img', ret_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像掩模

它通常用于创建掩模,以便从图像中提取特定颜色的区域。用于锁定检测目标的位置。

cv2.inRange(src, lowerb, upperb)

参数:

  • src: 输入的图像,可以是彩色图像或灰度图像。

  • lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。

  • upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。

返回值:

  • 返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域

img = cv2.imread('pic/car3.png')
# 将图像从BGR转换为HSV颜色空间
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义颜色范围
# 提取颜色的最小值
lower = np.array([100, 100, 100])
# 提取颜色的最大值
upper = np.array([124, 255, 255])
# 创建掩模
range_img = cv2.inRange(hsv_img, lower, upper)cv2.imshow('range_img', range_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像位与操作

 cv2.bitwise_and() 是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。这个函数在图像处理中的应用非常广泛,尤其是在掩膜和图像分割等任务中。

dst = cv2.bitwise_and(src1, src2, mask=None)

参数:

  • src1: 第一个输入图像。

  • src2: 第二个输入图像。两幅图像应具有相同的尺寸和类型。

  • mask: 可选参数,用于指定一个掩膜。如果提供,只有在掩膜的相应位置为非零时,才会计算输出。

返回值

  • 返回按位与操作后的图像(dst)。

import cv2
import numpy as np# 读取图像
image = cv2.imread("pic/car1.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)
#位与操作
image = cv2.bitwise_and(image,image,mask=mask)
cv2.imshow('01', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像检测轮廓

cv2.findContours 函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。

contours, hierarchy = cv2.findContours(image, mode, method)

参数:

  • image: 输入的二值图像。通常在调用该函数之前需要将图像转换为灰度图像并进行二值化处理(如使用 cv2.thresholdcv2.Canny)。

  • mode(轮廓检索模式):

    • cv2.RETR_EXTERNAL: 只检索外部轮廓。

    • cv2.RETR_LIST: 检索所有轮廓,并将其放入列表中。

    • 检索所有轮廓,并建立层级关系。

  • method(轮廓逼近方法):

    • cv2.CHAIN_APPROX_SIMPLE: 压缩轮廓,仅保留端点。

    • cv2.CHAIN_APPROX_NONE: 保留所有轮廓点。

返回值

  • contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。

  • hierarchy: 轮廓的层级信息,包含轮廓之间的关系。

img = cv2.imread('pic/car3.png')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret_val, binary_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, h = cv2.findContours(binary_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# output_img = cv2.cvtColor(binary_img, cv2.COLOR_GRAY2BGR)
#
# cv2.drawContours(img, contours, -1, (0, 255, 0),2)# 在每个轮廓上绘制最小外界矩阵
for con in contours:# 获取绘制轮廓的边界框x,y,w,h = cv2.boundingRect(con)cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('output_img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制轮廓

(1)cv2.boundingRect()

cv2.boundingRect()是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。最小外接矩形是一个完全包围轮廓的矩形,其边与图像的坐标轴平行。

(2)cv2.retangle()

根据cv2.findContours()的返回值,绘制矩形。


http://www.ppmy.cn/ops/130501.html

相关文章

PySpark 本地开发环境搭建与实践

目录 一、PySpark 本地开发环境搭建 (一)Windows 本地 JDK 和 Hadoop 的安装 (二)Windows 安装 Anaconda (三)Anaconda 中安装 PySpark (四)Pycharm 中创建工程 二、编写代码 …

交易所开发:开启数字金融新时代

当今数字化高速发展的时代,交易所作为金融市场的核心枢纽,发挥着至关重要的作用。而随着区块链技术的兴起,数字货币交易所的开发更是为金融领域带来了全新的变革与机遇。 一、数字货币交易所的重要性 数字货币交易所是连接数字货币世界与传统…

微服务基础-Ribbon

客户端负载均衡器 1.1 Ribbon介绍: 1.2 Ribbon--默认负载均衡策略: @loadBalanced就是调用loadBalance服务:获取注册过的服务列表:

GPT-Sovits-1-数据处理

1.1 切割音频 将音频切割为多个10s内的片段 1.2 降噪 这一步用的是modelscope的pipeline 如果要去除背景音,可以用傅立叶转为为频谱,去除低频部分后再转回来 1.3 提取音频特征 这里用到了 funasr 库 这一步目的是输出音频样本的《文本标签文件》&am…

SQL-lab靶场less1-4

说明:部分内容来源于网络,如有侵权联系删除 前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错: 这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除&#xf…

Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的发展,循环神经网络(RNN)及其变种如门控循环…

人工智能基础 opencv

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它提供了丰富的图像处理和计算机视觉算法,广泛应用于各种领域,如图像处理、视频分析、对象检测、人脸识别、机器学习等。 环境安装&#xf…

Rust精简核心笔记:第二波,语法精髓部分解锁

前面介绍了Rust精简比较第一波 Rust精简核心笔记:第一波,深入浅出语法精华-CSDN博客 把第二波整理如下,通过三波会把全部Rust核心、实用、最简练的语法整理出来,最高效掌握Rust。 Rust精简笔记(二) Rust核心笔记第二波总结整理&am…