北京电商购物网站,佳木斯建设局网站,阿里云市场网站建设,淘宝设计网页多少钱目录
实验原理
示例代码#xff11;
运行结果#xff11;
示例代码#xff12;
运行结果#xff12; 实验原理
OpenCV中#xff0c;图像平移是一种基本的几何变换#xff0c;指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像…目录
实验原理
示例代码
运行结果
示例代码
运行结果 实验原理
OpenCV中图像平移是一种基本的几何变换指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像的大小和形状只是改变了图像的位置。在计算机视觉和图像处理领域平移操作可以用于数据增强、图像对齐等任务。
在OpenCV中可以通过仿射变换Affine Transformation来实现图像的平移。
图像平移的原理图像平移实际上是一种特殊的仿射变换其中不涉及旋转或缩放只是简单地将图像沿水平或垂直方向移动一段固定的距离。 仿射变换的应用仿射变换可以用于多种几何变换
例如
•平移只需要修改矩阵中的tx和ty值即可。
•旋转需要构造一个包含旋转角度的矩阵。
•缩放通过调整矩阵中的a和d值来控制水平和垂直方向的缩放比例。
•倾斜通过调整矩阵中的b和c值来控制剪切shear效果。
要使用OpenCV进行图像平移可以通过以下步骤实现
1.定义平移矩阵 2.应用平移变换
使用 cv::warpAffine 函数可以应用这个变换到图像上。首先需要创建一个与上述形式一致的平移矩阵然后使用该函数完成平移操作。
cv::warpAffine 是 OpenCV 库中用于执行仿射变换的一个函数它可以实现图像的旋转、缩放、剪切以及平移等操作。其函数原型如下
void warpAffine(InputArray src, // 输入图像OutputArray dst, // 输出图像InputArray M, // 2x3 的变换矩阵 仿射变换矩阵Size dsize, // 输出图像的大小int flags INTER_LINEAR, // 插值方法默认为双线性插值int borderMode BORDER_CONSTANT, // 边界模式const Scalar borderValue Scalar() // 边界填充值
);函数参数说明
•src输入图像可以是任何类型的单通道或多通道图像。
•dst输出图像与输入图像具有相同的类型大小由dsize参数指定。
•M仿射变换矩阵通常是一个2x3的浮点矩阵。这个矩阵包含仿射变换所需的六个参数。
•dsize输出图像的大小。可以指定为Size(width, height)形式或者使用 src.size() 保持与源图像相同的大小。
•flags插值方法默认为INTER_LINEAR双线性插值。其他可选的插值方法包括 •INTER_NEAREST最近邻插值。•INTER_LINEAR双线性插值。•INTER_CUBIC三次样条插值。•INTER_LANCZOS4兰茨科斯插值。
•borderMode边界处理模式默认为BORDER_CONSTANT用常数值填充边界。其他可选的边界处理模式包括 •BORDER_CONSTANT用常数值填充边界。•BORDER_REPLICATE边界像素值向外复制。•BORDER_REFLECT边界像素值向内反射。反射边界如12345反射为45454。•BORDER_WRAP边界像素值循环。循环边界如12345循环为34512。•borderValue边界填充值默认为黑色全零向量。只有在borderMode为BORDER_CONSTANT时有效。
总结
图像平移是通过仿射变换来实现的它涉及到将图像中的每一个像素按照一定的方向和距离移动到新的位置。在OpenCV中可以通过构建一个2x3的仿射变换矩阵并使用cv::warpAffine函数来实现图像的平移。通过调整平移参数tx和ty可以控制图像在水平方向和垂直方向的平移量。此外还可以通过指定不同的边界处理方式来处理平移后超出原图像范围的情况。
示例代码
#include pch.h
#include opencv2/opencv.hpp
#include iostreamint main(int argc, char** argv)
{// 加载图像cv::Mat img cv::imread(B3.png);if (img.empty()){std::cout Error: Image not found. std::endl;return -1;}// 定义平移的距离int tx 30; // 沿x轴平移30个像素int ty -70; // 沿y轴平移-70个像素向上// 创建平移矩阵cv::Mat translationMatrix (cv::Mat_double(2, 3) 1, 0, tx,0, 1, ty);// 应用平移变换cv::Mat translatedImg;cv::warpAffine(img, translatedImg, translationMatrix, img.size());// 显示原图和翻译后的图像cv::namedWindow(Original Image, cv::WINDOW_NORMAL);cv::imshow(Original Image, img);cv::namedWindow(Translated Image, cv::WINDOW_NORMAL);cv::imshow(Translated Image, translatedImg);cv::waitKey(0);return 0;
}在这个例子中我们加载了一张图片
并定义了一个平移矩阵 translationMatrix。
接着我们使用 cv::warpAffine 函数
输入原始图像、平移矩阵以及输出图像的尺寸在这里我们保持了原始图像的大小。
最后我们显示原图和平移后的图像并等待用户按键退出。
运行结果 示例代码
// test.cpp : 此文件包含 main 函数。程序执行将在此处开始并结束。
//#include pch.h
#include iostream
#include opencv2/imgproc/imgproc.hpp
#include opencv2/highgui/highgui.hpp
#include opencv2/core/core.hpp
#include iostream//#pragma comment(lib, opencv_world450d.lib) //引用引入库 //平移操作图像大小不变
cv::Mat imageTranslation1(cv::Mat srcImage, int x0ffset, int y0ffset)
{int nRows srcImage.rows;int nCols srcImage.cols;cv::Mat resultImage(srcImage.size(), srcImage.type());//遍历图像for (int i 0; i nRows; i){for (int j 0; j nCols; j){int x j - x0ffset;int y i - y0ffset;//边界判断if (x 0 y 0 x nCols y nRows){resultImage.atcv::Vec3b(i, j) srcImage.ptrcv::Vec3b(y)[x]; }}}return resultImage;
}
//平移操作图形大小改变
cv::Mat imageTranslation2(cv::Mat srcImage, int x0ffset, int y0ffset)
{//设置平移尺寸int nRows srcImage.rows abs(y0ffset);int nCols srcImage.cols abs(x0ffset);cv::Mat resultImage(nRows, nCols, srcImage.type());//图像遍历for (int i 0; i nRows; i){for (int j 0; j nCols; j){int x j - x0ffset;int y i - y0ffset;//边界判断if (x 0 y 0 x nCols y nRows){resultImage.atcv::Vec3b(i, j) srcImage.ptrcv::Vec3b(y)[x]; }}}return resultImage;
}int main()
{//读取图像cv::Mat srcImage cv::imread(02.jpeg);if (srcImage.empty()){return -1;}//显示原图像cv::namedWindow(原图, CV_WINDOW_NORMAL);cv::imshow(原图, srcImage);int x0ffset 50;int y0ffset 80;cv::Mat resultImage1 imageTranslation1(srcImage, x0ffset, y0ffset);cv::namedWindow(移动1, CV_WINDOW_NORMAL);cv::imshow(移动1, resultImage1);cv::Mat resultImage2 imageTranslation2(srcImage, x0ffset, y0ffset);cv::namedWindow(移动3, CV_WINDOW_NORMAL);cv::imshow(移动3, resultImage1);x0ffset -50;y0ffset -80;cv::Mat resultImage3 imageTranslation1(srcImage, x0ffset, y0ffset);cv::namedWindow(移动2, CV_WINDOW_NORMAL);cv::imshow(移动2, resultImage3);cv::waitKey(0);return 0;
}
运行结果