(opencv)图像几何变换——平移

这篇具有很好参考价值的文章主要介绍了(opencv)图像几何变换——平移。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像的平移操作是将图像的所有像素坐标进行水平或垂直方向移动,也就是将所有像素点按照给定的偏移量在水平方向沿x轴、垂直方向上沿y轴移动。平移变换分为两种类型:图像大小变化与图像大小不变。第一种类型保证图像平移的完整信息,第二种图像导致原始图像的部分信息可能丢失。图像平移变换公式如下:(不会用csdn自带的公式编辑器,使用mathtype打出来再截图的)

(opencv)图像几何变换——平移

 对4*4图像矩阵向右平移x轴一个单位,向下平移y轴一个单位,若移动后图像的大小保持不变,多余部分填充为白色时满足:

(opencv)图像几何变换——平移

对4*4图像矩阵向左平移x轴一个单位,向上平移y轴一个单位,若移动后图像的大小变换,多余部分填充为白色时满足:

(opencv)图像几何变换——平移 

举例说明: 

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;

//平移操作,图像大小不变
Mat imgTranslation1(Mat& src, int xOffset, int yOffset)
{
	int nRows = src.rows;
	int nCols = src.cols;
	Mat result (src.size(), src.type());
	//遍历图像
	for (int i = 0; i < nRows; ++i)
	{
		for (int j = 0; j < nCols; ++j)
		{
			int x = j - xOffset;
			int y = i - yOffset;
			if (x >= 0 && y >= 0 && x < nCols && y < nRows)
			{
				result.at<Vec3b>(i, j) = src.ptr<Vec3b>(y)[x];
			}
		}
	}
	return result;
}

//平移操作,图像大小改变
Mat imgTranslation2(Mat& src, int xOffset, int yOffset)
{
	//设置平移尺寸
	int nRows = src.rows + abs(yOffset);
	int nCols = src.cols + abs(xOffset);
	Mat result(nRows,nCols, src.type());
	//遍历图像
	for (int i = 0; i < nRows; ++i)
	{
		for (int j = 0; j < nCols; ++j)
		{
			//映射变换
			int x = j - xOffset;
			int y = i - yOffset;
			if (x >= 0 && y >= 0 && x < nCols && y < nRows)
			{
				result.at<Vec3b>(i, j) = src.ptr<Vec3b>(y)[x];
			}
		}
		
	}
	return result;
}
int main()
{
	Mat src = imread("C:\\Users\\32498\\Pictures\\16.png");
	if (!src.data)
	{
		return -1;
	}
	imshow("src", src);
	int xOffset = 50, yOffset = 80;
	//图像左平移不改变大小
	Mat dst1 = imgTranslation1(src, xOffset, yOffset);
	imshow("dst1", dst1);
	//图像左平移改变大小
	Mat dst2 = imgTranslation2(src, xOffset, yOffset);
	imshow("dst2", dst2);
	//图像右平移不改变大小
	Mat dst3 = imgTranslation1(src, -xOffset, -yOffset);
	imshow("dst3", dst3);
	waitKey();
	return 0;

}

运行结果如下: 

(opencv)图像几何变换——平移 

 对程序中的此行代码进行说明

result.at<Vec3b>(i, j) = src.ptr<Vec3b>(y)[x];

result图像(i,j)处的像素值等于src图像第y行,第x个坐标的像素值。这其实是对图像进行逐像素操作。

 ①opencv中的Mat数据类型指针ptr的使用

    cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600
    uchar * data00 = image.ptr<uchar>(0);
    uchar * data10 = image.ptr<uchar>(1);
    uchar * data01 = image.ptr<uchar>(0)[1];

        对上面的注解:(注意看这些的区别)

定义一个Mat变量image,

data00是指向image第一行第一个元素的指针

data10是指向image第二行第一个元素的指针

data01是指向image第一行第二个元素的指针 

②Vec3b类型的含义

Vec3b可以看作是vector<uchar,3>,即一个uchar类型,长度为3的vector向量。(不知道vector容器含义的同学可以这样理解vector,它就是一个数组,只不过这个数组的大小可以随时改变,故称vector为动态数组)

由于在opencv中读取到的Mat图像数据都是用uchar类型的数据存储,对于RGB三通道的图像,每个点的数据都是一个vec3b类型的数据。

使用at定位方法如下:

Mat img=imread("123.png");

//(row,col)为所需要定位点的坐标
img.at<Vec3b>(row,col)[0]=255; //修改点(row,col)的B通道数据
img.at<Vec3b>(row,col)[1]=255; //修改点(row,col)的G通道数据
img.at<Vec3b>(row,col)[2]=255; //修改点(row,col)的R通道数据


 同时还需要注意的是,它返回的是uchar类型,直接使用cout输出为字符格式,需要强制转换为int 类型之后输出:文章来源地址https://www.toymoban.com/news/detail-478084.html


cout<<(int)img.at<Vec3b>(row,col)[0];

到了这里,关于(opencv)图像几何变换——平移的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(39)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(42)
  • 【OpenCV • c++】图像几何变换 | 图像仿射变换

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(30)
  • opencv006图像处理之仿射变换(旋转,缩放,平移)

    空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换过程可以用一个2*3的矩阵与原图进行相乘得到。关键就是这个矩阵M:  平移,旋转   透视 M: 变换矩阵 desi

    2024年01月21日
    浏览(32)
  • (opencv)图像几何变换——缩放

    图像缩放是指将图像的尺寸变小或变大的过程,也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失,因此需要考虑适宜的方法进行操作。 下面介绍两种常用的图像缩放方法的原理及实现 1.基于等间隔提取图像缩放 等间隔提取图像缩放是通过对

    2024年02月16日
    浏览(27)
  • 【OpenCV • c++】图像几何变换 | 图像旋转

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪   图像的几何变换是指在不改变图像像素值的前提下对图像像素进

    2024年02月16日
    浏览(30)
  • 【OpenCV • c++】图像几何变换 | 图像缩放

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(42)
  • 【OpenCV • c++】图像几何变换 | 图像坐标映射

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪   图像的几何变换是指在不改变图像像素值的前提下对图像像素进

    2024年02月12日
    浏览(35)
  • 【OpenCV入门】第七部分——图像的几何变换

    通过resize()方法可以随意更改图像的大小比例: src: 原始图像 dsize: 输出图像的大小,格式为(宽,高),单位为像素 fx: (可选)水平方向的缩放比例 fy: (可选)竖直方向的缩放比例 interpolation: (可选)缩放的插值方式,在图像缩小或放大时需要删减或补充像素,该

    2024年02月10日
    浏览(37)
  • Python-OpenCV中的图像处理-几何变换

    对图像进行各种几个变换,例如移动,旋转,仿射变换等。 cv2.resize() cv2.INTER_AREA v2.INTER_CUBIC v2.INTER_LINEAR res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) 或 height, width = img.shape[:2] res = cv2.resize(img, (2 width, 2 height), interpolation=cv2.INTER_CUBIC) OpenCV提供了使用函数cv2.warpAffine()实

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包