我不打算详细解释专业术语。感兴趣的读者可以参考文末的参考链接,里面有一个通俗易懂的解释:我们先找一个示例图片(用佳能550D拍摄):。
例:butterfly.jpg我们来看看如何用Imagick实现图像直方图:复制代码如下:php $file='蝶形. jpg ';$size=array('width'=256,' height'=100,);$ image=new Imagick($ file);$直方图=array_fill_keys(范围(0,255),0);foreach($ image-getimage直方图())作为$ pixel){ $ RGB=$ pixel-getColor();$直方图[$ RGB[' r ']]=$ pixel-getColorCount();$直方图[$ RGB[' g ']]=$ pixel-getColorCount();$直方图[$ RGB[' b ']]=$ pixel-getColorCount();} $ max=max($直方图);$ 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($直方图为$ x=$ count){ if($ count==0){ continue;} $draw-setStrokeColor('黑色');$height=min($count,$ max)/$ max * $ size[' height '];$draw-line($x,$size['height'],$x,$ size[' height ']-$ height);$ image-draw image($ draw);$ draw-clear();} $ image-setImageFormat(' png ');$image-writeImage('直方图. png ');注意:之所以在代码中加入$threshold的阈值,是因为有些色阶的值有时候可能会很大,如果不处理,最终的生成效果会受到干扰。至于为什么要先除以256再乘以12,没有任何意义。都是拍我脑袋决定的。您也可以使用其他方法。最终的直方图和Photoshop的基本一致。这里请贴Photoshop的:。
Photoshop生成的直方图注意:用Photoshop打开图片后,选择窗口,然后选择直方图。其实本文只讲了RGB通道的直方图绘制方法。原则上,RGB直方图是红、绿、蓝直方图累加的结果。至于红色、绿色和蓝色的直方图,上面的代码可以稍微修改一下。注:XARG.ORG上有一个HTML5实现的图像直方图开源项目,很有效,值得学习。顺便说一下,如果你对摄影感兴趣,请参考:如何解读数码相机的直方图。