- 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
- 💟 作 者:锡兰_CC ❣️
- 📝 专 栏:【OpenCV • c++】计算机视觉
- 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪
文章目录
- 前言
- 图像坐标映射
- 代码演示
前言
图像的几何变换是指在不改变图像像素值的前提下对图像像素进行空间几何变换,常见的几何变换有距离变换、坐标映射、平移、镜像、旋转、缩放、仿射交换等等。图像的几何变换是图像处理和分析的基础,应用广泛。
图像坐标映射
图像的坐标映射是通过与目标图像之间建立一种映射关系,这种映射关系一般有两种,第一种是计算原图像任意像素在映射后图像的坐标位置,第二种是计算变换后图像任意像素反映射在原图像的坐标位置。由于正映射,由原图像映射到目标图像称为正映射,相反地,由目标图像通过映射关系得到原图像称为反映射。由于正映射常常会映射不完全以及出现映射重复现象,一般在图像处理的过程中采取反映射的方式来保证输出目标图像的每个像素都可以通过映射关系在源图像中找到唯一的对应像素。
OpenCV 中提供重映射相关操作,重映射是指把一个图像中一个位置的像素通过映射关系转换到另一图像的指定位置。
代码演示
Void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode = BORDER_CONSTANT, const Scalar&borderValue = Scalar())
其中,第一个参数src
表示输入图像,第二个参数dst
表示输出图像,第三个函数map1
表示(x,y)点的坐标或者 x 的坐标,第四个参数interpolation
表示 y 的坐标,如果第三个参数为(x,y),则可选择不用,第五个参数interpolation
表示插值方法,第六个参数borderMode
表示边界插值类型,第七个参数borderValue
表示插值数据。
#include<opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
int main() {
cv::Mat srcImage = cv::imread("C://Users//86173//Desktop//cc.png");
if (!srcImage.data)
return -1;
//输出矩阵定义
cv::Mat resultImage(srcImage.size(), srcImage.type());
//x与y方向矩阵
cv::Mat xMapImage(srcImage.size(), CV_32FC1);
cv::Mat yMapImage(srcImage.size(), CV_32FC1);
//取图像的宽高
int rows = srcImage.rows;
int cols = srcImage.cols;
//图像遍历
for (int j = 0; j < rows; j++)
{
for (int i = 0; i < cols; i++)
{
//x与y均翻转
xMapImage.at<float>(j, i) = cols - i - 1;
yMapImage.at<float>(j, i) = rows - j - 1;
}
}
//重映射操作
remap(srcImage, resultImage, xMapImage, yMapImage, CV_INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
//输出结果
cv::imshow("srcImage", srcImage);
cv::imshow("resultImage", resultImage);
cv::waitKey(0);
return 0;
}
其他:
更多专栏订阅推荐:
- 👍 【开卷数据结构】
- 💛 【备战蓝桥,冲击省一】
- 💕 从零开始的 c++ 之旅
- 💖 【OpenCV • c++】计算机视觉