文章目录
- 一、图像预处理
-
- [4 边缘填充](#4 边缘填充)
-
- [4.1 边界复制(BORDER_REPLICATE)](#4.1 边界复制(BORDER_REPLICATE))
- [4.2 边界反射(BORDER_REFLECT)](#4.2 边界反射(BORDER_REFLECT))
- [4.3 边界反射101(BORDER_REFLECT_101)](#4.3 边界反射101(BORDER_REFLECT_101))
- [4.4 边界常数(BORDER_CONSTANT)](#4.4 边界常数(BORDER_CONSTANT))
- [4.5 边界包裹(BORDER_WRAP)](#4.5 边界包裹(BORDER_WRAP))
- 4.6案例
- [5 图像矫正(透视变换)](#5 图像矫正(透视变换))
- [6 图像色彩空间转换](#6 图像色彩空间转换)
-
- [6.1 颜色加法](#6.1 颜色加法)
- [6.2 颜色加权加法](#6.2 颜色加权加法)
- [6.2 颜色加权加法](#6.2 颜色加权加法)
一、图像预处理
4 边缘填充
填充边缘?我们以下图为例。
黑色区域就是需要填充的部分。
4.1 边界复制(BORDER_REPLICATE)
边界复制会将边界处的像素值进行复制,然后作为边界填充的像素值,如下图所示,可以看到四周的像素值都一样。
- 添加属性 :
borderMode=cv.BORDER_REPLICATE
python
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,
borderMode=cv.BORDER_REPLICATE)
4.2 边界反射(BORDER_REFLECT)
如下图所示,会根据原图的边缘进行反射。
- 添加属性 :
borderMode=cv.BORDER_REFLECT)
python
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT)
4.3 边界反射101(BORDER_REFLECT_101)
与边界反射不同的是,不再反射边缘的像素点,如下图所示。
- 添加属性 :borderMode=cv.BORDER_REFLECT_101
python
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT_101)
4.4 边界常数(BORDER_CONSTANT)
当选择边界常数时,还要指定常数值是多少,默认的填充常数值为0,如下图所示。
- 添加属性 :
- borderMode=cv.BORDER_CONSTANT
- borderValue=(0,0,255) 填充的常数值
python
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,
borderValue=(0,0,255))
4.5 边界包裹(BORDER_WRAP)
无限平移补充。
- 添加属性 :borderMode=cv.BORDER_WRAP
python
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)
4.6案例
python
import cv2 as cv
import numpy as np
# 读取图片
cat = cv.imread("./images/face.png")
h, w = cat.shape[:2]
center = (w // 2, h // 2)# 旋转中心
angle = 45# 旋转角度
M = cv.getRotationMatrix2D(center, angle, 0.5)
# 临近值插值
cat2 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REPLICATE)
# 边界反射/边界为轴,进行翻转插值
cat3 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REFLECT)
# 边界反射101/与上面原理一样,只是边界的一排不反射
cat4 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REFLECT_101)
# 边界常数---要填写填充值
cat5 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_CONSTANT, borderValue=(255, 0, 0))
# 边界包裹
cat6 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_WRAP)
cv.imshow("01",cat2)
cv.imshow("02",cat3)
cv.imshow("03", cat4)
cv.imshow("04", cat5)
cv.imshow("05", cat6)
cv.waitKey(0)
cv.destroyAllWindows()
- 结果图
5 图像矫正(透视变换)
图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。
前面的仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移过程。因此,一个平行四边形经过仿射变换后还是一个平行四边形。
这里的透视变换是把一个三维图像中的某个区域映射成二维图片,并且是矩形呈现。
与仿射变换一样,透视变换也有自己的透视变换矩阵:
X Y Z \] = \[ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 \] ∗ \[ x y 1 \] \\begin{array}{l l l}{{\\left\[\\begin{array}{c}{{X}}\\\\{{Y}}\\\\{Z} \\end{array}\\right\]=\\left\[\\begin{array}{c c c}{{a_{11}}}\&{{a_{12}}}\&{{a_{13}}}\\\\ {{a_{21}}}\&{{a_{22}}}\&{{a_{23}}}\\\\ {{a_{31}}}\&{{a_{32}}}\&{{a_{33}}}\\end{array}\\right\]\*\\left\[\\begin{array}{c}{{x}}\\\\{{y}}\\\\{{1}}\\end{array}\\right\]}}\\end{array} XYZ = a11a21a31a12a22a32a13a23a33 ∗ xy1 * 矩阵生成方式: * **M=getPerspectiveTransform(np1, np2)** * np1:数据类型为float32的二维矩阵,存放**透视区域**的四个点坐标 * np2:数据类型为float32的二维矩阵,存放**原图**的四个点坐标 该函数会返回一个透视变换矩阵,得到透视变化矩阵之后,使用warpPerspective()函数即可进行透视变化计算,并得到新的图像。该函 数需要提供如下参数: * ```python cv2.warpPerspective(src, M, dsize, flags, borderMode) ``` src:输入图像。 M:透视变换矩阵。这个矩阵可以通过getPerspectiveTransform函数计算得到。 dsize:输出图像的大小。它可以是一个Size对象,也可以是一个二元组。 flags:插值方法的标记。 borderMode:边界填充的模式。 * 示例: ```py import cv2 as cv import numpy as np img = cv.imread("./images/3.png") h, w = img.shape[:2] # 透视变换 # 待取区域的4个坐标 zs, ys, zx, yx = (182, 133), (500, 171), (133, 264), (490, 308) pts1 = np.float32([zs, ys, zx, yx]) # 原图4个点 (0,0) (w,0) (0,h) (w,h) pts2 = np.float32([[0, 0], [w, 0], [0, h], [w, h]]) # 获取透视矩阵 M = cv.getPerspectiveTransform(pts1, pts2) # 计算出新图片(透视处理后的图片) dst = cv.warpPerspective(img, M, (w, h), flags=cv.INTER_LINEAR, borderMode=cv.BORDER_CONSTANT) cv.imshow("dst", dst) cv.waitKey(0) cv.destroyAllWindows() ``` ### 6 图像色彩空间转换 OpenCV中,图像色彩空间转换是一个非常基础且重要的操作,就是将图像从一种颜色表示形式转换为另一种表示形式的过程。通过将图像从一个色彩空间转换到另一个色彩空间,可以更好地进行特定类型的图像处理和分析任务。常见的颜色空间包括RGB、HSV、YUV等。 * 色彩空间转换的作用 * **提高图像处理效果** * **节省计算资源** #### 6.1 颜色加法 将两个图片的每个像素点进行相加。 * 方法1:OpenCV的cv.add()函数 * 饱和操作,例如:10+250 = 255 * 方法2:numpy的+运算 * 取模操作,例如:10+250 = 256 % 260 = 4 #### 6.2 颜色加权加法 ```python img = cv2.addWeighted(src1,alpha,src2,deta,gamma) ``` * `src1`、`src2`:输入图像。 * `alpha`、`beta`:两张图象权重,累加=1 * `gamma`:亮度调整值。 * `gamma > 0`,图像会变亮。 * `gamma < 0`,图像会变暗。 * 取模操作,例如:10+250 = 256 % 260 = 4 #### 6.2 颜色加权加法 ```python img = cv2.addWeighted(src1,alpha,src2,deta,gamma) ``` * `src1`、`src2`:输入图像。 * `alpha`、`beta`:两张图象权重,累加=1 * `gamma`:亮度调整值。 * `gamma > 0`,图像会变亮。 * `gamma < 0`,图像会变暗。 * `gamma = 0`,则没有额外的亮度调整。