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 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
PHP排序之二维数组的按照字母排序实现代码
Aug 13 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
PHP实现的迷你漂流瓶
Jul 29 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
一段实用的php验证码函数
May 19 PHP
php中Redis的应用--消息传递
Mar 28 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
统计PHP目录中的文件数方法
Mar 05 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 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中创建和调用webservice接口示例
2014/07/25 PHP
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
Django中提示消息messages的设置方式
2019/11/15 Python
Python过滤序列元素的方法
2020/07/31 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
理货员的岗位职责
2013/11/23 职场文书
财产公证书样本
2014/04/04 职场文书
员工考核评语大全
2014/04/26 职场文书
医德医风自我评价
2014/09/19 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
学校德育工作总结2015
2015/05/11 职场文书
小学远程教育工作总结
2015/08/13 职场文书
公司岗位说明书
2015/10/08 职场文书