目录
预备知识
滤波、核和卷积
滤波器指的是一种由一幅图像 I(x,y)根据像素点x,y附近的区域计算得到一幅新图像 I'(x,y)的算法。其中,模板规定了滤波器的形状以及这个区域内像素的值的组成规律,也称“滤波器”或“核”。在下面的介绍中多采用的是线性核,即 I'(x,y)的像素的值由 I(x,y)及其周围的像素的值的加权相加得来的。可由以下方程表示:
(A)5×5盒状核 | (B)规范化的5×5盒状核 | (C)3×3的Sobel核 | (D)5×5规范化高斯核 |
注:“锚点”均用粗体表示
边界外推和边界处理
自定义边框
在处理图像时,只要告诉调用的函数添加虚拟像素的规则,库函数就会自动创建虚拟像素。cv::copyMakeBorder()就是一个为图像创建边框的函数。
cv::copyMakeBorder(InputArray src, InputArray dst, int top, int bottom, int left, int right, int borderType, const cv::Scalar& value=cv::Scalar())
作用:通过指定两幅图像,同时指明填充方法,该函数就会将第一幅图填补后的结果保存在第二幅图像中。其中,src是原图像,dst是填充后的图像,top、bottom、left、right分别是四个方向上的尺寸,borderType是像素填充的方式,value是常量填充时的值。
取值 | 效果 |
---|---|
cv::BORDER_CONSTANT | 为每个边框像素赋予一个相同的值。 |
cv::BORDER_WRAP | 类似于平铺扩充 |
cv::BORDER_REPLICATE | 复制边缘的像素扩充 |
cv::BORDER_REFLECT | 通过镜像复制扩充 |
cv::BORDER_REFLECT_101 | 通过镜像复制扩充,边界像素除外 |
cv::BORDER_DEFAULT | cv::BORDER_REFLECT_101 |
自定义外推
int cv::borderInterpolate(int p, int len, int borderType)
作用:计算一个维度上的外推,p为原图上一个坐标,len是p指维度上的大小,borderType是边界类型。
例子:混合的边界条件下计算一个特定像素的值,在一维中使用BORDER_REFLECT_101,在二维中使用BORDER_WRAP:
float val = img.at<float>(
cv::borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),
cv::borderInterpolate(-5, img.cols, cv::BORDER_WRAP)
)
阈值化操作
阈值化操作的原理是对于数组中每个值,根据其高于或低于某个阈值做出相对应的处理,OpenCV中提供了实现这种功能的方法cv::threshold()。
double cv::threshold(InputArray src, cv::OutputArray dst, double thresh, double maxValue, int thresholdType)
阈值类型 | 操作 |
---|---|
cv::THRESH_BINARY | |
cv::THRESH_BINARY_INV | |
cv::THRESH_TRUNC | |
cv::THRESH_TOZERO | |
cv::THRESH_TOZERO_INV |
