php中使用Imagick实现图像直方图的实现代码


Posted in PHP onAugust 30, 2011

我并不打算详细解释专业名词,有兴趣的读者可以查阅文章结尾处的参考链接,那里有通俗易懂的解释:

我们先找一个例子图像(用Canon 550D拍的):
php中使用Imagick实现图像直方图的实现代码
例子图片:butterfly.jpg

下面看看如何使用Imagick实现图像直方图:

<?php 
$file = 'butterfly.jpg'; 
$size = array( 
'width' => 256, 
'height' => 100, 
); 
$image = new Imagick($file); 
$histogram = array_fill_keys(range(0, 255), 0); 
foreach ($image->getImageHistogram() as $pixel) { 
$rgb = $pixel->getColor(); 
$histogram[$rgb['r']] += $pixel->getColorCount(); 
$histogram[$rgb['g']] += $pixel->getColorCount(); 
$histogram[$rgb['b']] += $pixel->getColorCount(); 
} 
$max = max($histogram); 
$threshold = ($image->getImageWidth() * $image->getImageHeight()) / 256 * 12; 
if ($max > $threshold) { 
$max = $threshold; 
} 
$image = new Imagick(); 
$draw = new ImagickDraw(); 
$image->newImage($size['width'], $size['height'], 'white'); 
foreach ($histogram as $x => $count) { 
if ($count == 0) { 
continue; 
} 
$draw->setStrokeColor('black'); 
$height = min($count, $max) / $max * $size['height']; 
$draw->line($x, $size['height'], $x, $size['height'] - $height); 
$image->drawImage($draw); 
$draw->clear(); 
} 
$image->setImageFormat('png'); 
$image->writeImage('histogram.png'); 
?>

注:代码中之所以加入$threshold这个阀值,是因为有时候某些色阶的值可能会非常大,如果不做处理会干扰最终的生成效果。至于为什么要先除256,接着又乘12,没有什么道理可言,都是我一拍脑袋决定的,你也可以使用别的方法。

最终生成的直方图和Photoshop的效果基本一样,这里就贴一下Photoshop的:
php中使用Imagick实现图像直方图的实现代码
Photoshop生成的直方图
注:使用Photoshop打开图片后,选择窗口,然后选择直方图即可。
本文说的实际上只是RGB通道的直方图绘制方法,原理上,RGB直方图是红绿蓝直方图累加的结果,至于红绿蓝三原色各自的直方图,上面代码稍加修改即可。
注:XARG.ORG上有一个HTML5实现的图像直方图开源项目,效果不错,值得学习。
最后顺便说一下,如果你对摄影知识感兴趣,可参考:如何解读数码相机的直方图。

PHP 相关文章推荐
用PHP读注册表
Oct 09 PHP
PHP的FTP学习(四)
Oct 09 PHP
PHP的SQL注入过程分析
Jan 06 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 PHP
PHP+jquery实时显示网站在线人数的方法
Jan 04 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
May 14 PHP
PHP正确配置mysql(apache环境)
Aug 28 #PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 #PHP
PHP 时间日期操作实战
Aug 26 #PHP
PHP url 加密解密函数代码
Aug 26 #PHP
php图片上传存储源码并且可以预览
Aug 26 #PHP
PHP 无限分类三种方式 非函数的递归调用!
Aug 26 #PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 #PHP
You might like
PHP脚本的10个技巧(7)
2006/10/09 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
Python中的上下文管理器和with语句的使用
2018/04/17 Python
python程序 创建多线程过程详解
2019/09/23 Python
django框架两个使用模板实例
2019/12/11 Python
Python 如何在字符串中插入变量
2020/08/01 Python
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
小学三年级学生评语
2014/04/22 职场文书
书法大赛策划方案
2014/06/04 职场文书
同志主要表现材料
2014/08/21 职场文书
离婚协议书怎么写
2014/09/12 职场文书
县委务虚会发言材料
2014/10/20 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android