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 相关文章推荐
最省空间的计数器
Oct 09 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
php中stream(流)的用法
Mar 25 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
[原创]PHP简单开启curl的方法(测试可行)
Jan 11 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP中命名空间的使用例子
Mar 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
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
JavaScript正则表达式和级联效果
2017/09/14 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
讲解Python中的标识运算符
2015/05/14 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
Python中GIL的使用详解
2018/10/03 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
python中的itertools的使用详解
2020/01/13 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
心得体会范文
2014/01/04 职场文书
医学求职信
2014/05/28 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
委托书范本格式
2019/04/18 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
解析python中的jsonpath 提取器
2022/01/18 Python
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫