cv2函数原型-图像变换(缩放/翻转/拼接/旋转/融合/滤波_形态学)

目录

基础变换

cv2.resize

cv2.flip (4.5.3.56)

cv2.hconcat/cv2.vconcat (4.5.3.56)

cv2.transpose (4.5.3.56)

cv2.copyMakeBorder (4.5.3.56)

仿射变换

cv2.getRotationMatrix2D

图像融合

泊松融合 cv2.seamlessClone (4.5.1.48)

形态学

cv2.morphologyEx

腐蚀(Erosion)/cv2.erode

膨胀(Dilation)/cv2.dilate

开运算(Opening):先腐蚀、后膨胀

闭运算(Closing):先膨胀、后腐蚀

形态学梯度(Morphological Gradient)


基础变换

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)

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值