• PHP简单图形图像处理

    2017-10-07 00:35:21
    PHP简单图形图像处理引语php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF、PNG、JPEG、WBMP、XBM等。php还可以将图像流直接显示在浏览器中。要处理图像,就要用到php的GD库。ps:确保php.ini...

    PHP简单图形图像处理

    引语

    php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF、PNG、JPEG、WBMP、XBM等。

    php还可以将图像流直接显示在浏览器中。

    要处理图像,就要用到php的GD库。

    ps:确保php.ini文件中可以加载GD库。可以在php.ini文件中找到“;extension=php_gd2.dll”,将选项前的分号删除,保存,再重启Apache服务器即可。


    步骤

    在php中创建一个图像一般需要四个步骤:

    • 1.创建一个背景图像,以后的所有操作都是基于此背景。

    • 2.在图像上绘图等操作。

    • 3.输出最终图像。

    • 4.销毁内存中的图像资源。


    1.创建背景图像

    下面的函数可以返回一个图像标识符,代表了一个宽为x_size像素、高为y_size像素的背景,默认为黑色。

    resource imagecreatetruecolor(int x_size , int y_size)

    在图像上绘图需要两个步骤:首先需要选择颜色。通过imagecolorallocate()函数创建颜色对象。

    int imagecolorallocate(resource image, int red, int green, int blue)

    然后将颜色绘制到图像上。

    bool imagefill(resource image, int x, int y, int color)

    imagefill()函数会在image图像的坐标(x,y)处用color颜色进行填充。


    2.在图像上绘图

    bool iamgeline(resource image, int begin_x, int begin_y, int end_x, int end_y, int color)

    imageline()函数用color颜色在图像image中画出一条从(begin_x,begin_y)到(end_x,end_y)的线段。

    bool imagestring(resource image, int font, int begin_x, int begin_y, string s, int color )

    imagestring()函数用color颜色将字符串s画到图像image的(begin_x,begin_y)处(这是字符串的左上角坐标)。如果font等于1,2,3,4或5,则使用内置字体,同时数字代表字体的粗细。如果font字体不是内置的,则需要导入字体库后使用。


    3.输出最终图像

    创建图像以后就可以输出图形或者保存到文件中了,如果需要输出到浏览器中需要使用header()函数发送一个图形的报头“欺骗”浏览器,使它认为运行的php页面是一个图像。

    header(“Content-type: image/png”);

    发送数据报头以后,利用imagepng()函数输出图形。后面的filename可选,代表生成的图像文件的保存名称。

    bool image(resource image [, string filename])


    4.销毁相关的内存资源

    最后需要销毁图像占用的内存资源。

    bool imagedestroy(resource image)

    例子:

    
     <?php
        $width=300;                                          //图像宽度
        $height=200;                                         //图像高度
        $img=imagecreatetruecolor($width,$height);           //创建图像
        $white=imagecolorallocate($img,255,255,255);         //白色
        $black=imagecolorallocate($img,0,0,0);               //黑色
        $red=imagecolorallocate($img,255,0,0);               //红色
        $green=imagecolorallocate($img,0,255,0);             //绿色
        $blue=imagecolorallocate($img,0,0,255);              //蓝色
        imagefill($img,0,0,$white);                          //将背景设置为白色
        imageline($img,20,20,260,150,$red);                  //画出一条红色的线
        imagestring($img,5,50,50,"hello,world!!",$blue);     //显示蓝色的文字
        header("content-type: image/png");                   //输出图像的MIME类型
        imagepng($img);                                      //输出一个PNG图像数据
        imagedestroy($img);                                   //清空内存
      ?>
    展开全文
  • 图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越 精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理...

    图像处理之常见二值化方法汇总

    图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越

    精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满

    足大多数图像处理的需要。主要本文讨论的方法仅针对RGB色彩空间。

     

    方法一:

    该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的

    像素值设为0(黑色),值大于等于127的像素值设为255(白色)。该方法的好处是计算

    量少速度快。缺点更多首先阈值为127没有任何理由可以解释,其次完全不考虑图像的

    像素分布情况与像素值特征。可以说该方法是史最弱智的二值处理方法一点也不为过。

     

    方法二:

    最常见的二值处理方法是计算像素的平均值K,扫描图像的每个像素值如像素值大于K

    像素值设为255(白色),值小于等于K像素值设为0(黑色)。该方法相比方法一,阈值的

    选取稍微有点智商,可以解释。但是使用平均值作为二值化阈值同样有个致命的缺点,

    可能导致部分对象像素或者背景像素丢失。二值化结果不能真实反映源图像信息。

     

    方法三:

    使用直方图方法来寻找二值化阈值,直方图是图像的重要特质,直方图方法选择二值

    化阈值主要是发现图像的两个最高的峰,然后在阈值取值在两个峰之间的峰谷最低处。

    该方法相对前面两种方法而言稍微精准一点点。结果也更让人可以接受。

     

    方法四:http://en.wikipedia.org/wiki/Thresholding_(image_processing)

    使用近似一维Means方法寻找二值化阈值,该方法的大致步骤如下:

    1.      一个初始化阈值T,可以自己设置或者根据随机方法生成。

    2.      根据阈值图每个像素数据P(n,m)分为对象像素数据G1与背景像素数据G2。(n为

    行,m为列)

    3.      G1的平均值是m1, G2的平均值是m2

    4.      一个新的阈值T’ = (m1 + m2)/2

    5.      回到第二步,用新的阈值继续分像素数据为对象与北京像素数据,继续2~4步,

    直到计算出来的新阈值等于上一次阈值。

    前面三种在以前的博文中都有涉及,最后一种二值化方法的代码如下:

    package com.gloomyfish.filter.study;
    
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ThresholdBinaryFilter extends GrayFilter {
    
    	@Override
    	public BufferedImage filter(BufferedImage src, BufferedImage dest) {
    		int width = src.getWidth();
            int height = src.getHeight();
    
            if ( dest == null )
            	dest = createCompatibleDestImage( src, null );
    
            int[] inPixels = new int[width*height];
            int[] outPixels = new int[width*height];
            src = super.filter(src, null); // we need to create new one
            getRGB( src, 0, 0, width, height, inPixels );
            int index = 0;
            int means = getThreshold(inPixels, height, width);
            for(int row=0; row<height; row++) {
            	int ta = 0, tr = 0, tg = 0, tb = 0;
            	for(int col=0; col<width; col++) {
            		index = row * width + col;
            		ta = (inPixels[index] >> 24) & 0xff;
                    tr = (inPixels[index] >> 16) & 0xff;
                    tg = (inPixels[index] >> 8) & 0xff;
                    tb = inPixels[index] & 0xff;
                    if(tr > means) {
                    	tr = tg = tb = 255; //white
                    } else {
                    	tr = tg = tb = 0; // black
                    }
                    outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
            	}
            }
            setRGB( dest, 0, 0, width, height, outPixels );
            return dest;
    	}
    
    	private int getThreshold(int[] inPixels, int height, int width) {
    		// maybe this value can reduce the calculation consume; 
    		int inithreshold = 127;
    		int finalthreshold = 0;
    		int temp[] = new int[inPixels.length];
    		for(int index=0; index<inPixels.length; index++) {
    			temp[index] = (inPixels[index] >> 16) & 0xff;
    		}
    		List<Integer> sub1 = new ArrayList<Integer>();
    		List<Integer> sub2 = new ArrayList<Integer>();
    		int means1 = 0, means2 = 0;
    		while(finalthreshold != inithreshold) {
    			finalthreshold = inithreshold;
    			for(int i=0; i<temp.length; i++) {
    				if(temp[i] <= inithreshold) {
    					sub1.add(temp[i]);
    				} else {
    					sub2.add(temp[i]);
    				}
    			}
    			means1 = getMeans(sub1);
    			means2 = getMeans(sub2);
    			sub1.clear();
    			sub2.clear();
    			inithreshold = (means1 + means2) / 2;
    		}
    		long start = System.currentTimeMillis();
    		System.out.println("Final threshold  = " + finalthreshold);
    		long endTime = System.currentTimeMillis() - start;
    		System.out.println("Time consumes : " + endTime);
    		return finalthreshold;
    	}
    
    	private static int getMeans(List<Integer> data) {
    		int result = 0;
    		int size = data.size();
    		for(Integer i : data) {
    			result += i;
    		}
    		return (result/size);
    	}
    
    }
    

    效果如下:


    学习视频教程 - 《数字图像处理-二值图像分析》

    展开全文
  • 伴随着图像处理技术的发展,我们每天无时无刻都在接触着图像处理的一切,打开相机,设置美颜程度,伴随着快门键的按下,一张瘦脸磨皮的人像处理完成了。按下手机的解锁键,前置摄像头已经获取了你的人脸图像,并在你...

           伴随着图像处理技术的发展,我们每天无时无刻都在接触着图像处理的一切,打开相机,设置美颜程度,伴随着快门键的按下,一张瘦脸磨皮的人像处理完成了。按下手机的解锁键,前置摄像头已经获取了你的人脸图像,并在你的脸上打上了若干个点,与数据库的信息进行比对,一次人像比对完成了。车辆行驶到单位校园门口,你的车牌已经被切割成一个个字母、数字与汉字,随着栏杆的抬起,又一次图像处理完成了。伴随着图像处理的广泛应用以及目前人工智能在图像领域的应用,更多的图像处理技术爆发式的增长,也更多的人投入到了这个领域的研究。作为一名行业从业者,如何学好图像处理就显得甚为棘手。博主作为一名“半路出家”的图像处理入门者,在这里也给各位读者分享一下一直以来的一些思考,因为本人水平有限,不妥之处还望见谅。

    1、高山平顶上,尽是采樵翁。人人各怀刀斧意,未见山花映水红。        ——何权峰《眼界,决定你的世界》

            其实很多时候,我们都局限在自己的小平台里,沾沾自喜,而忽略了你身边技术的飞速发展,也许这种沉浸对于一些传统行业来说,淘汰一个人的速度是十几年甚至几十年,但是对于计算机领域来说,这一淘汰也许就是一瞬间,这也是为什么企业在招聘应届生事,一方面关注你的技能,但也非常关注你的学习能力(简单说就是你可以什么都不会,但你学的快不?但你愿意学不?),而这种学习能力往往是需要长时间培养锻炼的,举个例子:清华北大的学生永远不愁找不到工作,而去清华北大招聘的企业也往往最不看重你的专业,因为他们知道,这里有着国内学习能力最强的人。说的有点远了,回到刚刚的话题,其实给博主触动最深的还是看到了CSDN某大神的一篇博客《阿里巴巴(菜鸟) - 算法工程师(机器学习)提前批笔试面试总结》中面试环节面试官问的一个问题:介绍CVPR2018你最感兴趣一篇论文的工作?看到这里博主犹如当头一棒。自己也只是听说过CVPR,当然也会留意一些媒体的报道或者是推送,但是从来都没有认真的甚至说大致的浏览过每一年会议的文章内容甚至是会议目录。而自己也“井底之蛙”般的只能感叹自己也许将是接下来就被淘汰的那个。其实广一点说,我们的本科生或者研究生期间,可能你的实验室做的东西很low,亦或是你是一个“半路出家者”,或者我们的“出身”不是很好,这些都或多或少的会限制我们的眼界。但是我们自己不应该允许自己做那只“井底之蛙”,我们更应该关注或者说拥抱我们所处这个行业最新、最前沿的技术(比如2018CVPR的最佳论文《Taskonomy: Disentangling Task Transfer Learning》);关注我们这个领域的大牛(比如做计算机视觉我们一定绕不开李飞飞教授、做相机标定一定离不开张正友教授)。眼界决定我们的视野,这也是为什么很多顶尖的公司在招聘的时候一定会加上如下两条:1、所在实验室为国家重点实验室或者在国内顶尖的科研机构有过实习经历  2、在顶级会议发表过相关文章。会当凌绝顶,方能一览众山小!

    这里,博主附上计算机视觉领域的CCF推荐会议:计算机视觉及图像处理领域会议,CCF推荐(A类,B类,C类),感兴趣的读者可以选取和你研究课题相关的较高水平的会议关注查看。

    2、知其然与知其所以然。 ——《朱子语类》卷九《论知行》

            这里我们要说,很多人在从事图像处理工作的时候更多的是被动的被推着走,只知其然而不知其所以然,还是举个例子,我们都知道,图像处理的前期操作就是获取图像,而获取图像的一个重要途径就是通过相机获取图片,相机获取到的图片更多程度需要去标定矫正。好了,问题来了,很多人知道,我获取图像了,按照“前人所述”我需要进行相机标定,设置标定板、计算内外参数...一些列工作完成了,我们也得到了“前人所述”的内外参数,那接下来呢?我们怎么矫正呢?为什么要做矫正呢?不矫正对我的图像处理过程有什么影响呢?想必这个问题是很多读者没有考虑过的,博主也看了很多的博客,相机标定写内外参矩阵的大有人在,图像生动、推导详尽。但说获取这些参数只会该干什么的博客却是凤毛麟角。反观之,我们其实很多时候也都停留在这样的阶段,就是只知道,这个事情该这样,但是为什么要这样却知之甚少。

    3、一门科学,只有当它成功地运用数学时,才能达到真正完善的地步。  ——马克思

            其实博主本人也是一个讨厌数学且数学不好的人,但是越是从事图像处理工作越深,越发觉得数学的重要性。数学也许就像是你的导师,你很多时候很讨厌,但是却绕不开。图像处理时我们会发现,图像在计算机内其实就是一个个矩阵,图像的处理很多时候就是数学变换,比如去噪(数学上的均值或者中值处理),比如放大缩小图像(数学上的插值和采样)等等,这里我们还是举一个例子:从事图像处理的人应该大部分都知道(最起码听说过)SIFT特征点检测算法,这里不展开论述,我们只拿其中的一个关键部分来说,SIFT算法中有两种方法,分别是:

    a、使用LOG图像(高斯拉普拉斯变换图像):其步骤是:先将照片降采样,得到了不同分辨率下的图像金字塔。再对每层图像进行高斯卷积。这样一来,原本的图像金字塔每层只有一张图像,而卷积后,每层又增加了多张不同模糊程度下的照片。大概就是下图这样:

    b、使用(DOG图像):DOG即高斯差分。构造高斯差分图像的步骤是:在获得LOG图像后,用其相邻的图像进行相减,得到所有图像重新构造的金字塔就是DOG金字塔。大概就是下图这样子:

            好了,问题来了,这一数学上的改进,能有多大的差距呢?我们可以看到,就是这样一个“看似简单”的改进可以使我们的运算量小一个数量级!数学有多重要!

            也许上面的过程有一些读者没看明白,什么又是高斯卷积又是图像相减的,太麻烦,那我们再介绍一种非常“简单”的特征点检测算法(FAST) ,有多“简单”呢?这里先放一张图:

            为了让大家简单易懂,这里我们简单的说原理,可能与实际不相符,简单说,就是你要找特征点P,那我在p周边画个圈,设置一个阈值,如果有若干个点大于这一阈值,我们就理解为p是特征点(阈值为9就是FAST9,阈值为11就是FAST11)。惊不惊喜,意不意外,就是这么好理解,而且这一算法的速度快,效果也不差。其实这种方法博主更多的理解为是一种数学上的改进。而我们纵观众多划时代的文章、方法、算法,其实其本质大多为数学方法在各个领域上应用的改进。学好数理化,走遍天下都不怕,数学,可怕却重要! 

    4、如果我能看得更远一点的话,是因为我站在巨人的肩膀上。  ——牛顿

            伴随着计算机网络的发展,开源的趋势化(强调专利的微软收购了Github并主动开源了众多代码),我们可以找到更多的资源与资料(BaiDu,Google一键直达),一个个的开放图形库和开放图形软件(最常见的OpenGL、OpenCV),我们有着比以往任何时候更多的资源,也有着比以往人更多的机会接触到科技的最前沿(顶级会议大部分都是开源的,我们可以随意下载),这里博主特别强调,大胆的去使用这些工具,抱着书本往死里啃,问周边同学或老师有效,但这样的时代终将过去,信息交互的年代,每一个人都是一个信息源(有点像众包的概念),站在巨人肩膀上引领科技进步的人也许不是你我,但是你我可以更容易找到这个世界上的巨人在哪里了,我们的获取信息的渠道更多了,我们身边的信息源更多了(比如MOOC,我们可以倾听最好的老师讲课),这里说点题外话,推荐一部纪录片《互联网时代》,当时博主看的热血沸腾!回到主题,不主动拥抱这个时代的人一定会被时代所抛弃。能活到最后的人一定不是闭门造车的,一定是那个敢于攀登,寻找巨人的人。

    5、工欲善其事,必先利其器。  ——《论语·卫灵公》

    这里其实博主还是老生常谈的强调你的编程能力,我们都知道,一切的图像处理的最终实现都是程序,更是算法(硬件处理也有硬件程序、算法),而编程能力就好比士兵的枪、老师的粉笔。再好的想法如果不能付诸于一行行“冰冷”的算法最后都只能是镜中花、水中月。而选择哪门语言作为你的“枪”这里博主就不再赘述,直接放上之前写的一篇博客的内容:

    Python?JAVA?C/C++?
          其实实验室也会有一些师弟师妹问我这个问题,我该选一门什么语言呢?当然,我在这里不去评论哪门语言的优劣好坏,仅仅针对每一门语言在找工作时选择的机会跟大家做一些分享,首先,如果你需要找工作时自己能多一些机会和选择,那么仅仅会MATLAB或者Python可能还是远远不够的,毕竟找工作时需求量最大的依旧是JAVA\C\C++相关的工程师,如果你仅仅会MATLAB或者Pyrthon,那么你找工作时可能只能选择算法相关类的工作,而这类工作,我们都知道,和你竞争的往往都是一些大佬,算法岗也因为其相对的高工资和低劳动强度而成为近两年来淘汰人数最多的岗位之一。

          所以,这里强烈建议如果有可能,请抽出时间选择JAVA\C\C++其中一门语言进行系统化的学习(这里我们只谈最常见的,PHP,GO等语言博主没有学过,也没有具体了解,就不在这里献丑了),当然选择JAVA你还可以转向安卓开发,C\C++则更加偏底层一些。这一切的选择基础需要你综合衡量,博主特别讨厌一些鼓吹某某语言万能无敌之类的话,举个例子C++的确可以坐界面,但显然,做界面C++不是最好的选择,合适的才是最好的,不是么?

    6、你看江面平如镜,要看水底万丈深。  ——谚语

            我们很多人,其实也包括博主本人都有这个问题,就是用一个东西的时候想的不够深入,直至其表,不知其里,还是举个例子,我们每个人都应该知道的边缘检测算法,博主相信,用起来不难,网上搜一下代码,一搜一大片,有一定程序基础的人都可以轻松实现,但是深入思考,我们知道他的原理么?这里,博主将所有人分为几个等级,大家可以以边缘检测算法作为作为自己的对照,看看自己停留在哪个级别:

    a、还没入门的“行外汉”:什么是边缘检测算法?不会怎么办?问周边人吧!

    b、已经入门的“小菜鸟”:emm,好像有印象,去网上搜一下现成的程序,改一下图片输入就行了!

    c、有思考的“程序猿”:算法每一个参数什么意思啊?我改一下会怎样?

    d、负责任的“熟练工”:这个算法的原理究竟是什么样的?怎么就找到边缘了?找个博客看看!

    e、企业抢着要的“大牛”:算法原理我看懂了,自己手撕代码试一下!

    f、“大佬、科研工作者”:数学公式可能需要自己推一下,看能不能改进!

    看看,一个简单的边缘检测算法我们就可以看到不同人的不同水平,你的思维深度更多时候可以决定你的高度!

    7、思考可以构成一座桥,让我们通向新知识。 ——普朗克

          小时候爸爸妈妈就教会我们多问一问为什么,那时候最喜欢看的书也是《十万个为什么》,但是越长大越发现自己丧失了这种质疑和思考能力,我们更多时候的想法是“哪有那么多为什么!”。做项目,搞科研其实更多时候需要我们这种问问题的能力,就好比之前的例子:相机标定,为什么要标定?其实道理大家都懂,做到的却太少了,包括博主本人,这里写出这条大家共勉!

    8、亡羊补牢,犹未迟也。  ——《战国策·楚策四》

            可能很多人看到博主写了这么多会觉得可能自己再某个或者某些领域的欠缺有点大,有些失落甚至灰心丧气。其实博主需要在文章的最后和大家打打气,我们发现了问题和漏洞只要积极去改变,就会发现事情就会朝着好的方向发展。谁能想到《三体》作者刘慈欣若干年前还在水电站工作?又有谁能想到阿里云的头头是一个哲学博士呢?最后一句话赠与自己也赠与能看到这篇文章的读者们共勉:改变,从当下开始!

    展开全文
  • 各种图像处理

    2018-04-17 17:32:49
    python的图像处理库已有 8527 次阅读 2014-5-26 12:34 |个人分类:技术-方法|系统分类:科研笔记Matlab是一个商业软件,现在后悔一开始学习Matlab了。想慢慢转移到python平台,找找有哪些图像处理的库。1. ITK这是医学...
    python的图像处理库已有 8527 次阅读 2014-5-26 12:34 |个人分类:技术-方法|系统分类:科研笔记Matlab是一个商业软件,现在后悔一开始学习Matlab了。想慢慢转移到python平台,找找有哪些图像处理的库。1. ITK这是医学图像处理最流行的库了,虽然是使用C++语言编写的,但也提供了齐全的python绑定。在编译的时候,可以选择绑定python。这样就可以直接用python调用ITK函数了。在ubuntu里,源里面就有,直接安装即可。通过import itk即可载入ITK函数库。另外,为了进一步简化ITK的使用,最近出现了一个SimpleITK的项目。SimpleITK省略了模板的使用,更符合python的编程模式。SimpleITK目前正在开发,还缺少很多库函数,尤其是配准部分,因此,暂时还不能满足我的需求。2.
     PIL/Pillow试用了一下,感觉功能非常简单,而且是针对二维图片设计的,显然无法满足我们处理海量图像数据集的需要。结论:不能满足需求。官方网站:https://pypi.python.org/pypi/Pillow/2.4.0教程:http://pillow.readthedocs.org/en/latest/handbook/tutorial.html3. VIGRA针对多维图像数据集设计,而且有很强的并行能力。其中的数据结构可以在python和C++之间无缝转换!这个软件维护还比较活跃,最新版是13年11月。关键是有应用案例,处理的是海量的电镜成像神经元结构数据集,这点与我的职业发展方向吻合!展示的图片中显示了优美的三维结构,也表明软件处理结果可以完美地展现。缺点:缺乏配准功能模块。结论:值得深入研究。官方网站:http://ukoethe.github.io/vigra/#what介绍的pptvigra.pdf基于这个库,衍生出了一个软件ilastik官方网站:http://www.ilastik.org/index.php?cat=Home4.
     Medpy由著名的LOLI开发,满足海量高维图像处理的需求,其中核心的应用是图割分割。Medpy基于Python-ITK,属于ITK以上的高级库吧。另外,Medpy是一个很好的学习怎么用python玩转ITK的例子,可以看Medpy的代码来学习怎么用Python-ITK。主页,其中有ITK的编译和配置步骤(解决了一个ITK的bug)https://pypi.python.org/pypi/MedPy/0.1.0 5. openCVopenCV是计算机视觉领域的开源库,主要是处理视频的,因此,多维图像处理方面还不是特别适合。但是openCV的目标是实时的视频处理,因此,里面的函数计算速度都很快,可以用于二维图像的快速处理,而且有很多基本的函数,用于预处理和特征提取还是非常合适的。python-opencv可以直接在ubuntu源里面安装,调用方式是import
     cv2python-opencv官方教程这个教程虽然是对应opencv3的,但大部分内容对目前的2.X也适用(亲测可用)。http://docs.opencv.org/trunk/index.html6. IRTK (Image Registration toolkit)顾名思义,IRTK主要是用于配准的。作者并没有基于ITK,而是自己实现很多基本图像处理和配准的函数。根据作者的解释,这个工具包相对于ITK和SimpleITK的优点就是调用简单!如果是这样的话,学这个工具还不如学习更为通用的ITK了。官方网站http://www.doc.ic.ac.uk/~dr/software/python调用的方法http://www.doc.ic.ac.uk/~kpk09/irtk/#
     7. (Astronomical) Image Registration同样是基于python的,但主要是面对天文成像图片的。根据作者的描述,特点是可以适应对比度差异大的图像间配准。http://image-registration.readthedocs.org/en/latest/index.html 在2012年,一帮图像处理牛人搞了个会议,讨论并且推动大家从Matlab转到python平台,并且做了很好的总结。有很多文件可以从会议的网站下载到http://www.kitware.com/cvpr2012.htmlhttp://code.google.com/p/python-for-matlab-users/
     包括一个演讲的ppt,相当于做了个完整的综述tutorial_slides.pdf用python调用openCV的例子
    
    展开全文
  • Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大。《1、图像基本处理》《2、图像特效处理...

    Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大。

    《1、图像基本处理》
    《2、图像特效处理模块》
    《3、图像属性处理》
    《4、图形绘制》

    一、图像基本处理

    优点:

    • 缩略图的速度非常快,质量非常高

    • 支持智能剪裁

    • 很好的支持GIF图片

    • 5种缩略图模式

    • 图像对比功能

    • 图像高级过滤功能

    • 图像混合

    • 其他图像处理库支持的API基本都支持

    安装

    下载

    1、直接下载:

    Grafika的官网Github地址

    2、composer

    composer require kosinix/grafika:dev-master --prefer-dist

    环境需求

    • PHP >= 5.3,当然官方推荐php7

    • GD库 >= 2.0版本

    • Imagick最好(不强求)>=3.3.0 , ImageMagick >= 6.5.3

    部署

    下载下来的Grafika目录基本结构像下面这样:


    不过composer下载下来的多一点儿,你只需要使用kosinix/grafika目录下的东西就好了。

    我们在grafika目录下建立一个index.php,之后的操作都在这里。

    grafika给我们提供了一个非常好用的autoloader.php位于src目录下。

    index.php中引入它,(说明下,以下示例都需要引入这个autoloader.php文件,我们默认省略),下面就可以直接开发了。

    require_once 'src/autoloader.php';

    创建Editors

    1、createEditor

    grafika通过静态方法createEditor来创建一个editor。它包含所有的图片处理方法。

    由于,grafika是基于ImagickGD库,所以使用createEditor方法会根据当前情况,自动选择所需要的图片处理库。(推荐使用)

    use Grafika\Grafika; // Import package
    $editor = Grafika::createEditor(); // Create the best available editor

    2、Imagick Editor

    当然你也可以直接使用Imagick类库。

    use Grafika\Imagick\Editor; // Import package
    $editor = new Editor(); // Imagick editor

    注意:有些情况可能不支持该类库,你需要使用下面语句检查后使用,(不过你最好直接使用方法1,就没这些事)

    use Grafika\Imagick\Editor; // Import package
    $editor = new Editor(); // Imagick editor
    if( $editor->isAvailable() ) { // Safety check
    
        // Your code here
    
    }

    3、GD Editor

    你也可以直接使用GD库,也有些情况可能不支持,记得检查

    use Grafika\Gd\Editor; // Import package
    $editor = new Editor(); // Gd editor
    if( $editor->isAvailable() ) { // Safety check
    
        // Your code here
    
    }

    创建图像

    grafika允许你使用4种方式创建一个待处理的图像

    1、直接打开图像

    创建editor + open方法

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open( $image, 'path/to/image.jpg');

    2、使用静态方法打开图片

    使用直接打开、创建图片

    use Grafika\Grafika;
    $image = Grafika::createImage('path/to/image.jpg');
    
    // 这里省略了$editor = Grafika::createEditor();

    3、创建一个空白的画布

    新建一个画布作为新图像

    use Grafika\Grafika;
    $image = Grafika::createBlankImage(100,100);

    4、从已有图片拷贝一个

    拷贝一个图像作为图像处理

    $copy = clone $image;

    这种方法你要保证之前有一张图片

    这几种方法之后的操作大同小异,我们只选择第一种常规方法作为讲解示例

    图片缩略图

    我们先准备一个原图


    接下来,假设我们要创建的缩略图长:200px宽200px

    1、Resize Fit

    等比例缩放类型。那么就保证图片较长的一边不超过200px,等比缩放,缩放后不填充背景

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1
    $editor->resizeFit($image1 , 200 , 200);
    $editor->save($image1 , 'yanying1.jpg');
    
    $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2
    $editor->resizeFit($image2 , 200 , 200);
    $editor->save($image2 , 'yanying2.jpg');

    当然不要忘了第一行的require

          

    2、Resize Exact

    固定尺寸缩放类型。就是不管图片长宽比,全部缩小到200px,可能导致图片变形。

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1
    $editor->resizeExact($image1 , 200 , 200);
    $editor->save($image1 , 'yanying1.jpg');
    
    $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2
    $editor->resizeExact($image2 , 200 , 200);
    $editor->save($image2 , 'yanying2.jpg');
         

    3、Resize Fill

    居中剪裁。就是把较短的变缩放到200px,然后将长边的大于200px的部分居中剪裁掉,图片不会变形。

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1
    $editor->resizeFill($image1 , 200,200);
    $editor->save($image1 , 'yanying1.jpg');
    
    $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2
    $editor->resizeFill($image2 , 200,200);
    $editor->save($image2 , 'yanying2.jpg');
        

    4、Resize Exact Width

    等宽缩放。和第一种功能相似,最终宽为200px,等比缩放,高度不管。

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open($image1 , 'yanying.jpg'); // 打开yanying.jpg并且存放到$image1
    $editor->resizeExactWidth($image1 , 200);
    $editor->save($image1 , 'yanying1.jpg');
    
    $editor->open($image2 , 'yanying-h.jpg'); // 打开yanying.jpg并且存放到$image2
    $editor->resizeExactWidth($image2 , 200);
    $editor->save($image2 , 'yanying2.jpg');
          

    5、Resize Exact Height

    等高缩放。最终高为200px,等比缩放,不考虑图片宽度。

        

    图像对比功能

    1、图片相似度对比

    我们首先准备一张基本图,用来和其他图片对比。(segmentfault网页图片可能处理过,直接使用本文图片可能结果不一致)


    1、我们第一次使用一张灰度图片来比较

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $result = $editor->compare('yanying.jpg' , 'yanying_grey.jpg');
    var_dump($result); // int 2

    说明: grafika图片对比方法compare返回一个数字,其中如果数字越接近于0,那么表示图片越相似。如果数字在0-10范围内,那么图片都可能相似。但是如果数字大于10,那么,可能就完全不同。

    这里返回2,说明相似度还是非常高的。

    2、我们再用一张缩小的图片来测试,记住都是和第一张基本图比较。


    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $result = $editor->compare('yanying.jpg' , 'yanying-smaller.jpg');
    var_dump($result); // int 0

    这里结果返回0,相似度非常高。

    3、我们再用一张剪裁下来的局部图片测试


    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $result = $editor->compare('yanying.jpg' , 'yanying-half.jpg');
    var_dump($result); // int 20

    结果超过10了,相似度不怎么高

    4、我们再用一张完全不同的图片测试


    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $result = $editor->compare('yanying.jpg' , 'yanying-h.jpg');
    var_dump($result); // int 39

    结果39,越来越大,越来越不像

    2、比较图片是否相同

    grafika提供方法equal来检查两张图片是否完全相同。这里的检查是一个像素一个像素的检测,所以时间可能会较长。

    当然grafika也会预检查,如果两张图片大小不相同,则直接返回false。只有其他都相同后才会进行逐像素检查。

    我们这里对比之前创建的一张缩略图,因为大小不一致,所以直接返回false


    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $result = $editor->equal('yanying.jpg' , 'yanying-smaller.jpg');
    var_dump($result); // boolean false

    智能剪裁

    智能剪裁是自动识别图像中的重要部分,剪裁时候偏向于保留重点部分。

    不过grafika也提供了人为操控位置剪裁,我们先说这个。

    基本位置剪裁

    基本位置剪裁包含9个位置

    • top-left

    • top-center

    • top-right

    • center-left

    • center

    • center-right

    • bottom-left

    • bottom-center

    • bottom-right

    我们这里一起说了,这里我们使用900*600的图片,分成9块


    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    
    $src = 'yanying.jpg';
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'top-left' );
    $editor->save( $image, 'result1.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'top-center' );
    $editor->save( $image, 'result2.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'top-right' );
    $editor->save( $image, 'result3.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'center-left' );
    $editor->save( $image, 'result4.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'center' );
    $editor->save( $image, 'result5.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'center-right' );
    $editor->save( $image, 'result6.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'bottom-left' );
    $editor->save( $image, 'result7.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'bottom-center' );
    $editor->save( $image, 'result8.jpg' );
    $editor->free( $image );
    
    $editor->open( $image, $src );
    $editor->crop( $image, 300, 200, 'bottom-right' );
    $editor->save( $image, 'result9.jpg' );
    $editor->free( $image );

    看下结果


    智能剪裁

    原图


    我们使用智能剪裁将图片剪裁至200*200px

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open( $image, 'yanying-smaller.jpg' );
    $editor->crop( $image, 200, 200, 'smart' );
    $editor->save( $image, 'yanying-smart.jpg' );

    发现还是可以突出重点的


    GIF缩略图

    压缩GIF,不丢失动画

    grafika可以直接压缩GIF图片,并且不丢失动画功能。


    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open( $image, 'sample.gif' );
    $editor->resizeFit( $image, 250, 128 );
    $editor->save( $image, 'output.gif' );

    我们这里将原图压缩到原来的一半,发现动画并没有丢失


    移除GIF动画效果

    当然,如果有需要,我们也可以直接移除GIF的动画效果

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open( $image, 'sample.gif' );
    $editor->flatten( $image );
    $editor->save( $image, 'output-no-animation.gif' );

    图片合并

    图片合并需要2张图片,将其中一张作为基本图,准备的第二章图片就是放置在基础图片之上。

    我们首先来看代码

    use Grafika\Grafika;
    $editor = Grafika::createEditor();
    $editor->open($image1 , 'yanying-h.jpg');
    $editor->open($image2 , 'yanying-smaller.jpg');
    $editor->blend ( $image1, $image2 , 'normal', 0.9, 'center');
    $editor->save($image1,'333/yanying-blend.jpg');

    解释一下

    首先打开两张图片,其中$image1为基础图片,也就是放在下面的。重点在blend这个方法。

    其中

    • 第一个参数为基础图片

    • 第二个参数为放置在基础图片之上的图片normal, multiply, overlay or screen.,这里的类型意思就是图片叠加的模式,下面会给出实例看每种的不同。

    • 第三个参数为透明度,这个不说太多,容易想到。

    • 第四个为位置,有10个选择,其中,前面9种为用户自定义拜访位置,而最后一个是智能拜访,由grafika来判断摆放在哪里好。top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right and smart

    • 第五个参数为可选参数,表示图片2距离图片1左边的距离

    • 第六个参数也为可选参数,表示图片2距离图片1上边的距离

    我们试着摆几种情况。

    1、normal

    其中位置信息:center,透明度为0.9,也就是上面代码的那种


    2、multiply

    位置信息:,top-left,其他不变


    3、overlay

    位置信息:bottom-right,其他不变


    4、screen

    位置信息:,最后一个位置参数不给,也就是默认top-left


    图像旋转

    图像旋转比较简单,只需要给一个旋转角度参数就可以了,如果想要给背景填充个颜色,再给一个颜色参数即可。(默认不给背景色为黑色)

    代码如下

    use Grafika\Grafika;
    use Grafika\Color;
    $editor = Grafika::createEditor();
    $editor->open($image , 'yanying-smaller.jpg');
    $editor->rotate($image ,'45',new Color('#ff0000'));
    $editor->save($image,'333/yanying-rotate.jpg');

    最后一个背景颜色参数也是需要Color对象


    图片写文字

    在图片上面写文字的参数比较多,不过如果正常使用,只需要给前两个必填的即可,后面的参数都是可选的。

    我们逐一的来看各个参数

    • image:所需要写文字的图片

    • text:需要写的文字

    • size:(选填)字体大小,默认为12px

    • x:(选填)文字的最左边距离图片最左边的距离,默认为0

    • y:(选填)文字的基线到图片的最上边的距离,默认是12px,也就是文字的高度。(基线你就当做文字最下面好了)

    • color:(选填)字体颜色,Color对象,需要new Color一下,默认为黑色。

    • font:(选填)字体的完整路径,默认Sans font.

    • angle:(选填)文字旋转角度,取值范围为0-359,默认为0,也就是不旋转

    我们随便找个文字试试

    use Grafika\Grafika;
    use Grafika\Color;
    $editor = Grafika::createEditor();
    $editor->open($image , 'yanying-smaller.jpg');
    $editor->text($image ,'yanying',30,200,100,new Color("#000000"),'',45);
    $editor->save($image,'333/yanying-text.jpg');

    看下效果。这里说明下,如果文字为中文,需要找一个支持中文的字体。默认字体不支持中文,所以你写中文,就是都是小方框。


    苏喜武 PHP开发工程师

    感谢原作者.

    展开全文
  • 前言 GD 库是 PHP 处理图形的扩展库,GD 库提供了一系列用来处理图片的 API,使用 GD 库可以处理图片或者生成图片,还可以直接输入到浏览器中,也可以给图片...创建图像简单处理 下面,我们使用 GD 库提供的函数,...
  • 本文将介绍C/S模式的图像处理系统。C/S的框架已经在[1]中作了简单的介绍。[2]中介绍了如何搭建基于android和WAMP5的B/S模式的本机测试平台。本系统是在[4]中介绍的基础上开发的,有关图像显示和本地图像处理的框架...
  • (1)该工具简单易用,功能强大,且集成了weka. 还可以任意添加组件。  source:http://fiji.sc/wiki/index.php/About (2)该工具网站上还提供了一些图像处理数据集  ...
  • 图像处理___细化

    2012-11-17 09:37:21
     图像处理中物体的形状信息是十分重要的,为了便于描述和抽取图像特定区域的特征,对那些表示物体的区域通常需要采用细化算法处理,得到与原来物体区域形状近似的由简单的弧或曲线组成的图形,这些细线处于物体的...
  • 简单图像处理

    2013-04-03 12:21:05
    http://www.opencv.org.cn/index.php/OpenCV_%E7%BC%96%E7%A8%8B%E7%AE%80%E4%BB%8B%EF%BC%88%E7%9F%A9%E9%98%B5/%E5%9B%BE%E5%83%8F/%E8%A7%86%E9%A2%91%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%AF%BB%E5%86%99%E6%9
  • 几种图像处理类库的比较
  • 图像处理URL

    2016-04-26 14:07:05
    随笔分类 - 图像处理/图像增强等 图像增强; 图像复原; 图像重建; 图像分割; 图像特效; 图像匹配; 图像形态学处理; 图像几何处理; 图像正交变换; 人工智能; 跟踪; 图像处理之增强---图像模糊检测 ...
  • 也就是说,它实际提供的是各种图像处理算法。若需具体应用,需要组合其算法以实现某个功能。 OpenCV 的全称 Open Source Computer Vision Library,是一个基于BSD许可(开源)发行的跨平台计算机视觉库,又名 “开源...
  • 目前比较出名的图像处理库有很多,比如LEADTOOLS,这个是功能非常强大的图像多媒体库,但是这个是收费注册的。开源的图像库也有不少,比如:ImageStone、GIMP、CxImage等,虽然它们的功能没有LEADTOOLS强大,但是...
  • 定义:设函数y=f(x)在区间[a,b]上有定义,且已知在点a≤x0P(xi)=yi...有时,在图像的几何变换中,比如缩放和旋转,输出图像上的像素点坐标有可能对应于原图像上几个像素点之间的位置,这个时候就需要通过灰度插值处理
  • 图像处理实用资源

    2014-03-01 21:47:23
    图像处理实用资源本文转自:http://www.cnblogs.com/tornadomeet/archive/2012/05/24/2515980.html跟OpenCV相关的:http://opencv.org/2012年7月4日随着opencv2.4.2版本的发布,opencv更改了其最新的官方网站地址。...
  • 图像处理之滤波器

    2016-09-01 11:01:18
    图像处理之滤波器 ...由于我们组的项目和图像处理(运动物体检测与跟踪)有关,和我同组的iamfrankie同学将在FPGA方面对该项目发表一些好的博文,前段时间他的博文也受到各位的好评,其中不乏好的文章,
  • yuv格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式,而且自己造轮子工作量太大。因此通常都会将yuv转换为rgb,再用opencv等视觉库进行图像处理。 yuv转换为rgb有多种方法,比如公式法...
  • 在学习了一些图像处理知识之后,总结成了上一篇博文“图像处理之滤波器”(http://www.openhard.org/myspace/blog/show.php?id=76210),此文主要阐述了为什么要进行滤波和目前滤波方法的大致的分类,也说明了我的...
  • 二、 基于skimage数字图像处理 python数字图像处理(1):环境安装与配置 python数字图像处理(2):图像的读取、显示与保存 python数字图像处理(3):图像像素的访问与裁剪 python数字图像处理...
1 2 3 4 5 ... 20
收藏数 31,538
精华内容 12,615
关键字:

php简单图像处理