OpenCV中flip函数实现

这篇具有很好参考价值的文章主要介绍了OpenCV中flip函数实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、flip()函数原型介绍

void cv::flip(InputArray src,OutputArray dst, int flipCode)
各参数含义
src:输入图像。
dst:输出图像。
flip:翻转方式标志。数值大于0,表示绕y轴进行翻转;数值等于0,表示绕x轴进行翻转;数值小于0,表示绕两个轴翻转。
以上就是OpenCV中flip()函数的原型,函数的功能和参数都比较简单,就是实现对图像进行一个翻转功能,得到翻转后的图像。

二、二维图形的几何变换

若我们不使用flip()函数如何实现图像的翻转。首先就必须了解二维图像的几何变换。使用齐次坐标表示点的变换非常方便。下面说明在实现图像翻转过程中使用的二维齐次坐标变换矩阵。
二维齐次坐标变换矩阵为3*3的矩阵,其形式为:

opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理
该矩阵中每个元素都有特殊含义。其中,2*2矩阵{a,b;c,d}可以对图像进行缩放、旋转、对称、和错切等变换;[c f]^T对图像进行平移变换;[g h]则是对图像进行投影变换;[i]则是对图像整体进行缩放变化。要实现图像的翻转,需要对图像进行对称变换和平移变换。只需要用到a,b,c,d,e,f六个元素。我们根据变换矩阵对平移变换和对称变换进行讨论,暂不涉及其它变换。
设对像素点P0(y0,x0)进行变换后得到的坐标为(y1,x1).
1:平移变换
以图像左上角为坐标原点对像素点P0(y0,x0)向y方向平移ty个像素单位,向x方向平移tx个像素单位。x1,y1表示平移后的坐标。则点P0与变换矩阵之间的计算为:
注:在下文中始终以图像或矩阵左上角作为坐标原点
opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理
2:对称变换

opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理
对称变换其实只是a,b,d,e取0、1、-1等这些特殊值产生的一些特殊效果。例如:
(1) 当b=d=0,a=-1,e=1时,有x1=-x0,y1=y0,产生与y轴对称的图形;
(2) 当b=d=0,a=1,e=-1时,有x1=x0,y1=-y0,产生与x轴对称的图形;
(3) 当b=d=0,a=e=-1时,有x1=-x0,y1=-y0,产生与原点对称的图形;
(4) 当b=d=1,a=e=0时,有x1=y0,y1=x0,产生与直线y=x对称的图形;

三、自定义flip函数的思路

图像由一个个像素组成,这些像素就形成了以像素为基本单位的二维矩阵。将图像进行翻转就是将这个二维矩阵进行翻转。我们先在一个大小为rows*cols矩阵A对元素p(y,x)进行关于x轴翻转的变换形成矩阵B。在关于x轴对称变换过程中x值保持不变,y值变为原值的相反数。在矩阵B中不存在坐标为(-y,x)的点,需要进行一个平移操作,将点向y轴方向平移rows个单位。得到点p(y,x)关于x轴翻转后对应坐标为(-y+rows,x)的点。确定好翻转后的坐标,最后进行赋值B[-y+rows][x]=A[y][x],就完成了这一个元素关于x轴的翻转。
opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理
对矩阵A的每一个元素都进行如上操作就可以实现矩阵A关于x轴的翻转得到矩阵B。

三、算法代码

#define xsymmetry 0//x轴对称
#define ysymmetry 1//y轴对称
#define xysymmetry -1//先以x对称,再以y轴对称

void coordinateTransform(int x0, int y0, int &x1, int &y1, int transformType, int x_offset, int y_offset)
{/*x0,y0为原图像中某一像素点的坐标
 *x1,y1,为图像像素点(y,x)经过类型为transformType的变换后对应的坐标
 *x_offset,y_offset分别为x(横)方向,y(纵)方向的偏移量
 */

	if (transformType == xsymmetry)
	{//x对称变换
		x1 = x0;
		y1 = -y0 + y_offset;
	}
	else if (transformType == ysymmetry)
	{//y对称变换
		x1 = -x0 + x_offset;
		y1 = y0;
	}
	else if (transformType == xysymmetry)
	{//先x轴再y轴对称(原点对称)
		x1 = -x0 + x_offset;
		y1 = -y0 + y_offset;
	}
}

void myFlip(const InputArray &src, OutputArray &dst, int symmetryType)
{
	int dataType = src.type();
	vector<Mat> imgs;
	vector<Mat> imgs1;
	split(src, imgs);//先将初始图像进行通道分离

	//图像的宽度和高度
	int width = imgs[0].cols;
	int height = imgs[0].rows;
	int type = imgs[0].type();
	int x, y;//原图像中像素点的坐标,(以图像左上角为原点)
	int x1, y1;//像素点(y,x)变换后对应的坐标
	for (int t = 0;t < src.channels();t++)
	{
	    //定义一个与输入图像src大小一致的Mat变量用于保存翻转后单个通道形成的图像
		Mat tempImg(Size(width,height),type);
		for (y = 0;y < height;y++)
		{
			for (x = 0;x < width;x++)
			{
				coordinateTransform(x, y, x1, y1, symmetryType, width, height);

				*(tempImg.data + tempImg.step[0] * y + tempImg.step[1] * x) =
					*(imgs[t].data + imgs[t].step[0] * y1 + imgs[t].step[1] * x1);
			}
		}

		imgs1.push_back(tempImg);
	}
	merge(imgs1, dst);//合并通道
}

多通道图像先进行通道分离,再对每个通道都要进行翻转变换,最后合并成翻转后的完整图像。
直接使用像素坐标进行元素访问,避免了对Mat变量类型的讨论。其它访问Mat元素的方式都需要明确数据类型。

四、自定义函数与库函数flip()的效果对比

int main()
{
	Mat img = imread("../lena.png", IMREAD_GRAYSCALE);
	Mat img0 = imread("../lena.png");
	if (img.empty())
	{
		cout << "打开图像文件失败,请确认文件名称是否正确" << endl;
		return -1;
	}

	Mat img_x, img_y, img_xy;//灰度图像
	Mat img_x0, img_y0, img_xy0;//彩色图像

    //
	Mat myimg_x, myimg_y, myimg_xy;//灰度图像
	Mat myimg_x0, myimg_y0, myimg_xy0;//彩色图像

	//灰度图像的翻转操作
	flip(img, img_x, 0);
	flip(img, img_y, 1);
	flip(img, img_xy, -1);
	myFlip(img, myimg_x, 0);
	myFlip(img, myimg_y, 1);
	myFlip(img, myimg_xy, -1);

	//彩色图像的翻转操作
	flip(img0, img_x0, 0);//翻转 x轴对称
	flip(img0, img_y0, 1);//翻转 y轴对称
	flip(img0, img_xy0, -1);//翻转 先x轴对称再y轴对称
	myFlip(img0, myimg_x0, 0);//翻转 x轴对称
	myFlip(img0, myimg_y0, 1);//翻转 x轴对称
	myFlip(img0, myimg_xy0, -1);//翻转 x轴对称

	//灰度图像的显示
	imshow("img", img);
	imshow("myimg_x", myimg_x);
	imshow("myimg_y", myimg_y);
	imshow("myimg_xy", myimg_xy);
	imshow("img_x", img_x);
	imshow("img_y", img_y);
	imshow("img_xy", img_xy);

	//彩色图像显示
	imshow("img0", img0);
	imshow("img_x0", img_x0);
	imshow("myimg_x0", myimg_x0);
	imshow("myimg_y0", myimg_y0);
	imshow("myimg_xy0", myimg_xy0);
	imshow("img_y0", img_y0);
	imshow("img_xy0", img_xy0);

	waitKey();
	return 0;
}

原灰度图和原彩色图
opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理

关于x轴翻转后的图像灰度图像(以my开头的是自定义函数myFlip()的测试效果)
opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理

关于x轴翻转再关于y轴翻转后的彩色图像(以my开头的是自定义函数myFlip()的测试效果)
opencv flip,算法,OpenCV,opencv,计算机视觉,图像处理
效果一致,测试成功。文章来源地址https://www.toymoban.com/news/detail-765303.html

到了这里,关于OpenCV中flip函数实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机毕设 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月10日
    浏览(48)
  • 计算机毕业分享(含算法) opencv图像增强算法系统

    今天学长向大家分享一个毕业设计项目 毕业设计 opencv图像增强算法系统 项目运行效果: 毕业设计 基于机器视觉的图像增强 项目获取: https://gitee.com/sinonfin/algorithm-sharing 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达

    2024年01月18日
    浏览(46)
  • 计算机毕设 python opencv 机器视觉图像拼接算法

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月07日
    浏览(63)
  • OpenCV中flip函数实现

    void cv::flip(InputArray src,OutputArray dst, int flipCode) 各参数含义 src:输入图像。 dst:输出图像。 flip:翻转方式标志。数值大于0,表示绕y轴进行翻转;数值等于0,表示绕x轴进行翻转;数值小于0,表示绕两个轴翻转。 以上就是OpenCV中flip()函数的原型,函数的功能和参数都比较简单,就

    2024年02月04日
    浏览(32)
  • 深入探究计算机视觉库OpenCV:开源视觉算法与应用详解

    计算机视觉作为人工智能领域的重要分支,为我们提供了丰富的工具和技术,帮助我们处理图像和视频数据。而OpenCV(Open Source Computer Vision Library)作为最受欢迎的开源计算机视觉库之一,为开发人员提供了丰富的功能和工具,用于处理图像和视频数据。本文将深入探讨Open

    2024年03月13日
    浏览(57)
  • 计算机毕业分享(含算法) 基于opencv的银行卡识别

    🔥 今天学长向大家分享一个毕业设计项目 🚩 毕业设计 基于opencv的银行卡识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目运行效果: 毕业设计 机器视觉opencv银行卡识别系统 项目获取: https://gitee.com/sinonfin/algorithm-sharing 银行

    2024年02月02日
    浏览(43)
  • 【计算机视觉】---OpenCV实现物体追踪

    OpenCV中的物体追踪算法基于视觉目标跟踪的原理。物体追踪的目标是在连续的图像序列中定位和跟踪特定物体的位置。 在物体追踪中,我们需要对目标对象进行表示。通常使用边界框(bounding box)来表示目标的位置和大小。边界框是一个矩形区域,由左上角的坐标(x,y)和

    2024年02月08日
    浏览(51)
  • OpenCV处理图像和计算机视觉任务时常见的算法和功能

    当涉及到OpenCV处理图像和计算机视觉任务时,有许多常见的具体算法和功能。以下是一些更具体的细分: 图像处理算法: 图像去噪 :包括均值去噪、高斯去噪、中值滤波等,用于减少图像中的噪声。 直方图均衡化 :用于增强图像的对比度,特别适用于低对比度图像。 边缘

    2024年02月11日
    浏览(43)
  • 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年02月05日
    浏览(70)
  • 计算机视觉:使用opencv实现车牌识别

    汽车车牌识别(License Plate Recognition)是一个日常生活中的普遍应用,特别是在智能交通系统中,汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起,以准确识别出车牌牌照的字符为目的,将识别出的数据传送至交

    2024年02月04日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包