图像的算术运算
图像的加法运算
ew_img = cv2.add(new_cat, dog)
使用加法应该注意两张图片的尺寸大小必须相同,可以先用shape函数查看两张图片的大小然后再选择较小的那张的尺寸对较大的那张进行调整(new_cat = cv2.resize(cat, (dog.shape[:-1][::-1])))
图像的减法运算
new_img = cv2.subtract(new_cat, dog) 注意事项同上加法
图像的融合
cv2.addWeighted(src1, alpha, src2, beta, gamma)
图片的融合操作相当于对图片进行线性运算 w1* x1 + w2 * x2 + b. 其中alpha是第一个权重参数, beta是第二个权重参数, gamma是偏差.
OpenCV的位运算
非操作
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)
图像的基本变换
图像的放大与缩小
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
interpolation: 插值算法, 主要有以下几种:
- INTER_NEAREST, 邻近插值, 速度快, 效果差.
- INTER_LINEAR, 双线性插值, 使用原图中的4个点进行插值. 默认.
- INTER_CUBIC, 三次插值, 原图中的16个点.
- INTER_AREA, 区域插值, 效果最好, 计算时间最长.
图像的翻转
cv2.flip(src, flipCode)
- flipCode =0 表示上下翻转
- flipCode >0 表示左右翻转
- flipCode <0 上下 + 左右
- 图像的旋转
cv2.rotate(img, rotateCode)
- ROTATE_90_CLOCKWISE 90度顺时针
- ROTATE_180 180度
- ROTATE_90_COUNTERCLOCKWISE 90度逆时针
仿射变换之图像平移
warpAffine(src, M, dsize, flags, mode, value)
- M:变换矩阵
- dsize: 输出图片大小
- flag: 与resize中的插值算法一致
- mode: 边界外推法标志
- value: 填充边界值
仿射变换之获取变换矩阵
getRotationMatrix2D(center, angle, scale)
- center 中心点 , 以图片的哪个点作为旋转时的中心点.
- angle 角度: 旋转的角度, 按照逆时针旋转.
- scale 缩放比例: 想把图片进行什么样的缩放.
getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.
- src原目标的三个点
- dst对应变换后的三个点
透视变换
warpPerspective(img, M, dsize,…)
对于透视变换来说, M是一个3 * 3 的矩阵.
getPerspectiveTransform(src, dst) 获取透视变换的变换矩阵, 需要4个点, 即图片的4个角.
滤波器
平均滤波
filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
- ddepth是卷积之后图片的位深, 即卷积之后图片的数据类型, 一般设为-1, 表示和原图类型一致.
- kernel是卷积核大小, 用元组或者ndarray表示, 要求数据类型必须是float型.
- anchor 锚点, 即卷积核的中心点, 是可选参数, 默认是(-1,-1)
- delta 可选参数, 表示卷积之后额外加的一个值, 相当于线性方程中的偏差, 默认是0.
- borderType 边界类型.一般不设.
方盒滤波与均值滤波
boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) 方盒滤波.
-
normalize = True时, a = 1 / (W * H) 滤波器的宽高
-
normalize = False是. a = 1
-
一般情况我们都使用normalize = True的情况. 这时 方盒滤波 等价于 均值滤波
-
blur(src, ksize[, dst[, anchor[, borderType]]]) 均值滤波.
高斯滤波
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
- kernel 高斯核的大小.
- sigmaX, X轴的标准差
- sigmaY, Y轴的标准差, 默认为0, 这时sigmaY = sigmaX
- 如果没有指定sigma值, 会分别从ksize的宽度和高度中计算sigma.
中值滤波
cv2.medianBlur(img, 5) # 当有很多小点时可以使用
双边滤波
bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
- sigmaColor是计算像素信息使用的sigma
- sigmaSpace是计算空间信息使用的sigma
算子
索贝尔(sobel)算子
dx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
dy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
计算x,y两个方向的
沙尔(Scharr)算子
Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
Sobel算子的ksize设为-1就是Scharr算子.
拉普拉斯算子
Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) 对噪音敏感, 一般需要先进行去噪再调用拉普拉斯
边缘检测Canny
Canny(img, minVal, maxVal, …)