在PHP中使用imagick图片直方图的实现代码

我不打算详细解释专业名词。感兴趣的读者可以查找文章结尾处的参考链接,其中有一个易于理解的解释:

让我们用一个例子形象开始(与佳能550D):
butterfly.jpg实例图片:

下面来看看如何使用imagick实现图像的直方图:
复制代码代码如下所示:
< PHP
文件大小= 'butterfly .jpg;
尺寸=数组(
宽度> = 256,
高度=100,
);
图像=新imagick美元(文件);
$直方图= array_fill_keys(范围(0, 255),0);
foreach($图像-> getimagehistogram()为像素){
RGB像素=美元美元->色鬼();
($ { $ RGB直方图} } { R = $像素-> getcolorcount);
($ { $ RGB直方图{一} } =美元的像素-> getcolorcount);
($ { $ RGB直方图{ B } } = $像素-> getcolorcount);
}
$ max = max(直方图);
$阈值=(图像-> getimagewidth美元(美元)*图像-> getimageheight())/ 256 * 12;
如果($ max $ $阈值){
$ max = $阈值;
}
图像=新imagick(美元);
画=新imagickdraw(美元);
图像->新美元($大小{ 'width},{大小'height美元},白色);
foreach(美元美元美元计数直方图x){
如果($ = 0){
继续;
}
为绘制-> setstrokecolor();
高度= min(美元美元美元计数,最大值)/美元美元'height的大小最大* { };
为绘制->线(X美元,美元'height大小{},X元,大小'height'} {美元美元的高度);
$图像-> DrawImage(合画);
画出来;
}
$图像-> setimageformat('png);
$图像-> writeimage('histogram。png);
>

注:阈值是阈值进入代码,因为有时颜色值可能非常大,如果不处理会干扰最后结果的产生。至于为什么256,然后12,没有理由说,这是我的头决定,你可以用其他方法。

最终的直方图和PS图象处理软件的结果基本上是相同的,这是PS图象处理软件:
由PS图象处理软件直方图
注意:使用PS图象处理软件打开图片后,选择窗口,然后选择直方图。
这说明,其实只有RGB通道直方图的绘制方法,原理上,RGB直方图是RGB直方图累加的结果,至于每个基色的三基色,上述代码可以稍加修改。
注:在xarg.org,有HTML5实现的开源项目图像的直方图,效果好,值得学习。
最后,顺便说一下,如果你对摄影感兴趣,你可以参考如何读取数码相机的直方图。