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 相关文章推荐
一个高ai的分页函数和一个url函数
Oct 09 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
PHP根据IP地址获取所在城市具体实现
Nov 27 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP连接和操作MySQL数据库基础教程
Sep 29 PHP
php实现过滤UBB代码的类
Mar 12 PHP
PHP5.3新特性小结
Feb 14 PHP
PHP的消息通信机制测试实例
Nov 10 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
PHP与Web页面的交互示例详解二
Aug 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实现二分查找算法代码分享
2011/06/24 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python计算回文数的方法
2015/03/11 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
2014年外联部工作总结
2014/11/17 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL