本科课程【数字图像处理】实验7 - 图像的平移与伸缩变换

x33g5p2x  于2022-05-27 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(279)

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

1、 掌握图像的平移变换原理与操作
2、 掌握图像的伸缩变换原理与操作

二、 实验内容

1. 实验任务

编写程序实现图片的平移与伸缩变换

2. 程序设计

1) 原理


2) 流程
(1) 打开VC++,编写相应的图像平移、伸缩的代码;
(2) 运行程序,打开文件,得到效果图。

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:Visual Studio
  3. 实验设备:PC

源代码

平移变换:

//读原图 
Mat image; 
image = imread("pic.jpg", CV_LOAD_IMAGE_COLOR); 
if (!image.data) 
{ 
	cout << "找不到图片或无法打开图片\n";
	return -1; 
} 
namedWindow("image_source", CV_WINDOW_AUTOSIZE); 
imshow("原图", image); 
//--------------------平移变换-------------- 
int dx = 10, dy = 20; 
Mat image_shift(image.rows + dx, image.cols+dy, CV_8UC3);
//新建一个大于原图的图像,备用
//一个个像素进行处理 
for (int counter1 = 0; counter1 < image.rows; counter1++) 
{ 
	for (int counter2 = 0; counter2 < image.cols; counter2++) 
	{ 
		//将原坐标进行平移,并将原坐标上的RGB值赋给新坐标 
		image_shift.at<Vec3b>(counter1+dx, counter2+dy)[0] = image.at<Vec3b>(counter1, counter2)[0]; 
		image_shift.at<Vec3b>(counter1+dx, counter2 + dy)[1] = image.at<Vec3b>(counter1, counter2)[1]; 
		image_shift.at<Vec3b>(counter1+dx , counter2+ dy)[2] = image.at<Vec3b>(counter1, counter2)[2]; 
	} 
}
//imshow("平移", image_shift); 
imwrite("1.jpg", image_shift);
//将平移后的图像存储为名称为1.jpg的文件
//-------------- 平移完成-------------------

2)缩放变换

double mul_num = 0.8;
//大于1是放大,小于1是缩小 
int row_num = (int)floor(image.rows * mul_num), col_num = (int)floor(image.cols * mul_num); 
Mat image_scale(row_num, col_num, CV_8UC3); 
for (int counter1 = 0; counter1 < row_num; counter1++) 
{ 
	for (int counter2 = 0; counter2 < col_num; counter2++) 
	{ 
		//将筛孔缩小,对上画的大小 
		int x = (int)1.0 / mul_num *counter1, y = (int)1.0 / mul_num *counter2; 
		image_scale.at<Vec3b>(counter1, counter2 )[0] = image.at<Vec3b>(x, y)[0]; 
		image_scale.at<Vec3b>(counter1, counter2 )[1] = image.at<Vec3b>(x, y)[1]; 
		image_scale.at<Vec3b>(counter1, counter2 )[2] = image.at<Vec3b>(x, y)[2]; 
	} 
} //imshow("尺度变换", image_scale); 
imwrite("2.jpg", image_scale);
//存储变换后的图像

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

开发者涨薪指南

48位大咖的思考法则、工作方式、逻辑体系

相关文章