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的分页功能
Mar 21 PHP
PHP 上传文件大小限制
Jul 05 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
PHP获取photoshop写入图片文字信息的方法
Mar 31 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
php批量修改表结构实例
May 24 PHP
php中通用的excel导出方法实例
Dec 30 PHP
php依赖注入知识点详解
Sep 23 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
动态新闻发布的实现及其技巧
2006/10/09 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
jquery插件实现轮播图效果
2020/10/19 jQuery
Python的Flask框架与数据库连接的教程
2015/04/20 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
git进行版本控制心得详谈
2017/12/10 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
pytorch标签转onehot形式实例
2020/01/02 Python
Python requests模块session代码实例
2020/04/14 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
珍珠奶茶店创业计划书
2014/01/11 职场文书
成考报名单位证明范本
2014/01/16 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
商铺门面租房协议书
2014/10/21 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
JavaScript函数柯里化
2021/11/07 Javascript
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏