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数学运算
Dec 30 PHP
APACHE的AcceptPathInfo指令使用介绍
Jan 18 PHP
深入php处理整数函数的详解
Jun 09 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
使用laravel指定日志文件记录任意日志
Oct 17 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微信公众号js-sdk开发应用
2016/11/28 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
简单的js计算器实现
2016/10/26 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
ES7之Async/await的使用详解
2019/03/28 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
Python装饰器用法实例总结
2018/02/07 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
Python中的Cookie模块如何使用
2020/06/04 Python
python 19个值得学习的编程技巧
2020/08/15 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
主题党日活动总结
2014/07/08 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
大学生党性分析材料
2014/12/19 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
工程质检员岗位职责
2015/04/08 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
如何用JavaScipt测网速
2021/05/09 Javascript
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫