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+MYSQL的文章管理系统(一)
Oct 09 PHP
最令PHP初学者们头痛的十四个问题
Jan 15 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
php数字游戏 计算24算法
Jun 10 PHP
php5.3 注意事项说明
Jul 01 PHP
php生成QRcode实例
Sep 22 PHP
PHP递归复制、移动目录的自定义函数分享
Nov 18 PHP
PHP中的类型约束介绍
May 11 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
Jun 03 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 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错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
php中chdir()函数用法实例
2014/11/13 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
vue项目打包上传github并制作预览链接(pages)
2019/04/19 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Python中base64与xml取值结合问题
2019/12/22 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
出纳岗位职责模板
2013/11/27 职场文书
关于赌博的检讨书
2014/01/08 职场文书
科研先进个人典型材料
2014/01/31 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
《落花生》教学反思
2016/02/16 职场文书