资讯专栏INFORMATION COLUMN

3.opencv——图像变换1(色彩空间变换,几何变换)

番茄西红柿 / 3078人阅读

摘要:色彩空间中图像的每个像素用一个三元组表示三元组中的个值依次表示红色绿色和蓝色依次对应和通道。默认采用色彩空间它按和通道顺序表示图像。读取图像显示图像转换色彩空间为显示图像几何变换缩放的函数用于缩放图像其基本格式如下。

色彩空间变换

/qquad 色彩空间也称颜色模型、颜色空间、色彩模型等,它是图像在计算机内部的一种存储方式。常见的色彩空间包括 RGB、GRAY、XYZ、YCrCb、HSV 等。色彩空间在物体追踪、特征检测等(简单来说就是识别一个东西)扮演着很重要的角色。毕竟每个物体都有特定的颜色和特征,我们可以应用其物体与环境颜色上的差异,从图像中提取特定范围的颜色并加上一些逻辑性的判断,获取待检测物体的位置。每种色彩空间都有其擅长的问题解决领域,所以在解决具体色彩问题时往往需要进行色彩空间类型转换。
OpenCV 的 cv2.cvtColor()函数用于转换色彩空间类型,其基本格式如下。

dst = cv2.cvtcolor(src,code[,dstcn]])

其参数说明如下:

参数说明
dst表示转换后的图像
src表示转换前的原图像
code表示色彩空间类型转换码
dstCn表示目标图像的通道数

常见的色彩空间类型转换码如下:

参数说明
cv2.COLOR_BGR2RGB将BGR 色彩空间转换为 RGB 色彩空间
cv2.COLOR_BGR2GRAY将 BGR 色彩空间转换为 GRAY 色彩空间
cv2.COLOR_BGR2HSV将 BGR 色彩空间转换为 HSV 色彩空间
cv2.COLOR_BGR2YCrCb将 BGR 色彩空间转换为 YCrCb 色彩空间
cv2.COLOR_RGB2BGR将 RGB 色彩空间转换为 BGR 色彩空间
cv2.COLOR_RGB2GRAY将 RGB 色彩空间转换为 GRAY 色彩空间
c2.COLOR_RGB2YCrCb将 RGB 色彩空间转换为 YCrCb 色彩空间
cv2.COLOR_RGB2HSV将RGB 色彩空间转换为 HSV 色彩空间

RGB色彩空间

/qquad RGB 色彩空间使用R(Red,红)、G(Green,绿)和B(Blue,蓝)3种基本颜色表示图像像素。RGB 色彩空间中,图像的每个像素用一个三元组表示,三元组中的3个值依次表示红色、绿色和蓝色,依次对应 R、G和B通道。OpenCV默认采用 BGR 色彩空间,它按 B、G和R通道顺序表示图像。
在cv2.cvtColor()函数中使用cv2.COLOR_BGR2RGB转换码可将图像从BGR色彩空间转换RGB色彩空间。

import cv2img = cv2.imread('bee.jpg')  	             # 读取图像cv2.imshow('bee', img)  	                 # 显示图像img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换色彩空间为RGBcv2.imshow('RGB', img2)  	                 # 显示图像cv2.waitKey(0)

GRAY色彩空间

/qquad GRAY 色彩空间通常指 8 位灰度图像,其颜色取值范围为[0,255],共 256个灰度级。从 RGB 色彩空间转换为 GRAY 色彩空间的计算公式如下。
G r a y = 0.299 R + 0.587 G + 0.114 B Gray =0.299R+0.587G+0.114B Gray=0.299R+0.587G+0.114B
其中,R、G和 B为 RGB 色彩空间中 R、G 和 B 通道的图像。在 cv2.cvtColor()函数中使用 cv2.COLOR_BGR2GRAY 转换码可将图像从BGR 色彩空间转换为 GRAY 色彩空间。

import cv2img = cv2.imread('bee.jpg')  	               # 读取图像cv2.imshow('bee', img)  	                   # 显示图像img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 转换色彩空间为GRAYcv2.imshow('GRAY', img2)  	                   # 显示图像cv2.waitKey(0)

YCrCb色彩空间

/qquad YCrCb 色彩空间用亮度 Y、红色 Cr 和蓝色 Cb 表示图像。从 RGB 色彩空间转换为 YCrCb 色彩空间的计算公式如下。
Y = 0.299 R + 0.587 G + 0.114 B C r = 0.713 ( R − Y ) + d e l t a C b = 0.564 ( B − Y ) + d e l t a Y=0.299R+ 0.587G+ 0.114B// Cr= 0.713(R- Y)+ delta// Cb= 0.564(B- Y)+ delta// Y=0.299R+0.587G+0.114BCr=0.713(RY)+deltaCb=0.564(BY)+delta
其中
d e l t a = { 128 8 位 图 像 32767 16 位 图 像 0.5 单 精 度 图 像 delta= /begin{cases} 128 & 8位图像// 32767 & 16位图像 // 0.5 & 单精度图像 // /end{cases} delta=128327670.5816
在cv2.cvtColor()函数中使用 cv2.COLOR_BGR2YCrCb 转换码可将图像从 BGR 色彩空间转换为 YCrCb 色彩空间。

import cv2img = cv2.imread('bee.jpg')  	               # 读取图像cv2.imshow('bee', img)  	                   # 显示图像img2 = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)  # 转换色彩空间为YCrCbcv2.imshow('YCrCb', img2)  	                   # 显示图像cv2.waitKey(0)

HSV色彩空间

/qquad HSV 色彩空间使用色调(Hue,也称色相)、饱和度(Saturation)和亮度(Value)表示图像。
色调 H表示颜色,用角度表示,取值范围为[0°,360°],从红色开始按逆时针方向计算。例如,红色为 0°、黄色为 60°、绿色为 120°、青色为 180°、蓝色为 240°、紫色为 300°等。饱和度 S 表示颜色接近光谱色的程度,或者表示光谱色中混入白光的比例。光谱色中白光的比例越低,饱和度越高,颜色越深、艳。光谱色中白光比例为 0 时,饱和度达到最高。饱和度的取值范围为[0,1]。亮度V表示颜色明亮的程度,是人眼可感受到的明暗程度,其取值范围为[0,1]。
从 RGB 色彩空间转换为 HSV 色彩空间的计算公式如下:
V = m a x ( R , G , B ) V = max(R,G,B) V=max(R,G,B)
S = { V − m i n ( R , G , B ) V V ≠ 0 0 V = 0 S= /begin{cases} /frac{V-min(R,G,B)}{V} & V/neq0// 0 & V=0 // /end{cases} S={VVmin(R,G,B)0V=0V=0
H = { 60 − ( G − B ) V − m i n ( R , G , B ) V = R 120 + 60 − ( B − R ) V − m i n ( R , G , B ) V = G 240 + 60 − ( R − G ) V − m i n ( R , G , B ) V = B H= /begin{cases} /frac{60-(G-B)}{V-min(R,G,B)} & V=R// 120+/frac{60-(B-R)}{V-min(R,G,B)} & V=G // 240+/frac{60-(R-G)}{V-min(R,G,B)} & V=B // /end{cases} H=Vmin(R,G,B)60(GB)120+Vmin(R,G,B)60(BR)240+Vmin(R,G,B)60(RG)V=RV=GV=B
计算结果中如果H<0,则令H= H+360.
在cv2.cvtColor()函数中使用 cv2.COLOR_BGR2HSV转换码可将图像从 BGR 色彩空间转换为 HSV 色彩空间。

import cv2img = cv2.imread('bee.jpg')  	             # 读取图像cv2.imshow('BGR', img)  	                 # 显示图像img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 转换色彩空间为HSVcv2.imshow('HSV', img2)  	                 # 显示图像cv2.waitKey(0)

几何变换

缩放

OpenCV的cv2.resize()函数用于缩放图像,其基本格式如下。

dst=cv2.resize(src,dsize[,dst[,fx[,fy[,interpolation]]]])

其参数说明如下:

参数说明
dst表示转换后的图像
src表示用于缩放的原图像
dsize表示转换后的图像大小
fx表示水平方向的缩放比例
fy表示垂直方向的缩放比例
interpolation表示插值方式。在转换过程中,可能存在一些不能通过转换算法确定值的像素,插值方式决定了如何获得这些像素的值。可用的插值方式如下表
参数说明
cv2.INTER_NEAREST最近邻插值
cv2.INTER_LINEAR双线性插值,默认方式
cv2.INTER_CUBIC3 次样条插值
cv2.INTER_AREA区域插值
cv2.INTER_LANCZOS4Lanczos 插值
cv2.INTER_LINEAR_EXACT位精确双线性插值
cv2.INTER_MAX插值编码掩码
cv2.WARP_FILL_OUTLIERS标志,填充目标图像中的所有像素
cv2.WARP_INVERSE_MAP标志,逆变换

cv2.resize()函数在转换图像时,目标图像的类型和大小与转换之前 dst表示的图像无关。目标图像的类型与 src 表示的原图像一致,其大小可通过参数dsize、fx和 fy 来确定。当dsize 参数不为 None时,不管是否设置参数fx和fy,都由dsize 来确定目标图像的大小。dsize是一个二元组,其格式为“(width,height)”,width 表示目标图像的宽度,height表示目标图像的高度。当dsize 参数为 None时,参数fx和fy不能设置为 0。此时,目标图像的宽度为“round(原图像的宽度×fx)”,目标图像的高度为“round(原图像的高度×fy)”。

import cv2img = cv2.imread('bee.jpg')  	                   # 读取图像sc = [1, 0.2, 0.5, 1.5, 2]                         # 设置缩放比例cv2.imshow('showimg', img)  	                   # 显示图像while True:                   	        key = cv2.waitKey()    if 48 <= key <= 52:                            # 按键【0】、【1】、【2】、【3】或【4】        x = y = sc[key-48]                         # 获得缩放比例        img2 = cv2.resize(img, None, fx=x, fy=y)   # 缩放图像        cv2.imshow('showimg', img2)  	           # 显示图像

翻转

OpenCV 的 cv2.flip()函数用于翻转图像,其基本格式如下。

dst=cv2.flip(src,flipCode)

其参数说明如下:

参数说明
dst表示转换后的图像
src表示原图像
fipCode表示翻转类型。flip 为 0 时绕 X轴翻转(垂直翻转),fip 为大于 0 的整数时绕y轴翻转(水平翻转),flip 为小于 0 的整数时同时绕 ×轴和 y轴翻转(水平和垂直翻转)
import cv2img = cv2.imread('bee.jpg')  	  # 读取图像cv2.imshow('showimg', img)  	  # 显示图像while True:                   	        key = cv2.waitKey()    if key == 48:                 # 按【0】键时显示原图         img2 = img    elif key == 49:               # 按【1】键时垂直翻转        img2 = cv2.flip(img, 0)    elif key == 50:               # 按【2】键时水平翻转        img2 = cv2.flip(img, 1)    elif key == 51:               # 按【3】键时水平、垂直翻转        img2 = cv2.flip(img, -1)    cv2.imshow('showimg', img2)

仿射

/qquad 仿射变换包含了平移、旋转、缩放等操作,其主要特点是:原图像中的所有平行线在转换后的图像中仍然平行。OpenCV 的 cv2.warpAfine()函数用于实现图像的仿射变换,其基本格式如下。

dst=cv2.warpAffine(src,M,dsize[,dst[,flags[,bonderMode[, borderValue]]]])

其参数说明如下:

参数说明
dst表示转换后的图像,图像类型和原图像一致,大小由 dsize 决定
src表示原图像
M是一个大小为 2×3的转换矩阵,使用不同的转换矩阵可实现平移、旋转等多种操作
dsize为转换后的图像大小
flags为插值方式,默认值为 cV2.INTER_LINEAR
borderMode为边类型,默认值为 cv2.BORDER_CONSTANT
borderValue为边界值,默认为 0

在 cv2.warpAffine()函数省略可选参数时,图像转换的矩阵运算公式如下:

d s t ( x , y ) = s r c ( M 11 x + M 12 y + M

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121983.html

相关文章

  • 一文详解 OpenGL ES 3.x 渲染管线

    摘要:在一文了解中,我们了解到采用的是可编程渲染管线。新的顶点位置通过在顶点着色器中写入传递到渲染管线的后继阶段继续处理。顶点着色器中可以计算一个点的大小单位为像素,并将其赋值给类型以传递给渲染管线,如果没有明确赋值的话,默认值为。OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成。如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成。而组成圆锥的每一个三角形,其...

    coolpail 评论0 收藏0
  • Python 大白从零开始 OpenCV 学习课-5. 图像几何变换

    摘要:从零开始学习课图像的几何变换本系列面向小白,从零开始实战解说项目实战。仿射变换仿射变换的特点是原始图像中的平行关系和线段长度比例关系保持不变。函数说明函数通过变换矩阵对图像进行仿射变换。 ...

    jay_tian 评论0 收藏0
  • OpenCV-Python计算机视觉函数

    摘要:如果不设置这个,图片只会一瞬间显示,就消失了。括号里面也可以设置显示时长。 目录 1、概述 2、OpenCV基础 读取图片 imread 调整显示窗口大小 resizeWindow 调整图像尺寸大小 resize 色彩空间进行转换 cvtColor 绘制线段 line 绘制矩形框 recta...

    levius 评论0 收藏0
  • 深度学习的局限性

    摘要:简评机器学习深度学习是近年大热的领域,但我们要清楚,深度学习的局限性,即虽然可以使用连续几何变换把映射到,但缺乏推理能力和抽象能力。深度学习的局限性通过简单的策略,我们就能拥有几乎无限的实现应用的可能性。 showImg(https://segmentfault.com/img/bVWUDS?w=800&h=600); 简评:AI、机器学习、深度学习是近年大热的领域,但我们要清楚,深度...

    ormsf 评论0 收藏0
  • 深度学习的局限性

    摘要:简评机器学习深度学习是近年大热的领域,但我们要清楚,深度学习的局限性,即虽然可以使用连续几何变换把映射到,但缺乏推理能力和抽象能力。深度学习的局限性通过简单的策略,我们就能拥有几乎无限的实现应用的可能性。 showImg(https://segmentfault.com/img/bVWUDS?w=800&h=600); 简评:AI、机器学习、深度学习是近年大热的领域,但我们要清楚,深度...

    willin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<