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
基于数据库的在线人数,日访问量等统计
Oct 09 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
Apr 26 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 PHP
PHP+Ajax验证码验证用户登录
Jul 20 PHP
PHP实现的日历功能示例
Sep 01 PHP
php查询内存信息操作示例
May 09 PHP
php swoft框架实例用法
Dec 22 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
cmd下运行php脚本
2008/11/25 PHP
linux iconv方法的使用
2011/10/01 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
Web程序工作原理详解
2014/12/25 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
利用Python获取操作系统信息实例
2016/09/02 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Python 音频生成器的实现示例
2019/12/24 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
法律系毕业生自荐信范文
2014/03/27 职场文书
单位消防安全责任书
2014/07/23 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB