Imagemagick 如何找到最亮的像素?

Imagemagick 如何找到最亮的像素?,imagemagick,Imagemagick,如何找到图像中最亮像素的亮度(即HSV中的V) 我收集了大量的图像,这些图像将用作背景资源。为了确保没有可能分散观众注意力的亮点,我想找到所有最亮像素超过某个阈值的图像,以便对其进行重新处理 是否有Imagemagick操作来执行此操作?IM中的HSV颜色空间称为HSB,因此您可以通过这种方式获得image.jpg的直方图: convert image.jpg -colorspace HSB -format %c histogram:info:- 您需要根据第三列(=亮度)对输出进行反向排序,

如何找到图像中最亮像素的亮度(即HSV中的V)

我收集了大量的图像,这些图像将用作背景资源。为了确保没有可能分散观众注意力的亮点,我想找到所有最亮像素超过某个阈值的图像,以便对其进行重新处理


是否有Imagemagick操作来执行此操作?

IM中的HSV颜色空间称为HSB,因此您可以通过这种方式获得image.jpg的直方图:

convert image.jpg -colorspace HSB -format %c histogram:info:-
您需要根据第三列(=亮度)对输出进行反向排序,然后选择第一行,可以这样实现(对于以下情况,我假设Linux为操作系统):

下一步是过滤亮度值本身。让我们使用
sed
并注意alpha通道:

sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/'
(这将从hsb或hsba括号中取出第三个数字,即最亮像素亮度的百分比值。)

综上所述,我们可以编写这样一个小脚本
bChecker.sh
来检查png和jpg文件:

#/bin/bash
Threshold=${1-75}
echo checking threshold $Threshold%

find . -name "*.png" -o -name "*.jpg" | while read pic; do
    Val=$(convert "$pic" -colorspace HSB -format %c histogram:info:- | \
         sort -t',' -gr -k 3 | head -1 | \
         sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/')
    (( $(echo "$Threshold < $Val" | bc) )) && echo "$pic: brightness exceeds threshold ($Val%)"
done
#/bin/bash
阈值=${1-75}
回声检查阈值$threshold%
找到-读取图片时,命名为“*.png”-o-命名为“*.jpg”;做
Val=$(转换“$pic”-颜色空间HSB-格式%c直方图:信息:-|\
排序-t','-gr-K3 |头-1 |\
sed的/*hsb.*、.*、\([0-9.]*\)%.*/\1/)
($(echo“$阈值<$Val”| bc))&echo“$pic:亮度超过阈值($Val%)”
完成

在图像名为
bash bChecker.sh 80的目录中调用,此脚本显示亮度超过80%的所有图像。

IM中的HSV颜色空间称为HSB,因此您可以通过这种方式获得image.jpg的直方图:

convert image.jpg -colorspace HSB -format %c histogram:info:-
您需要根据第三列(=亮度)对输出进行反向排序,然后选择第一行,可以这样实现(对于以下情况,我假设Linux为操作系统):

下一步是过滤亮度值本身。让我们使用
sed
并注意alpha通道:

sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/'
(这将从hsb或hsba括号中取出第三个数字,即最亮像素亮度的百分比值。)

综上所述,我们可以编写这样一个小脚本
bChecker.sh
来检查png和jpg文件:

#/bin/bash
Threshold=${1-75}
echo checking threshold $Threshold%

find . -name "*.png" -o -name "*.jpg" | while read pic; do
    Val=$(convert "$pic" -colorspace HSB -format %c histogram:info:- | \
         sort -t',' -gr -k 3 | head -1 | \
         sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/')
    (( $(echo "$Threshold < $Val" | bc) )) && echo "$pic: brightness exceeds threshold ($Val%)"
done
#/bin/bash
阈值=${1-75}
回声检查阈值$threshold%
找到-读取图片时,命名为“*.png”-o-命名为“*.jpg”;做
Val=$(转换“$pic”-颜色空间HSB-格式%c直方图:信息:-|\
排序-t','-gr-K3 |头-1 |\
sed的/*hsb.*、.*、\([0-9.]*\)%.*/\1/)
($(echo“$阈值<$Val”| bc))&echo“$pic:亮度超过阈值($Val%)”
完成

在图像名为
bash bChecker.sh 80的目录中调用,此脚本显示亮度超过80%的所有图像。

最终答案

不知道我周末在想什么。您可以在一个步骤中获得如下所示的最大强度:

convert input.jpg -colorspace HSB -separate -delete 0,1 -format "%[max]" info:
输出值将在0-65535范围内,因此,如果您想知道是否有比(比如)80%更亮的像素,则需要测试大于52000左右的值。这假设您的量化为16位,即当您执行
identifite-version
时,它会显示
Q16

更新的答案

好的,现在回到电脑前。我认为我下面的第二个建议对您的用例有更多的好处。你问这个问题的方式误导了我,使我相信你想找到最亮像素的位置,而不是简单地知道它有多亮。无论如何

让我们从这样的图像开始:

convert -size 500x100 gradient:black-"rgb(204,204,204)" input.jpg
convert input.jpg -colorspace HSB -separate -delete 0,1 -threshold 70% -format "%[mean]" info:
8519.55

convert input.jpg -colorspace HSB -separate -delete 0,1 -threshold 75% -format "%[mean]" info:
4587.45

convert input.jpg -colorspace HSB -separate -delete 0,1 -threshold 80% -format "%[mean]" info:
0
从黑色变为80%白色,即204/255=80%

如果我们现在像这样转换成HSB和70%的阈值,我们得到了这个(我在它周围放了一个人造的红色边框,这样你可以看到白色区域的范围):

如果我再次这样做,并且阈值为75%,像这样,您会得到:

如果我将阈值设置为80%:

如果我看70%、75%和80%图像的平均像素,如下所示:

convert -size 500x100 gradient:black-"rgb(204,204,204)" input.jpg
convert input.jpg -colorspace HSB -separate -delete 0,1 -threshold 70% -format "%[mean]" info:
8519.55

convert input.jpg -colorspace HSB -separate -delete 0,1 -threshold 75% -format "%[mean]" info:
4587.45

convert input.jpg -colorspace HSB -separate -delete 0,1 -threshold 80% -format "%[mean]" info:
0
你可以看到,当没有像素超过80%的亮度阈值时,平均值变为零——希望这正是你想要的

先前的答案

我对它进行了测试,我意识到我忽略了
-verbose
标志以获取统计数据输出,因此如果您这样运行它,它应该可以做到:

convert image.jpg -colorspace HSL -separate -delete 0,1 -threshold 80% -verbose info: | grep -i "max"
它实际上做什么?它将图像转换为HSL颜色空间,然后分离出三个通道-色调、饱和度和亮度。然后删除H&S通道,只留下亮度。然后,它将亮度低于80%的所有像素设置为零(全黑),将亮度超过80%的所有像素设置为一(全白)。然后查看亮度通道中的最大像素,如果所有像素都低于80%阈值,则最大像素将为0。如果任何像素超过80%阈值,则最大像素将为1

原始答案

我离一台带有ImageMagick的机器很远,但我相信我以前运行过以下命令来查找最小像素,我猜它可以调整:

identify -precision 5 -define identify:locate=minimum -define identify:limit=3 image.jpg
文件是

另一个选择是转换到HSB颜色空间,分离通道,放弃色调和饱和度,只保留亮度。现在设定阈值,比如说80%,那么阈值以下的所有东西都变成零(黑色),80%以上的所有东西都变成白色。现在检查平均或最大像素,如果它不为零,则存在高于阈值的值。未经测试,因为我仍然远离计算机:

convert image.jpg -colorspace HSB -separate -delete 0,1 -threshold 80% info: | grep -Ei "mean|max"

最终答案

不知道我周末在想什么。您可以在一个步骤中获得如下所示的最大强度:

convert input.jpg -colorspace HSB -separate -delete 0,1 -format "%[max]" info:
输出值将在0-65535范围内,因此如果您想知道是否存在