首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到最亮的像素?

如何找到最亮的像素?
EN

Stack Overflow用户
提问于 2015-06-13 11:30:16
回答 3查看 2.2K关注 0票数 1

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

我有一个大量的图像集合,将用作背景资产。为了确保没有亮点会分散观众的注意力,我想找到所有亮像素超过某一阈值的图像,以便重新加工。

这样做有Imagemagick操作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-13 12:56:56

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

代码语言:javascript
复制
convert image.jpg -colorspace HSB -format %c histogram:info:-

您需要根据第三列(=亮度)对输出进行反向排序,然后选择第一行,这可以这样实现(对于以下情况,我假设Linux是操作系统):

代码语言:javascript
复制
convert image.jpg -colorspace HSB -format %c histogram:info:- \
 | sort -t',' -gr -k 3 | head -1

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

代码语言:javascript
复制
sed 's/.* hsb.*,.*,\([0-9.]*\)%.*/\1/'

(这从hsb或hsba括号中取出第三个数字,即最亮像素亮度的百分比值。)

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

代码语言:javascript
复制
#/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

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-13 16:26:20

最终答案

不知道周末我在想什么。只需一步就可以得到这样的最大强度:

代码语言:javascript
复制
convert input.jpg -colorspace HSB -separate -delete 0,1 -format "%[max]" info:

输出值将在0-65535之间,因此,如果您想知道是否有比(例如80% )亮的像素,则需要测试一个大于52,000的值。这假设您的量化是16位,也就是说,当您执行Q16时,它表示identify -version

以下是较早的答案:

最新答案

好了,现在回到电脑前。我认为我下面的第二个建议对于您的用例来说有更多的里程。我被你问这个问题的方式误导,以为你想找到最亮像素的位置,而不是简单地知道它有多亮。不管怎样..。

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

代码语言:javascript
复制
convert -size 500x100 gradient:black-"rgb(204,204,204)" input.jpg

从黑色到80%白色,即204/255 = 80%。

如果我们现在转换为HSB并在70%这样的阈值上转换,我们就会得到这个值(我在它周围放置了一个人工的红色边框,这样您就可以看到白色区域的范围):

如果我再做同样的事情,并且像这样达到75%的门槛,你就会得到:

如果我把门槛设为80%:

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

代码语言:javascript
复制
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标志以获得统计数据输出,因此,如果您像这样运行它,它应该可以做到这一点:

代码语言:javascript
复制
convert image.jpg -colorspace HSL -separate -delete 0,1 -threshold 80% -verbose info: | grep -i "max"

它实际上是做什么的?它将图像转换为HSL颜色空间,然后分离出三个通道--色调、饱和度和亮度。然后,它删除H&S通道,只留下轻盈。然后,它将所有亮度小于80%的像素设置为零(完全黑色),将所有超过80%的像素设置为1(完全白色)。然后查看光通道中的最大像素,如果所有像素都低于80%的阈值,则最大像素将为0。如果任何像素超过了80%的阈值,您的最大像素将为1。

原始答案

我离一台有ImageMagick的机器很远,但是我相信我之前运行了下面的命令来找到最小像素,我想它是可以修改的:

代码语言:javascript
复制
identify -precision 5 -define identify:locate=minimum -define identify:limit=3 image.jpg

文档是这里

另一种选择是转换为HSB色彩空间,分离通道,丢弃色调和饱和度,只留下亮度。现在阈值是80%,所以低于阈值的所有东西都变成零(黑色),超过80%的东西都变成白色。现在检查平均或最大像素,如果它是非零,有值超过您的阈值。当我还远离电脑的时候,还没有经过测试:

代码语言:javascript
复制
convert image.jpg -colorspace HSB -separate -delete 0,1 -threshold 80% info: | grep -Ei "mean|max"
票数 2
EN

Stack Overflow用户

发布于 2015-06-15 10:10:23

我觉得我更喜欢直方图的答案。如果你搜索单个最亮的像素,你很可能会被噪音误导。我认为最好是做一个直方图,并找到(例如)第95百分位数,即。95%像素的亮度比。这将是不那么敏感的噪音,并可能更有用的确定峰值亮度的图像。

我不太了解IM,但贵宾们有一个操作:

代码语言:javascript
复制
$ vips percent wtc.jpg 95
197

所以95%的像素比197暗。当然是在RGB空间里。我觉得这对这个案子来说可能足够了。如果您真的想测试亮度,您可以转换为CIELAB并测量L*,但是这需要在Python/Ruby/任何东西中编写一些脚本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30818162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档