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 日常开发小技巧
Sep 23 PHP
php 一元分词算法
Nov 30 PHP
PHP simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
PHP生成Gif图片验证码
Oct 27 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
PHP图片处理之图片旋转和图片翻转实例
Nov 19 PHP
php中的登陆login实例代码
Jun 20 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
gearman中任务的优先级和返回状态实例分析
Feb 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
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
jquery对table做排序操作的实例演示
2017/08/10 jQuery
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python 列表list使用介绍
2014/11/30 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
django序列化serializers过程解析
2019/12/14 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
Python通过文本和图片生成词云图
2020/05/21 Python
详解python如何引用包package
2020/06/07 Python
python调用摄像头的示例代码
2020/09/28 Python
浅析Python的命名空间与作用域
2020/11/25 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
公司总经理工作职责管理办法
2014/02/28 职场文书
灰雀教学反思
2014/04/28 职场文书
社区维稳工作方案
2014/06/06 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL