Javascript 创建色调直方图需要哪些值?

Javascript 创建色调直方图需要哪些值?,javascript,d3.js,Javascript,D3.js,我有一大堆照片。我想为它们创建一个色调直方图,如本文所示: 这样做的最佳方式是什么?我需要从我的一组图像中获得哪些值?博客作者正在使用,这就足以满足您的应用程序。您可以使用页面上的“查看源代码”查看作者使用的代码源代码(从第361行开始)。你也许可以通过看这个来了解作者是如何做到的 您可以将其与画布组合使用,以获得图像的“平均颜色”。就是这样一个链接 然而,一个更优雅的解决方案;将从服务器提供“平均颜色”(或您计划执行的任何操作),然后可以将其存储在您选择的数据库中。博客作者正在使用的,这就足以

我有一大堆照片。我想为它们创建一个色调直方图,如本文所示:


这样做的最佳方式是什么?我需要从我的一组图像中获得哪些值?

博客作者正在使用,这就足以满足您的应用程序。您可以使用页面上的“查看源代码”查看作者使用的代码源代码(从第361行开始)。你也许可以通过看这个来了解作者是如何做到的

您可以将其与
画布
组合使用,以获得图像的“平均颜色”。就是这样一个链接


然而,一个更优雅的解决方案;将从服务器提供“平均颜色”(或您计划执行的任何操作),然后可以将其存储在您选择的数据库中。

博客作者正在使用的,这就足以满足您的应用程序。您可以使用页面上的“查看源代码”查看作者使用的代码源代码(从第361行开始)。你也许可以通过看这个来了解作者是如何做到的

您可以将其与
画布
组合使用,以获得图像的“平均颜色”。就是这样一个链接

然而,一个更优雅的解决方案;将从服务器提供“平均颜色”(或您计划执行的任何操作),然后可以将其存储在您选择的数据库中。

来自博客文章

  • 获取所有图像
  • 对于每个图像,获取其中每个像素的色调值(因此100px x 200px的图像将提供20000个这样的色调数据点)
  • 获取每个色调值的像素计数(将有360个不同的色调值)
  • 整合所有图像的计数,最终得到如下结果
  • 画一个圆圈,给每条径向线一个长度=第二列的缩放值(使用
    d3.scale
    )和与色调对应的颜色(可以使用
    d3.hsl

    从数据的角度来看,您必须了解如何从图像中获取H值。一个好的起点是


    这里有一种生成圆的方法(一旦有了数据)

    //示例数据-索引指示色调值(0-360),该值是像素数
    var数据=[]
    对于(var i=0;i来自博客文章

  • 获取所有图像
  • 对于每个图像,获取其中每个像素的色调值(因此100px x 200px的图像将提供20000个这样的色调数据点)
  • 获取每个色调值的像素计数(将有360个不同的色调值)
  • 整合所有图像的计数,最终得到如下结果
  • 画一个圆圈,给每条径向线一个长度=第二列的缩放值(使用
    d3.scale
    )和与色调对应的颜色(可以使用
    d3.hsl

    从数据的角度来看,您必须找出如何从图像中获取H值


    这里有一种生成圆的方法(一旦有了数据)

    //示例数据-索引指示色调值(0-360),该值是像素数
    var数据=[]
    
    对于(var i=0;i我将执行以下步骤:

  • 编写一个命令行脚本,使用ImageMagick从图像中提取最常用的颜色:
    convert forr.jpg-colors 1-unique colors txt:-
  • 将输出解析为您喜欢的格式,并创建一个包含每行颜色的简单文件。(为方便起见,您可以生成JSON)
  • 将数据集简化为调色板。有很多方法可以做到这一点,例如,看看这个问题:
  • 一旦你在想要的分布中有了什么颜色,就很容易在你选择的表现中画一张图表

  • 我会采取以下步骤:

  • 编写一个命令行脚本,使用ImageMagick从图像中提取最常用的颜色:
    convert forr.jpg-colors 1-unique colors txt:-
  • 将输出解析为您喜欢的格式,并创建一个包含每行颜色的简单文件。(为方便起见,您可以生成JSON)
  • 将数据集简化为调色板。有很多方法可以做到这一点,例如,看看这个问题:
  • 一旦你在想要的分布中有了什么颜色,就很容易在你选择的表现中画一张图表

  • 你没有说你使用的是什么平台,但让我们假设它是OSX或Linux——如果必须的话,你可以根据Windows来调整

    首先,我将使用ImageMagick获得图像中的色调,如下所示:

    convert image.png -colorspace hsl -separate -delete 1,2 -depth 8 txt: | more
    
    # ImageMagick pixel enumeration: 360,40,255,gray
    0,0: (0,0,0)  #000000  gray(0)
    1,0: (0,0,0)  #000000  gray(0)
    2,0: (0,0,0)  #000000  gray(0)
    3,0: (0,0,0)  #000000  gray(0)
    4,0: (0,0,0)  #000000  gray(0)
    5,0: (0,0,0)  #000000  gray(0)
    6,0: (0,0,0)  #000000  gray(0)
    ...
    ...
    42,0: (0,0,0)  #000000  gray(0)
    43,0: (0,0,0)  #000000  gray(0)
    44,0: (0,0,0)  #000000  gray(0)
    45,0: (85,85,85)  #555555  gray(85)
    46,0: (85,85,85)  #555555  gray(85)
    47,0: (85,85,85)  #555555  gray(85)
    48,0: (85,85,85)  #555555  gray(85)
    49,0: (85,85,85)  #555555  gray(85)
    50,0: (85,85,85)  #555555  gray(85)
    51,0: (85,85,85)  #555555  gray(85)
    52,0: (85,85,85)  #555555  gray(85)
    53,0: (85,85,85)  #555555  gray(85)
    
    for f in *.png; do
       convert "$f" -colorspace hsl -separate -delete 1,2 -depth 8 txt:
    done | grep -Po "(?<=\()(\d+)(?=\))"
    0
    0
    0
    ...
    85
    85 
    85
    
    ... grep -Po ...  | awk '
       BEGIN{for(i=0;i<=255;i++)hist[i]=0}
       {hist[$1]++}
       END{for(i=0;i<=255;i++)print i,hist[i]}'
    
    
    
    0 1985
    1 3957
    2 3857
    3 3958
    4 3951
    5 3737
    6 3842
    7 3925
    8 3838
    ...
    ...
    253 3842
    254 4035
    255 1945
    
    该命令将图像转换为
    HSL
    颜色空间,并将其分为3个通道,即
    色调
    饱和度
    亮度
    。然后删除最后两个通道,只保留
    色调

    你可以看到每像素有一行,这幅图中的两种色调是0和85。每行的前两个字段是像素坐标,但你不在乎

    现在,您可以像这样对文件夹中的所有图像执行此操作

    for f in *.png; do
       convert "$f" -colorspace hsl -separate -delete 1,2 -depth 8 txt:
    done
    
    通过
    grep
    过滤掉所有坐标、括号和十六进制垃圾,如下所示:

    convert image.png -colorspace hsl -separate -delete 1,2 -depth 8 txt: | more
    
    # ImageMagick pixel enumeration: 360,40,255,gray
    0,0: (0,0,0)  #000000  gray(0)
    1,0: (0,0,0)  #000000  gray(0)
    2,0: (0,0,0)  #000000  gray(0)
    3,0: (0,0,0)  #000000  gray(0)
    4,0: (0,0,0)  #000000  gray(0)
    5,0: (0,0,0)  #000000  gray(0)
    6,0: (0,0,0)  #000000  gray(0)
    ...
    ...
    42,0: (0,0,0)  #000000  gray(0)
    43,0: (0,0,0)  #000000  gray(0)
    44,0: (0,0,0)  #000000  gray(0)
    45,0: (85,85,85)  #555555  gray(85)
    46,0: (85,85,85)  #555555  gray(85)
    47,0: (85,85,85)  #555555  gray(85)
    48,0: (85,85,85)  #555555  gray(85)
    49,0: (85,85,85)  #555555  gray(85)
    50,0: (85,85,85)  #555555  gray(85)
    51,0: (85,85,85)  #555555  gray(85)
    52,0: (85,85,85)  #555555  gray(85)
    53,0: (85,85,85)  #555555  gray(85)
    
    for f in *.png; do
       convert "$f" -colorspace hsl -separate -delete 1,2 -depth 8 txt:
    done | grep -Po "(?<=\()(\d+)(?=\))"
    0
    0
    0
    ...
    85
    85 
    85
    
    ... grep -Po ...  | awk '
       BEGIN{for(i=0;i<=255;i++)hist[i]=0}
       {hist[$1]++}
       END{for(i=0;i<=255;i++)print i,hist[i]}'
    
    
    
    0 1985
    1 3957
    2 3857
    3 3958
    4 3951
    5 3737
    6 3842
    7 3925
    8 3838
    ...
    ...
    253 3842
    254 4035
    255 1945
    
    然后使用
    gnuplot
    进行绘图。因此,如果将上一个命令的输出重定向到名为
    hist.dat
    的文件,并将以下
    gnuplot
    命令保存到名为
    plot.cmd

    set terminal png size 1000,1000
    set output 'result.png'
    set style fill solid
    set title "Hue Histogram"
    set xlabel "Hue"
    set ylabel "Frequency"
    set xrange [0:255]
    plot "hist.dat" using 2 with boxes
    
    然后可以使用此命令将其打印到名为
    result.PNG
    的PNG文件中

    gnuplot plot.cmd
    
    给你这个:

    如果你的图像很大,上面的操作会很慢,所以你可以选择用二进制格式,然后在
    C
    中编写一个小的直方图程序

    for f in *.png; do
       convert "$f" -colorspace hsl -separate -delete 1,2 -depth 8 gray:"$f.gray"
    done
    
    然后,您将拥有所有文件的第二份副本,每个文件都具有原始名称和扩展名
    .gray
    ,以及