实现图片沿水平和竖直方向翻转(旋转180度)
相机旋转180度,为了不改变原有的算法,最好的方法是将图片旋转180,这样就和之前拍摄的图片一致了。最先想到的方法是在basler相机中设置,但只找到了ReverseX,不满足要求。
查阅左飞的图像处理书,他介绍了基于GDI+ 中DrawImage实现翻转的方法,分辨率为2592*1944的图片,耗时260ms,太慢了,这种方法不可取。实现代码如下
private Bitmap ReverseByDrawImage(Bitmap bitmap){System.DateTime begin = System.DateTime.Now;Bitmap image = new Bitmap(bitmap.Width, bitmap.Height);using (Graphics graphics = Graphics.FromImage(image)) //假如直接使用FromImage(bitmap),会报错“无法从带有索引像素格式的图像创建Graphics对象。”{Rectangle Rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);graphics.DrawImage(bitmap, Rect, Rect, GraphicsUnit.Pixel);graphics.Dispose();}Graphics graphicsRev = Graphics.FromImage(image);Point[] VerPoints = { new Point(bitmap.Width, 0), new Point(0, 0), new Point(bitmap.Width, bitmap.Height) };graphicsRev.DrawImage(image, VerPoints);Point[] HorPoints = { new Point(0, bitmap.Height), new Point(bitmap.Width, bitmap.Height), new Point(0, 0) };graphicsRev.DrawImage(image, HorPoints);System.DateTime end = System.DateTime.Now;TimeSpan duration = end - begin;MessageBox.Show("DrawImage Duration time is :" + duration.Milliseconds + " ms");return image;}
第二种方法是在内存中实现翻转,原理是在内存中将图片像素首尾替换,该方法耗时26ms,代码如下
private unsafe Bitmap ReverseBmpByPtr(Bitmap bitmap){System.DateTime begin = System.DateTime.Now;Bitmap bitmapClone = (Bitmap)bitmap.Clone();int width = bitmap.Width;int height = bitmap.Height;int length = height * width;byte[] Pixels = new byte[length];byte[] PixelsClone = new byte[length];BitmapData data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);BitmapData dataClone = bitmapClone.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);System.IntPtr Scan0 = data.Scan0;System.IntPtr Scan0Clone = dataClone.Scan0;System.Runtime.InteropServices.Marshal.Copy(Scan0, Pixels, 0, length);System.Runtime.InteropServices.Marshal.Copy(Scan0Clone, PixelsClone, 0,length);for (int i = 0; i < Pixels.Length; i += 1){PixelsClone[i] = Pixels[length-i-1];}System.Runtime.InteropServices.Marshal.Copy(Pixels, 0, Scan0, length);System.Runtime.InteropServices.Marshal.Copy(PixelsClone, 0, Scan0Clone, length);bitmap.UnlockBits(data);bitmapClone.UnlockBits(dataClone);System.DateTime end = System.DateTime.Now;TimeSpan duration = end - begin;MessageBox.Show("Ptr Duration time is :" + duration.Milliseconds + " ms");return bitmapClone;}
后来发现Bitmap类有一个方法RotateFlip支持对图像和旋转和翻转操作,速度更快,耗时15ms
private Bitmap ReverseBmpByRotateFlip(Bitmap bitmap){System.DateTime begin = System.DateTime.Now;bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);System.DateTime end = System.DateTime.Now;TimeSpan duration = end - begin;MessageBox.Show("RotateFlip Duration time is :" + duration.Milliseconds + " ms");return bitmap;}
测试了Halcon中mirror_image算子,耗时约为13ms。
基于像素的图像处理,一定要放在内存中进行,否则太慢了,避免使用类似GetPixel和SetPixel的方法。
实现图片沿水平和竖直方向翻转(旋转180度)相关推荐
- CSS盒子模型和水平、竖直方向的布局
一.块元素.行内元素和行内块元素 行内元素特征: (1)设置宽高无效 (2)对margin仅设置左右方向有效,上下无效:padding设置上下左右都有效,即会撑大空间 (3)不会自动进行换行 块状元素 ...
- CSS | DIV 水平和竖直方向居中
1.竖直方向: 最近做个小页面遇到了点麻烦:需要设置元素的竖直方向居中. 以往的经验: display: inline-block; vertical-align: middle; 就可以解决.但是这 ...
- 对象水平对齐,并且按照竖直方向排列
;; ;;程序名称:对象水平对齐程序,并且按照竖直方向排列 ;;执行命令:tb2 ;;程序功能:将选定的对象左对齐,并且按照竖直方向排列. ;; (defun c:tb2(/ selobjs oldc ...
- 大气磅礴的网站效果 scroll+easing+animation+水平、竖直滚动
像酒店 酒吧 咖啡店连锁 小型餐厅 音乐网站等等 都可以采用我如下所讲的大气磅礴的网站效果 scroll+easing+animation+水平.竖直滚动... 主要运用的技术有jquery easi ...
- android 动画x轴旋转,Android Roate3dAnimation实现围绕y轴竖直方向或者绕x轴方向旋转的3d动画效果...
概要: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Roate3dAnim ...
- 在html中让图片旋转180度,gif图片旋转教程:怎么把gif旋转90度/180度 附gif图片旋转软件...
视频可以用视频编辑软件将视频旋转90度>>gif旋转90度或180度呢,往下看,你可在本文中找到答案. 先睹为快,看看旋转的效果对比图: 原图 顺时旋 ...
- 用OpenCV实现图像的水平镜像(翻转)变换和竖直镜像(翻转)变换(垂直镜像变换)的源码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 直接上源码,本人是参考博文的源码OpenCV2: ...
- Latex 插入表格水平,竖直边框
整体水平边框 Latex插入水平边框的命令是\hline,这会在出现这个命令的表格位置针对整个表格水平范围插入一个水平边框.输入如下代码,插入一个4行3列的表格进行演示. 2 编译后可以看到只要出现\ ...
- Textview水平、竖直分散对齐
Textview是一个android里面很基础的控件.使用起来也很方便单是也有一定的局限性.前几天UI设计了一个分散对齐的文本.这个在显示的时候就很不好调了.所以直接定义一个textview吧.这里首 ...
最新文章
- 一个函数打天下,einsum
- python发挥_充分发挥 Python 的威力:用最简单的方法打造互联互通的智能产品
- 面试问题-使用Java线程做数学运算
- JAVA入门到精通-网络编程补充和QQ案例
- 内存储器和cpu一起构成了计算机,计算机系统的组成
- c语言微信昵称大全女生优雅经典的,微信昵称大全女生优雅_有深度有内涵的昵称...
- C#动态生成html页
- 20170505思考点--编写案例时是以功能为主还是业务为主要
- Bootstrap3 栅格系统之列平移
- “赤膊贪凉”要不得 多喝蜜水防“秋燥”
- 【Hadoop Summit Tokyo 2016】基于Apache Spark的数据科学
- 转载 java序列化与反序列化
- hive中的集合操作函数
- 快速学会普源示波器的调节和使用
- 题解 P2916 【[USACO08NOV]安慰奶牛Cheering up the Cow】
- Grafana 6.7的sqlite3数据库报错“database is locked”的修复方法
- 深度学习是表示学习的经典代表(浅谈什么是深度学习)
- select下拉框(支持筛选、多选)
- 信号的基本概念及分类
- 用实战项目经验告诉你什么是二方包!