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