目录
cv2.hconcat/cv2.vconcat (4.5.3.56)
泊松融合 cv2.seamlessClone (4.5.1.48)
基础变换
cv2.resize
resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
图像缩放。
- src: 输入原图
- dsize: 目标缩放尺寸 (w, h)
- dst: 目标输出图
- interpolation: 插值方式
cv2.flip (4.5.3.56)
flip(src, flipCode, dst=None) -> dst
翻转图像(水平/垂直/both)。不同flipCode作用:
- >0 ,水平翻转(围绕y轴左右翻转)
- =0 ,垂直翻转(围绕x轴上下翻转)
- <0 ,水平+垂直均翻转
cv2.hconcat/cv2.vconcat (4.5.3.56)
图像拼接:
hconcat(src, dst=None): 水平方向上拼接
vconcat(src, dst=None): 竖直方向上拼接
cv2.transpose (4.5.3.56)
cv2.transpose(src, dst=None) -> dst
行列转置。
cv2.copyMakeBorder (4.5.3.56)
copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None) -> dst
对图像上下左右进行填充。
不同borderType作用:
- 0=cv2.BORDER_CONSTANT,常值填充
- 1=BORDER_REPLICATE
- 2=cv2.BORDER_REFLECT
- 3=cv2.BORDER_WRAP
- 4=cv2.BORDER_REFLECT101=BORDER_DEFAULT=BORDER_REFLECT_101
- 5=cv2.BORDER_TRANSPARENT
- 16=cv2.BORDER_ISOLATED
dst = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=(0, 0, 0))
仿射变换
cv2.getRotationMatrix2D
getRotationMatrix2D(center, angle, scale) -> retval(返回仿射变换矩阵M)
center:旋转中心
angle:旋转角度,角度在旋转图像中有用,角度为正==x轴顺时针旋转,角度为负==x轴逆时针旋转(图不转、人头转),图像整体则是反方向转
scale:
结合cv2.warpAffine
图像融合
泊松融合 cv2.seamlessClone (4.5.1.48)
seamlessClone(src, dst, mask, p, flags[, blend]) -> blend
无缝泊松融合,以缺陷copy-paste为例,
- src: 原图(包含缺陷)
- dst: 目标图
- mask: 原图中缺陷的mask
- p: 目标图中mask粘贴位置的中心点坐标
- flags: 克隆算法;
- 1=NORMAL_CLONE
- 2=MIXED_CLONE=2
- 3=MONOCHROME_TRANSFER
上述3种克隆算法都会改变原图mask的缺陷,甚至如果目标图全黑,原图缺陷根本克隆不了,而我测试的时候可以用flags=0得到比较正常克隆效果!(还是得实践,最好要自己写一个maskClone方法)
形态学(cv2.morphologyEx)
结构元素(类似卷积核)
先要了解结构元素(kernel)—— cv2.getStructuringElement:
该函数用于创建一个形态学的结构元素(kernel),用于形态学操作,比如腐蚀、膨胀、开运算、闭运算等。该函数有两个参数,分别是 kernel 的形状和大小。
该函数支持三种 kernel 形状:矩形、椭圆和十字形。矩形结构元素是最常用的,它的形状类似于矩形或正方形。椭圆形结构元素用于对图像的轮廓进行边缘保留滤波,比如形态学梯度、拉普拉斯算子等。十字形结构元素常用于一些特定的场景,比如只对图像的水平或垂直方向进行操作。
除了选择 kernel 形状,还需要指定 kernel 的大小,它通常是奇数,比如 3×3、5×5、7×7 等,表示 kernel 的维度或者说半径。具体大小的选择取决于图像的特征以及所需的操作。
>>> cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
array([[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1]], dtype=uint8)
>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
array([[0, 0, 0, 1, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 1, 0, 0, 0]], dtype=uint8)
>>> cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
array([[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0]], dtype=uint8)
腐蚀(Erosion)/cv2.erode
该方法可以将对象的边缘向内部收缩,并且可以消除较小的斑点和暂时性的物体。例如,可以用于消除二进制图像中的白噪声。 cv2.erode 是OpenCV的形态学函数之一,可以将图像中的白色部分(前景)缩小或削弱,并扩大或加强黑色部分(背景)的区域。其原理是使用一个结构元素/kernel,在图像上滑动并对每个像素进行操作。具体来说,对于 kernel 中的每一个元素,将其与图像上对应位置的像素进行“与”操作(也称作min),结果作为输出图像该位置的像素值。这相当于在图像上找到 kernel 匹配的区域中的最小值(注意不一定都是0,最小值可能大于0,所以一般用01二值化mask才不会出错),并将其赋给输出图像相应位置的像素。这样就可以将前景(即亮部分)缩小或去除,同时扩大或加强背景(即暗部分)。需要注意的是, cv2.erode 函数的具体效果还受到所使用的结构元素的形状、大小以及迭代次数等参数的影响。
可以自定义不同shape的结构元素:
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
膨胀(Dilation)/cv2.dilate
该方法可以将对象的边缘向外部扩张,而不影响对象的整体形状。例如,可以用于扩张二进制图像中的白色区域。 cv2.dilate 与 cv2.erode 正好相反,取kernel内的max值,可以将前景(即亮部分)扩大,同时减小或去除背景(即暗部分)。
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25))
dilation = cv2.dilate(img, kernel, iterations = 1)
Tips:腐蚀和膨胀都是针对白色区域(亮部分)而言的。
开运算(Opening):先腐蚀、后膨胀
该方法可以消除较小的斑点和暂时性的物体,同时保留对象的整体形状。例如,可以用于去除二进制图像中的白色斑点。
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
闭运算(Closing):先膨胀、后腐蚀
该方法可以填充较小的空洞,同时保留对象的整体形状。例如,可以用于填充二进制图像中的黑洞。
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
形态学梯度(Morphological Gradient)
该方法可以计算对象的边缘,通过膨胀和腐蚀操作之间的差异来实现。例如,可以用于提取图像中的边缘。
kernel = np.ones((5, 5), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)