1. 说明
borderInterpolate 用于在应用滤波器或进行图像变换时,计算外插像素的源位置;它根据指定的边界模式(如复制、反射或环绕),返回相应的"供体(donor)"像素坐标(即参考像素)。该函数将处于图像范围之外的坐标(p)映射回有效的图像范围内(即 0 到 len-1 之间)。
2. 例子
本示例演示了如何手动查找图像边界之外的"虚"坐标处的像素值。
// 创建一个 5x1 单通道矩阵: [10, 20, 30, 40, 50]
cv::Mat row = (cv::Mat_<uchar>(1, 5) << 10, 20, 30, 40, 50);
int len = row.cols;
// 我们希望访问 index -2 的位置(越界)
int p = -2;
// 1. BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
// index-2 将映射到第一个元素(index 0)。
int idxReplicate = cv::borderInterpolate(p, len, cv::BORDER_REPLICATE);
// 2. BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
// index - 2 将沿边缘反射(映射至index 1)。
int idxReflect = cv::borderInterpolate(p, len, cv::BORDER_REFLECT);
// 3. BORDER_WRAP: cdefgh|abcdefgh|abcdefg
// index -2 环绕至末尾(对应于index 3)。
int idxWrap = cv::borderInterpolate(p, len, cv::BORDER_WRAP);
std::cout << "Original row: [10, 20, 30, 40, 50]" << std::endl;
std::cout << "Index " << p << " with BORDER_REPLICATE maps to source index: " << idxReplicate << " (Value: " << (int)row.at<uchar>(0, idxReplicate) << ")" << std::endl;
std::cout << "Index " << p << " with BORDER_REFLECT maps to source index: " << idxReflect << " (Value: " << (int)row.at<uchar>(0, idxReflect) << ")" << std::endl;
std::cout << "Index " << p << " with BORDER_WRAP maps to source index: " << idxWrap << " (Value: " << (int)row.at<uchar>(0, idxWrap) << ")" << std::endl;
运行结果:
