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实现框架(二)
Oct 09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
详解Window7 下开发php扩展
Dec 31 PHP
功能强大的php文件上传类
Aug 29 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
Python3学习urllib的使用方法示例
2017/11/29 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
浅析python协程相关概念
2018/01/20 Python
Python3中的json模块使用详解
2018/05/05 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python 下载及安装详细步骤
2019/11/04 Python
pygame实现弹球游戏
2020/04/14 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
公司离职证明标准格式
2014/11/18 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
倡议书的格式写法
2015/04/28 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书