OpenCV 第四章 图像变换
4.1 色彩空间变换
色彩空间也称色彩模型、颜色空间、色彩模型等,它是图像在计算机内部的一种存储方式,常见的色彩空间包括RGB、GRAY、XYZ、YCrCb、HSV。每种色彩空间都有其擅长的问题解决领域,所以在解决具体色彩问题时往往需要进行色彩空间类型转换。
基本格式:
dst=cv2.cvtColor(src,code[,dstCn])
转换后的图像=cv2.cvtColor(原图,色彩空间类型转换码 [,目标图像的通道数 该项可不写])
色彩空间转换代码:
import cv2
img=cv2.imread('E:\pictures\\3.jpg')
cv2.imshow('BGR',img)
img2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow('GRAY',img2)
cv2.waitKey(0)
RGB色彩空间转换
GRAY色彩空间转换
YCrCb色彩空间转换
Y:亮度 Cr:红色 Cb:蓝色
HSV色彩空间转换
H:色调 S:饱和度 V:亮度
4.2 几何变换
几何变换是指对图像执行放大、缩小、旋转等各种操作
缩小
基本格式:
dst=cv2.resize(src,dsize[,dst[,fx[,fy[,interpolation]]]])
dsize表示转换后的图像大小
fx表示水平方向的缩放比例
fy表示垂直方向的缩放比例
注意点:
- 目标图像的类型与原图像一致,大小可以通过参数dsize和fs和fy来确定
- dsize参数不为None时,无视fx和fy,格式为(width,height)
- 当dsize参数为None时,fx和fy不能设置为0
例子:
import cv2
img=cv2.imread('E:\pictures\\3.jpg')
sc=[1,0.2,0.5,1.5,2] //自己设置的缩放比例存入列表中
cv2.imshow('show',img)
while True:
key=cv2.waitKey()
if 48<= key <=52: //ascii,0,1,2,3,4
x=y=sc[key-48] //列表下表取值
img2=cv2.resize(img,None,fx=x,fy=y)
cv2.imshow('show2',img2)
缩小为原图的20%
翻转
flip函数用于翻转图像
dst=cv2.flip(src,flipCode)
flipCode表示翻转类型,为0时绕X轴旋转,大于0时绕y轴旋转,小于0时绕x轴和y轴旋转
import cv2
img=cv2.imread('E:\pictures\\3.jpg')
cv2.imshow('show',img)
while True:
key=cv2.waitKey()
if key==48:
img2=img
elif key==49:
img2=cv2.flip(img,0)
elif key==50:
img2=cv2.flip(img,1)
elif key==51:
img2=cv2.flip(img,-1)
cv2.imshow('flip',img2)
仿射
放射变换包含了平移、旋转、缩放等操作,是一种二维坐标到二维坐标之间的线性变换。
这四小结调用的函数都一样,只是转换矩阵不同
主要特点:原图像中的所有平行线在转换后的图像中仍然平行
OpenCV的cv2.warpAffine()函数用于实现图像的仿射变换,基本格式如下:
dst=cv2.warpAffine(src,M,dsize)
src:原图
M:矩阵
dsize:转换后的图像大小
省略可选参数时,图像转换的矩阵运算公式如下:
dst(x,y)=src(M11X + M12y + M13 , M21x + M22y + M23)
平移
平移是指图像沿水平或者垂直方向移动一定的像素。假设将图像水平移动m个像素,垂直移动n个像素
转换矩阵M如下:
M=| 1 0 m |
| 0 1 n |
import cv2
import numpy as np
img=cv2.imread('E:\pictures\\3.jpg')
cv2.imshow('show',img)
height=img.shape[0]
width=img.shape[1]
dsize=(width,height)
m=np.float32([[1,0,100],[0,1,50]]) //M矩阵
img2=cv2.warpAffine(img,m,dsize) //调用函数
cv2.imshow('show2',img2)
cv2.waitKey(0)
缩放
宽度缩放比例为h,高度缩放比例为v
根据图像转换的矩阵运算公式可以得出执行缩放的转换矩阵M
M=| h 0 0 |
| 0 v 0 |
import cv2
import numpy as np
img=cv2.imread('E:\pictures\\3.jpg')
cv2.imshow('show',img)
height=img.shape[0]
width=img.shape[1]
dsize=(width,height)
m=np.float32([[0.5,0,0],[0,0.5,0]])
img2