OpenCV图像重映射,我们学习了如何读取和修改图像的像素值,本文来看看如何通过移动像素修改图像的外观。这个过程不会修改像素值,而是把每个像素的位置重新映射到新的位置。这可用来创建图像特效,或者修正因镜片等原因导致的图像扭曲。
如何实现
要使用OpenCV的remap函数,首先需要定义在重映射处理中使用的映射参数,然后把映射参数应用到输入图像。很明显,定义映射参数的方式将决定产生的效果。这里定义一个转换函数,在图像上创建波浪形效果:
// 重映射图像,创建波浪形效果
void wave(const cv::Mat &image, cv::Mat &result) {
// 映射参数
cv::Mat srcX(image.rows, image.cols, CV_32F);
cv::Mat srcY(image.rows, image.cols, CV_32F);
// 创建映射参数
for (int i=0; i<image.rows; i++) {
for (int j=0; j<image.cols; j++) {
// (i, j)像素的新位置
srcX.at<float>(i, j)= j; // 保持在同一列
// 原来在第i行的像素,现在根据一个正弦曲线移动
srcY.at<float>(i, j)= i+5*sin(j/10.0);
}
}
// 应用映射参数
cv::remap(image, // 源图像
result, // 目标图像
srcX, // x映射
srcY, // y映射
cv::INTER_LINEAR); // 填补方法
}
得到的结果如下所示
酷客网相关文章:
评论前必须登录!
注册