一.边缘填充
一般来图片操作之后会有空区域,就是对空出来的区域进行了像素值的填充,(0,0,0)也就是黑色像素值的填充。
1 2 3 4 5 6 7 8 9 10 11 12
| import cv2 as cv img = cv.imread('../images/lena.png')
M = cv.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),45,0.5) f = cv.warpAffine(img,M,(img.shape[1],img.shape[0])) cv.imshow('img',img) cv.imshow('f',f) cv.waitKey() cv.destroyAllWindows()
|
结果:

1.1 边界复制
cv.BORDER_REPLICATE
其是warpAffine函数中borderMode参数其一,且边缘填充时必须声明borderMode参数。

就是将缩放后图像的边缘元素复制给离它最近的空区域。
1 2 3 4 5 6 7 8 9 10 11
| import cv2 as cv img = cv.imread('../images/lena.png')
M = cv.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),45,0.5) f = cv.warpAffine(img,M,(img.shape[1],img.shape[0]),borderMode=cv.BORDER_REPLICATE) cv.imshow('img',img) cv.imshow('f',f) cv.waitKey() cv.destroyAllWindows()
|
结果:

1.2 边界反射
cv.BORDER_REFLECT
根据原图的边缘进行反射。

就是取镜像翻转,对角的地方就按点翻转,其他地方按边。
1 2 3 4 5 6 7 8 9 10 11
| import cv2 as cv img = cv.imread('../images/lena.png')
M = cv.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),45,0.5) f = cv.warpAffine(img,M,(img.shape[1],img.shape[0]),borderMode=cv.BORDER_REFLECT) cv.imshow('img',img) cv.imshow('f',f) cv.waitKey() cv.destroyAllWindows()
|
结果:

1.3 边界反射101
cv.BORDER_REFLECT_101
与边界反射不同的是,不再反射边缘的像素点:

1.4 边界常数
cv.BORDER_CONSTANT
指定常数值borderValue = (x,y,z)是多少,默认的填充常数值为0。

1 2 3 4 5 6 7 8 9 10 11
| import cv2 as cv img = cv.imread('../images/lena.png')
M = cv.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),45,0.5) f = cv.warpAffine(img,M,(img.shape[1],img.shape[0]),borderMode=cv.BORDER_CONSTANT,borderValue=(0,0,255)) cv.imshow('img',img) cv.imshow('f',f) cv.waitKey() cv.destroyAllWindows()
|
结果:

1.5 边界包裹
cv.BORDER_WRAP
就是把图像一对一复制平移

1 2 3 4 5 6 7 8 9 10 11
| import cv2 as cv img = cv.imread('../images/lena.png')
M = cv.getRotationMatrix2D((img.shape[1]/2,img.shape[0]/2),45,0.5) f = cv.warpAffine(img,M,(img.shape[1],img.shape[0]),borderMode=cv.BORDER_WRAP) cv.imshow('img',img) cv.imshow('f',f) cv.waitKey() cv.destroyAllWindows()
|
结果:

二.图像矫正(透视变换)
其原理是透视变换,有点像仿射变换,公式不太一样,它已经不是一个线性变换。通俗的讲,透视变换的作用其实就是改变一下图像里的目标物体的被观察的视角。

可以看到,这是一个3*3的矩阵了,因为是将3维图像转为2维。
2.1 透视变换矩阵
M=getPerspectiveTransform(src,dst)
那么怎么获取这8个坐标呢?介绍一个简单的方法,打开电脑中的画图软件:

如图,把鼠标移到区域边缘上的四个点上就可以得到 w,h 的值。新坐标一般用原图边缘的坐标,直接可以用shape[0]和shape[1]来获取 h,w,然后根据坐标系推算就有了。
2.2 透视变换函数
cv2.warpPerspective(src, M, dsize, flags, borderMode)
`
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import cv2 as cv import numpy as np img = cv.imread('../images/3.png') print(img.shape)
pts1 = np.float32([[182,113], [500,151],[133,264],[490,308]]) pts2 = np.float32([[0,0], [img.shape[1],0],[0, img.shape[0]],[img.shape[1], img.shape[0]]])
cv.line(img, pts1[0].astype(np.int64), pts1[1].astype(np.int64), (0, 255, 0), 2) cv.line(img, pts1[1].astype(np.int64), pts1[3].astype(np.int64), (0, 255, 0), 2) cv.line(img, pts1[2].astype(np.int64), pts1[3].astype(np.int64), (0, 255, 0), 2) cv.line(img, pts1[2].astype(np.int64), pts1[0].astype(np.int64), (0, 255, 0), 2)
M = cv.getPerspectiveTransform(pts1, pts2)
ts_img = cv.warpPerspective(img, M, (img.shape[1], img.shape[0])) cv.imshow('img', img) cv.imshow('ts_img', ts_img) cv.waitKey(0) cv.destroyAllWindows()
|
结果:

三.图像色彩空间转换
OpenCV中,图像色彩空间转换是一个非常基础且重要的操作,就是将图像从一种颜色表示形式转换为另一种表示形式的过程。常见的颜色空间包括 RGB、HSV、YUV 等。
3.1 RGB颜色空间
RGB颜色空间可以产生大约1600万种颜色,几乎包括了世界上的所有颜色,也就是说可以使用RGB颜色空间来生成任意一种颜色。
3.2 颜色加法
使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2
。
OpenCV的加法是饱和操作
(单纯数值相加,最大255),而Numpy添加如果其中两值的和大于255则要进行的是模运算
,如果值比较小依然会做普通加法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import cv2 as cv import numpy as np pig = cv.imread('../images/pig.png') cao = cv.imread('../images/cao.png')
pig_cao_add = cv.add(pig, cao)
pig_cao_np = pig + cao cv.imshow('pig_cao_add', pig_cao_add) cv.imshow('pig_cao_np', pig_cao_np) cv.waitKey(0) cv.destroyAllWindows()
|
结果:


3.3 颜色加权加法
cv2.addWeighted(src1,alpha,src2,deta,gamma)
alpha、beta:两张图象权重。
gamma:亮度调整值。
> 0
,图像会变亮
< 0
,图像会变暗。
0
,则没有额外的亮度调整。
1 2 3 4 5 6 7 8 9 10
| import cv2 as cv import numpy as np pig = cv.imread('../images/pig.png') cao = cv.imread('../images/cao.png') su = cv.addWeighted(pig, 0.7, cao, 0.3, 0) cv.imshow('su',su) cv.waitKey() cv.destroyAllWindows()
|
结果:
