代码之家  ›  专栏  ›  技术社区  ›  markus

如何在PHP中选择对比度更高的图像?

  •  1
  • markus  · 技术社区  · 15 年前

    对于缩略图引擎,我想开发一种算法,从图像中提取X个随机缩略图(裁剪,不调整大小),分析它们的对比度,然后选择对比度最高的缩略图。我正在和php和imagick一起工作,但是我很高兴能得到一些关于如何计算图像对比度的一般提示。

    似乎许多事情比计算对比度更容易,例如计算颜色、计算亮度等。

    你对图片材料的分析有什么经验?

    2 回复  |  直到 15 年前
        1
  •  2
  •   mateusza    15 年前

    我会这样做(伪代码):

    L[256] = {0,0,0...}
    
    loop over each pixel:
        luminance = avg(R,G,B)
        increment L[luminance] by 1
    
    for i = 0 to 255:
        if L[i] < C: L[i] = 0       // C = threshold of your chose
    
    find index of first and last non-zero value of L[]
    contrast = last - first
    
        2
  •  1
  •   TMarshall    15 年前

    在查找“具有最高对比度”的图像时,您需要非常小心地定义图像的对比度。以最简单的方式,对比度是图像中最低强度和最高强度之间的差异。在你的情况下,这不会很有用。

    我建议您使用柱状图方法来描述给定图像的对比度,然后比较柱状图的属性,以确定定义时对比度最高的图像。您可以使用各种众所周知的容器来用代码表示柱状图,或者构造一个类来满足您的特定需求。(我不是暗示你需要以图表的形式创建一个柱状图,只是强度值的统计表示。)你可以直接使用每个柱状图的方差作为对比度的度量,或者使用标准差(如果这样更容易操作的话)。

    关键在于如何定义图像的对比度。一般来说,我会将高对比度图像定义为具有所有或几乎所有可能值的值的图像。我还要补充一点,在这个高对比度图像的定义中,图像的强度值趋向于均匀分布在可能值的范围内。

    使用这种方法,低对比度图像往往具有相对较少的离散强度值,并且它们往往被紧密地分组在一起,而不是均匀分布。(一般来说,它们也倾向于朝着范围的中心分组。)