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会员权限控制实现原理分析
May 29 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
浅析php适配器模式(Adapter)
Nov 25 PHP
PHP实现的简单缓存类
Jul 29 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP中cookie知识点学习
May 06 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 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实现选择排序的解决方法
2013/05/04 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
强制设为首页代码
2006/06/19 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
python openpyxl模块的使用详解
2021/02/25 Python
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
学雷锋志愿者活动总结
2014/06/27 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
承租经营合作者协议书
2014/10/01 职场文书
2014年度安全工作总结
2014/12/04 职场文书
话题作文之诚信
2019/11/28 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android