目录
add opencv使用add来执行图像的加法运算
图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的.就是图像数据相应像素的相加。
- # 加法, 加法的效果是加起来如果超过255, 统一变成255
- new_img = cv2.add(new_cat, dog)
subtract
opencv使用subtract来执行图像的减法运算, 图像对应位置的元素相减, 如果减完小于0, 统一变成0.就是图像数据相应像素的相减。
- # 减法
- new_img = cv2.subtract(new_cat, dog)
同样的还有乘法, 除法运算. cv2.mutiply, cv2.divide, 原理是类似的.
cv2.addWeighted(src1, alpha, src2, beta, gamma)
图片的融合操作相当于对图片进行线性运算 w1* x1 + w2 * x2 + b. 其中alpha是第一个权重参数, beta是第二个权重参数, gamma是偏差.伽马调整
- # 相当于res = new_cat * 0.4 + dog * 0.6 + 0
- res = cv2.addWeighted(new_cat, 0.4, dog, 0.6, 0)
bitwise_not(img) 非操作的效果就相当于是用 255 - img
cat_not = cv2.bitwise_not(cat)
bitwise_and(img1, img2) 与运算, 图片对应位置元素进行与操作. 表现出来的效果就是黑和黑与还是黑, 白和白与还是白.
cat_and_dog = cv2.bitwise_and(new_cat, dog)
bitwise_or 或运算 对应元素做或运算
bitwise_xor 异或运算 对应元素做异或运算
- #new_img = cv2.bitwise_or(img, img2)
- new_img = cv2.bitwise_xor(img, img2)
resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
src: 要缩放的图片
dsize: 缩放之后的图片大小, 元组和列表表示均可.
dst: 可选参数, 缩放之后的输出图片
fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比.
interpolation: 插值算法, 主要有以下几种:
INTER_NEAREST, 邻近插值, 速度快, 效果差.
INTER_LINEAR, 双线性插值, 使用原图中的4个点进行插值. 默认.
INTER_CUBIC, 三次插值, 原图中的16个点.
INTER_AREA, 区域插值, 效果最好, 计算时间最长.
示例代码:
- # x,y放大一倍
- new_dog = cv2.resize(dog,dsize=(800, 800), interpolation=cv2.INTER_NEAREST)
flip(src, flipCode)
flipCode =0 表示上下翻转
flipCode >0 表示左右翻转
flipCode <0 上下 + 左右
示例代码:
new_dog = cv2.flip(dog, flipCode=-1)
rotate(img, rotateCode)
ROTATE_90_CLOCKWISE 90度顺时针
ROTATE_180 180度
ROTATE_90_COUNTERCLOCKWISE 90度逆时针
示例代码:
new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)
变换是图像旋转, 缩放, 平移的总称.具体的做法是通过一个矩阵和和原图片坐标进行计算, 得到新的坐标, 完成变换. 所以关键就是这个矩阵.
warpAffine(src, M, dsize, flags, mode, value)
M:变换矩阵 M是偏移矩阵[1 0 tx,0 1 ty, 0 0 1] 移动后坐标是(x+tx y+ty)
dsize: 输出图片大小
flag: 与resize中的插值算法一致
mode: 边界外推法标志
value: 填充边界值
示例代码:
- h, w, ch = dog.shape
- # M是偏移矩阵[1 0 tx,0 1 ty, 0 0 1] 移动后坐标是(x+tx y+ty)
- M = np.float32([[1, 0, 100], [0, 1, 0]])
- # 注意opencv中是先宽度, 再高度
- new = cv2.warpAffine(dog, M, (w, h))
仿射变换的难点就是计算变换矩阵, OpenCV提供了计算变换矩阵的API
getRotationMatrix2D(center, angle, scale)
center 中心点 , 以图片的哪个点作为旋转时的中心点.
angle 角度: 旋转的角度, 按照逆时针旋转.
scale 缩放比例: 想把图片进行什么样的缩放.
示例代码:
- h, w, ch = dog.shape
- # M = np.float32([[1, 0, 100], [0, 1, 0]])
-
- # 注意旋转的角度为逆时针.
- # M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
- # 以图像中心点旋转
- M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
- # 注意opencv中是先宽度, 再高度
- new = cv2.warpAffine(dog, M, (w, h))
getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.
src原目标的三个点
dst对应变换后的三个点
- # 一般是横向和纵向的点, 所以一定会有2个点横坐标相同, 2个点纵坐标相同
- src = np.float32([[200, 100], [300, 100], [200, 300]])
- dst = np.float32([[100, 150], [360, 200], [280, 120]])
- M = cv2.getAffineTransform(src, dst)
- # 注意opencv中是先宽度, 再高度
- new = cv2.warpAffine(dog, M, (w, h))
warpPerspective(img, M, dsize,....)
对于透视变换来说, M是一个3 * 3 的矩阵.
getPerspectiveTransform(src, dst) 获取透视变换的变换矩阵, 需要4个点, 即图片的4个角.
- src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])
- dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
- M = cv2.getPerspectiveTransform(src, dst)
-
- new = cv2.warpPerspective(img, M, (2300, 3000))