2017-01-05 22:53:54 lhtzbj12 阅读数 16346
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2031 人正在学习 去看看 贾志刚

简介

图像旋转功能在实际使用中出现得不多,Image自带RotateFlip方法可以简单的实现90、180等角度的旋转或者翻转,但是如果要实现任意角度的旋转该怎么做?对于一个有经验的同学估计不到半天时间就可以完成,如果让新手遇到,估计就傻了,毕竟里面涉及了三角函数、空间坐标等方面的知识,比较蛋疼的是,Graphics(或者矩形)的旋转变换都是以左上角为原点,如果要以其中心进行旋转该怎么做?想知道的话就继续往后看吧。
本文将重点向大家介绍怎么使用GDI+(Graphics)获取图像按任意角度旋转后的图像。

动手前先解决两个问题

获取图片旋转后所占的矩形区域宽高

黄色矩形框表示图像旋转后的区域
如动态图所示,我们已知源图宽高和旋转角度,需要计算动态图中黄色矩形的宽高,用数学示意图表示如下:
这里写图片描述
数学公式如下:
这里写图片描述
是不是有点晕,不用着急,直接看代码

/// <summary>
/// 计算矩形绕中心任意角度旋转后所占区域矩形宽高
/// </summary>
/// <param name="width">原矩形的宽</param>
/// <param name="height">原矩形高</param>
/// <param name="angle">顺时针旋转角度</param>
/// <returns></returns>
public Rectangle GetRotateRectangle(int width, int height, float angle)
{
      double radian = angle * Math.PI / 180; ;
      double cos = Math.Cos(radian);
      double sin = Math.Sin(radian);
      //只需要考虑到第四象限和第三象限的情况取大值(中间用绝对值就可以包括第一和第二象限)
      int newWidth = (int)(Math.Max(Math.Abs(width * cos - height * sin), Math.Abs(width * cos + height * sin)));
      int newHeight = (int)(Math.Max(Math.Abs(width * sin - height * cos), Math.Abs(width * sin + height * cos)));
      return new Rectangle(0, 0, newWidth, newHeight);
}     

已知一个矩形,如何绘制其绕其中心点旋转N度后的矩形区域

由于Graphics进行旋转平移等转换时的原点都是左上角,我们的要求是绕矩形中心旋转,需要三步完成
(1)将Graphics的原点移至矩形的中点,假设坐标为(x,y)
(2)将Graphics绕当前原点旋转N度
(3)将Graphics沿(-x,-y)移回
每步形成效果如下图所示。红色为原矩形,黄色为第一步,蓝色为第二步,绿色为第三步。
这里写图片描述
上面几步实现的具体代码如下:

int angle = int.Parse(txtDestAngle.Text);//txtDestAngle为界面中一个TextBox控件
var btn = sender as Button;
Graphics graphics = null;
try
{
    //假设待处理的矩形 长宽为
    var w = 120;
    var h = 60;
    //创建graphics
    graphics = pictureBox1.CreateGraphics(); ;//pictureBox1为界面中一个PictureBox控件
    graphics.Clear(Color.Gray);
    //原始位置
    //画出矩形中心点
    graphics.DrawEllipse(new Pen(Color.Red), new Rectangle(w / 2 - 2, h / 2 - 2, 4, 4));
    //画出矩形当前位置
    graphics.DrawRectangle(new Pen(Color.Red), new Rectangle(0, 0, w, h));
    //***第一步***
    //将graphics坐标原点移到矩形中心点
    graphics.TranslateTransform(w / 2, h / 2);
    //画出矩形当前位置
    graphics.DrawRectangle(new Pen(Color.Yellow), new Rectangle(0, 0, w, h));
    //***第二步***
    //graphics旋转相应的角度(绕当前原点)
    graphics.RotateTransform(angle);
    //画出矩形当前位置
    graphics.DrawRectangle(new Pen(Color.Blue), new Rectangle(0, 0, w, h));
    //***每三步***
    //恢复graphics在水平和垂直方向的平移(沿当前原点)
    graphics.TranslateTransform(-w / 2, -h / 2);
    //画出矩形当前位置
    graphics.DrawRectangle(new Pen(Color.Green), new Rectangle(0, 0, w, h));
    //重至绘图的所有变换
    graphics.ResetTransform();
    graphics.Save();
    //***结束***
}
catch (Exception ex)
{
     MessageBox.Show(ex.Message);
}
finally
{
     if (graphics != null)
          graphics.Dispose();
}

获得图像旋转任意角度后的图像

解决上述两个问题后,再想获取图像旋转任意角度后的图像就会变得很简单了
(1)已知一个原始图像srcImage和要旋转的角度
(2)获取这个图像按角度旋转后的宽高(rotateRect)
(3)根据旋转后的宽高定义Bitmap(rotateImage),定义Graphics,将Graphics按rotateImage的矩形区域中心进行旋转变换
(4)将srcImage绘制到rotateImage中心(即两个中心点重合)
(5)重置Graphics,完成
完整代码如下

/// <summary>
/// 获取原图像绕中心任意角度旋转后的图像
/// </summary>
/// <param name="rawImg"></param>
/// <param name="angle"></param>
/// <returns></returns>
public Image GetRotateImage(Image srcImage, int angle)
{
     angle = angle % 360;
     //原图的宽和高
     int srcWidth = srcImage.Width;
     int srcHeight = srcImage.Height;
     //图像旋转之后所占区域宽和高
     Rectangle rotateRec = GetRotateRectangle(srcWidth, srcHeight, angle);
     int rotateWidth = rotateRec.Width;
     int rotateHeight = rotateRec.Height;
     //目标位图
     Bitmap destImage = null;
     Graphics graphics = null;
     try
     {
          //定义画布,宽高为图像旋转后的宽高
          destImage = new Bitmap(rotateWidth, rotateHeight);
          //graphics根据destImage创建,因此其原点此时在destImage左上角
          graphics = Graphics.FromImage(destImage);
          //要让graphics围绕某矩形中心点旋转N度,分三步
          //第一步,将graphics坐标原点移到矩形中心点,假设其中点坐标(x,y)
          //第二步,graphics旋转相应的角度(沿当前原点)
          //第三步,移回(-x,-y)
          //获取画布中心点
          Point centerPoint = new Point(rotateWidth / 2, rotateHeight / 2);
          //将graphics坐标原点移到中心点
          graphics.TranslateTransform(centerPoint.X, centerPoint.Y);
          //graphics旋转相应的角度(绕当前原点)
          graphics.RotateTransform(angle);
          //恢复graphics在水平和垂直方向的平移(沿当前原点)
          graphics.TranslateTransform(-centerPoint.X, -centerPoint.Y);
          //此时已经完成了graphics的旋转

          //计算:如果要将源图像画到画布上且中心与画布中心重合,需要的偏移量
          Point Offset = new Point((rotateWidth - srcWidth) / 2, (rotateHeight - srcHeight) / 2);                
          //将源图片画到rect里(rotateRec的中心)
          graphics.DrawImage(srcImage, new Rectangle(Offset.X, Offset.Y, srcWidth, srcHeight));
          //重至绘图的所有变换
          graphics.ResetTransform();
          graphics.Save();
     }
     catch (Exception ex)
     {
          throw ex;
     }
     finally
     {
          if (graphics != null)
               graphics.Dispose();
     }
     return destImage;
}        

注意:如果发现有的方法没有具体实现,请移步《C#中基于GDI+(Graphics)图像处理系列之前言》获取完整的图像处理工具类源码

完整示例程序源码下载

http://download.csdn.net/detail/lhtzbj12/9730116
如果想查阅本系列其他文章,请移步《C#中基于GDI+(Graphics)图像处理系列之前言》

2018-11-18 19:32:53 qutadi 阅读数 99
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2031 人正在学习 去看看 贾志刚

源码下载简介

VC++简单医学图像处理系统,可以调整图像色阶、锐度、反色、灰底均衡,还可以对图像进行反转、平移、旋转等操作,类似Photoshop某些功能一样,当然,和PS比,是差了点,只能作为一些C++处理图像的参考吧。

源码下载地址:点击下载

备用下载地址:点击下载

2019-06-14 17:36:26 Accelerato 阅读数 3389
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2031 人正在学习 去看看 贾志刚

注释

  • PIL 是 python 的一个图像处理库,功能非常强大,可以实现图片的格式转换、旋转、裁剪、改变尺寸、像素处理、图片合并等等操作。
  • PIL已经更名为pillow 所以在终端输入 pip3 install pil 会报错,而应该输入 pip3 install pillow进行安装。

源码


from PIL import Image 

def Image_PreProcessing():
	# 待处理图片存储路径	
	im = Image.open('UnprocessImage.jpeg')
	# Resize图片大小,入口参数为一个tuple,新的图片大小
	imBackground = im.resize((260,184))
	#处理后的图片的存储路径,以及存储格式
	imBackground.save('ProcessedImage.jpg','JPEG')
if __name__ == "__main__":
	Image_PreProcessing()

2014-08-22 16:36:07 slvher 阅读数 2297
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2031 人正在学习 去看看 贾志刚

前段时间项目需要对某些图片打水印,用到Python的PIL库,本文以Imaging-1.1.7为例,记录PIL库的源码编译/安装步骤。

PIL全称Python Image Library,它支持多种图片格式的处理,能为我们的应用程序代理强大的图像处理能力,如裁剪、旋转、打水印等。

官网下载v1.1.7版本源码并解压后,cd至解压目录,读README可知,若想在应用中处理jpeg图片,需要预先安装jpeg库,否则使用时会报错

1. 编译安装jpeg库
1.1 编译源码

jpeg库官网下载stable版本的jpeg源码(最新稳定版为v9a),解压源码的gz包,cd至解压目录,vi打开Makefile文件,修改2处:
1) 将prefix变量设置为jpeg库的安装目标路径
2) 在CFLAGS设置中追加-fPIC参数(关于PIC的作用,可通过man gcc了解或参见这里
注意:由于后面安装Imaging时,需要编译出一个_Imaging.so库文件,故这里必须设置-fPIC参数,否则Imaging编译时会报如下错误(想验证的话,可以试一试 -_-):

/usr/bin/ld: /home/slvher/python-2.7.5/3rd-lib-src/jpeg-6b/lib/libjpeg.a(jcparam.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/home/slvher/python-2.7.5/3rd-lib-src/jpeg-6b/lib/libjpeg.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1
1.2 install-lib
以-fPIC参数编译完jpeg源码后,执行如下命令:
make install
make install-lib
以上命令将编译好的jpeg库"安装"至由prefix指定的路径下(其实就是从源码目录cp文件至prefix目录)

2. 安装Imaging库
cd至Imaging-1.1.7,vi打开setup.py,修改文件:
1) 注释掉JPEG_ROOT = None
2) 增加JPEG_ROOT = libinclude("/home/slvher/python-2.7.5/3rd-lib-src/jpeg-6b"),保存退出并执行如下命令:
python setup.py build_ext -i
正常情况下,Imaging库编译会成功
然后执行如下命令即可将PIL库安装到python的site-packages目录下: 
python setup.py install

此后,应用程序就可以正常使用GIL库了

【参考资料】
1. PIL官网
2. PIL源码README文档

2015-08-18 13:25:35 Jarlen 阅读数 3827
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2031 人正在学习 去看看 贾志刚
  • 功能介绍

    1. 图片编辑(图片添加,文字添加),实现图片编辑中的图片添加,旋转,缩放,删除;文字的添加,大小缩放,字体更换,颜色更换,删除;

    2. 基本滤镜实现与接口封装; 涂鸦(画笔的样式,粗细,颜色,橡皮擦,贴图); 相框(简单相框,酷炫相框); 马赛就克(基本马赛克,酷炫马赛克,橡皮擦)及其接口封装 ;

    3. 图像剪切,旋转等功能实现测试接口封装; GIF与MP4,图片互转实现测试与接口封装;

  • 基本框架介绍

    • cn.ffmpeg
    • gif mp4 互转
    • com.js.photosdk.bodywarp
    • 图片变形
    • com.js.photosdk.crop
    • 图片剪切
    • com.js.photosdk.enhance
    • 图片增强,对比度,饱和度,亮度
    • com.js.photosdk.filter
    • 滤镜
    • com.js.photosdk.mosaic
    • 马赛克
    • com.js.photosdk.operate
    • 图片添加水印,添加文字
    • com.js.photosdk.photoframe
    • 添加相框
    • com.js.photosdk.scrawl
    • 涂鸦
    • com.js.photosdk.utils
    • 工具类
    • jp.co.cyberagent.android.gpuimage
    • 滤镜 library
    • jp.co.cyberagent.android.gpuimage.util
    • 滤镜 library

具体demo:

github

没有更多推荐了,返回首页