OpenCV图像预处理1

目录

图像翻转

图像仿射变换

仿射变换函数

图像旋转

图像平移

图像缩放

图像倾斜

图像色彩空间转换

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.mzph.cn/bicheng/58949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融量化交易模型的探索与发展

在当代金融市场中,量化交易模型的应用不断提升,逐渐成为大数据与人工智能等前沿技术的集大成者。量化交易借助数学模型和算法分析市场信息,自动执行交易决策,具备精确、效率高等特点,且能够在复杂多变的市场中有效应对…

求逻辑地址的页号和物理地址

逻辑地址空间按字编址 -->逻辑地址长度为:log2(逻辑地址空间) 页的大小 --> 页内偏移量占log(页的大小) 逻辑页号页内偏移量逻辑地址长度 因此假如一个逻辑地址空间为64kb,页的大小为1kb,逻辑地址为17CAH,求逻辑地址页号…

ETLCloud怎么样?深度解析其在数据管理中的表现

在BI或数据大屏等数据分析工具中,经常需要从多个业务系统中提取原始数据,然后对数据进行清洗、处理,以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用,从高质量的实现企业数据的价值变现。 然而,在…

Windows SEH异常处理讨论

Windows C程序异常的类型 在Windows C异常的场景中,我们需要理解以下两种类型的异常: C语言抛出的异常。 这是利用C throw抛出的exception,利用C try-catch即可捕获。即便是来自于另一个DLL的C exception,仍然能利用C try-catch…

Windows 基础(一):深入理解Windows,掌握命令行与Shell

内容预览 ≧∀≦ゞ Windows 基础(一)声明导语一、Windows 和 Linux 的区别二、Windows 的ShellShell 和 终端 的区别1. 命令提示符(CMD)2. Windows PowerShell3. Windows Terminal4. Windows Subsystem for Linux (WSL) 三、Windo…

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据查询(超详细)

目录 一、单表查询 1. 简单的数据查询 (1)选择表中若干列 (2)选择表中若干行(元祖) 2. 聚合函数与分组查询 聚集函数 GROUP BY分组查询 二、联接查询 1、连接概述 2. 内联接(INNER JO…

unity后端kbengine用DOTween让 移动同步丝滑

unity在网络同步kbengine框架,同步移动时, 看自己很丝滑,但看他人是在跳越移动,一闪一闪,像掉帧, 看什么插值,高频同步,都不实用 用DOTween的 transform.DOMove(目标位置, 时间); //顺滑移动动画 这段代码不是放在Avatar.cs,放在AvatarView.cs里 if (Avatar.isPlayer() false…

【Effective C++】阅读笔记3

1. 成员变量声明为Private 建议将成员变量声明为Private,然后再public中提供调用该数据的接口 设置成Private的原因分析 类内成员变量被声明为Private,那么就可以外部代码直接访问或者修改内部数据通过公共接口获取内部数据,这样可以减少对外…

CSS3新增背景属性(四)

CSS3新增背景属性 1 background-origin 设置背景图原点起始位置: padding-box:默认值从padding区域开始显示背景图像;border-box:从border区域开始显示背景图像;content-box:从content区域开始显示背景图像…

C语言中的main函数:命令行参数的工作原理

在C语言中,main函数是程序的入口点。它不仅可以接受返回值,还能处理命令行参数,允许用户在运行程序时传递数据。命令行参数是用户在启动程序时通过命令行界面提供的输入。C语言允许通过main函数的参数来访问这些输入。   int main(int argc…

我在命令行下学日语

同一个动作重复 300 遍,肌肉就会有记忆,重复 600 遍,脊柱就会有记忆,学完五十音图不熟练,经常遗忘或者要好几秒才想得起来一个怎么办?没关系,我做了个命令行下的小游戏 KanaQuiz 来帮助你记忆&a…

c++:vector

一、vector是什么? 1.1 vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是…

一键切换暗黑模式,这些代码片段你不可错过

文章目录 前言正文1.多主题切换2.使用 SASS 实现轻松深色模式3.动画切换浅色与深色模式4.纯 CSS 主题切换5.GitHub 风格的深色模式切换6.持久深色模式7.基本 Vue 响应式切换8.创意灯泡切换 总结 前言 如今,许多网站设计师都会为用户提供浅色和深色模式的选择。这不…

理解为什么要有C++设计模式

什么时设计模式? 每一个模式描述了一个在我们周围不断重复的问题以及该问题的解决方案的核心,这样,就能一次有一次地使用该方案,而不必做重复劳动。 如何解决复杂性? 分解:人们面对复杂性有一个常见的做法…

HJ33 整数与IP地址间的转换

HJ33 整数与IP地址间的转换 整数与IP地址间的转换 描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数。 举例:一个ip地址为10.0.3.193 每段数字 …

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年,求伯君用128万行代码编写出了WPS1.0,宣告了中国自主办公时代的开启。 那时候,雷军还在武汉大学深造,他早就把求伯君当成了自己的榜样,这一来二去的,雷军和WPS之间也就结下了不解之缘…

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前,可以回顾…

sklearn 实现随机森林分类器 - python 实现

python sklearn 实现随机森林分类器 from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 加载数据集 irisload_iris() x,yiris.data,iris.target print("x y shape:",x.shape,y.shape) # 创建并训练模型 model Random…

Altium Designer使用技巧(二)

一、创建类 1、按DC键,打开对象类。 2、右键添加一个类。命名为PWR。 3、将所有的电源类,全部添加到新创建的类中,从非成员类中点选到成员类中。 4、右下角点panes ,点PCB。 5、然后在左边单击PWR,点连接,可显示或…

<十六>Ceph mon 运维

Ceph 集群有故障了,你执行的第一个运维命令是什么? 我猜测是ceph -s 。无论执行的第一个命令是什么,都肯定是先检查Mon。 在开始之前我们有必要介绍下Paxos协议,毕竟Mon就是靠它来实现数据唯一性。 一: Paxos 协议 1…