昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 880|回复: 0
收起左侧

使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变)

[复制链接]

238

主题

241

帖子

931

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
931
昊虹君 发表于 2022-12-22 19:23 | 显示全部楼层 |阅读模式
使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变)

图像的平移操作是将图像的所有像素点进行水平或垂直方向上的移动。
平移操作分为两种类型:图像的尺寸变化与图像的尺寸不变。前者保证图像平移时原图的完整信息,后者在平移后原图的信息会有部分丢失。

没什么高深的数学原理,直接用代码驱动图像平移即可。

使用OpenCV对图像进行两种平移操作的C++代码如下:
代码中用到的图像下载链接:
https://pan.baidu.com/s/1G640rwo6shN1S2t1iIupsg?pwd=xjqw
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

// 平移操作:平移后得到的图像与原图像一样大,原图信息部分失丢
cv::Mat imageTranslation1(cv::Mat & srcImage, int xOffset, int yOffset)
{
	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 - xOffset;
			int y = i - yOffset;
			// 边界判断
			if (x >= 0 && y >= 0 && x < nCols && y < nRows)
				resultImage.at<cv::Vec3b>(i, j) =
				srcImage.ptr<cv::Vec3b>(y)[x];
		}
	}
	return resultImage;
}

// 平移操作:平移后得到的图像与原图像不一样大,原图信息不失丢
cv::Mat imageTranslation2(cv::Mat & srcImage, int xOffset, int yOffset)
{
	// 设置平移尺寸
	int nRows = srcImage.rows + abs(yOffset);
	int nCols = srcImage.cols + abs(xOffset);
	cv::Mat resultImage(nRows, nCols,
		srcImage.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)
				resultImage.at<cv::Vec3b>(i, j) =
				srcImage.ptr<cv::Vec3b>(y)[x];
		}
	}
	return resultImage;
}
int main()
{
	cv::Mat srcImage = cv::imread("F:/material/images/2022/2022-12/flower1.jpg");
	if (!srcImage.data)
		return -1;
	cv::imshow("原图", srcImage);
	int xOffset = 50, yOffset = 80;

	// 图像右平移,并且平移后得到的图像与原图像一样大,原图信息部分丢失
	cv::Mat resultImage1 =
		imageTranslation1(srcImage, xOffset, yOffset);
	cv::imshow("右平移,原图有信息丢失", resultImage1);

	// 图像右平移,并且平移后得到的图像与原图像不一样大,原图信息不失丢
	cv::Mat resultImage2 =
		imageTranslation2(srcImage, xOffset, yOffset);
	cv::imshow("右平移,原图无信息丢失", resultImage2);

	// 图像左平移,并且平移后得到的图像与原图像一样大,原图信息部分丢失
	xOffset = -50, yOffset = -80;
	cv::Mat resultImage3 =
		imageTranslation1(srcImage, xOffset, yOffset);
	cv::imshow("左平移,原图有信息丢失", resultImage3);

	cv::waitKey(0);
	return 0;
}

运行结果如下图所示:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2024-5-19 08:52 , Processed in 0.025795 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表