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 相关文章推荐
一个好用的分页函数
Nov 16 PHP
PHP 时间日期操作实战
Aug 26 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
PHP中的事务使用实例
May 26 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
PHP会话控制实例分析
Dec 24 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
swoole锁的机制代码实例讲解
Mar 04 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 __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
学习Python列表的基础知识汇总
2020/03/10 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
keras.layer.input()用法说明
2020/06/16 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
什么是SCM(软件配置管理)
2014/08/16 面试题
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
护士自荐信范文
2013/12/15 职场文书
党支部书记先进事迹
2014/01/17 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
肖申克救赎观后感
2015/06/02 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
Java spring定时任务详解
2021/10/05 Java/Android