gpt4 book ai didi

imagemagick - 使用 ImageMagick 在每一行中找到第一个黑色像素

转载 作者:行者123 更新时间:2023-12-02 06:57:14 27 4
gpt4 key购买 nike

对于图像中的每一行,我想找到该行中的第一个黑色(或第一个非白色)像素。例如,对于这样的图像:

enter image description here

我希望输出如下:

0
1
0

或者接近我可以解析的东西。我认为可能有一种方法可以通过子图像搜索来做到这一点,但我不太清楚该怎么做。有什么指点吗?

最佳答案

您不需要subimage-search 来实现您的目标。该问题可以简化为文本解析

1。基础知识

考虑一下:您可以告诉 ImageMagick 将任何图像转换为文本表示形式,其中包含每个像素的准确颜色信息。 示例:

convert wizard: textwizard.txt

(向导: 是用于所有 ImageMagick 安装的内置图像,用于测试目的。)

是的,就是这么简单!只需添加一个 .txt 后缀即可请求此图像“格式”。 结果:

# ImageMagick pixel enumeration: 480,640,255,srgb
0,0: (255,255,255) #FFFFFF white
1,0: (255,255,255) #FFFFFF white
2,0: (255,255,255) #FFFFFF white
[....]
47,638: (246,247,249) #F6F7F9 srgb(246,247,249)
48,638: (246,247,249) #F6F7F9 srgb(246,247,249)
47,639: (236,235,236) #ECEBEC srgb(236,235,236)
48,639: (230,228,218) #E6E4DA srgb(230,228,218)
[....]
476,639: (255,255,255) #FFFFFF white
477,639: (255,255,255) #FFFFFF white
478,639: (255,255,255) #FFFFFF white
479,639: (255,255,255) #FFFFFF white

如果您查看输出的第一行,您会注意到 ImageMagick 在此处使用它来详细说明有关图像的一些特殊信息:

# ImageMagick pixel enumeration: 480,640,255,srgb

意思是:

  • 图片宽度为 480 像素,
  • 图片为 640 像素高,
  • 图像使用 0-255 的范围作为每个 channel 的颜色信息(相当于 8 位颜色深度),
  • 图像是在 sRGB 色彩空间中构建的

其他行由 4 列组成:

  1. 格式(N,M) 中的第一列以(row_number,column_number) 表示各个像素的确切位置。 (行号和列号的索引从零开始——第 1 行表示为 0,第 2 行表示为 1。)
  2. 其他三列冗余地保存着完全相同的信息,每一个都以不同的符号表示:第 1 列中给出的像素的确切颜色值。(最后一列将使用人类可读的名称,如果ImageMagick 知道一个颜色值...)

As a side note: you can use such a textual representation of the original image (with or without some extra modifications) to re-create a real image:

convert textwizard.txt wizard.jpg

2。选择特定行

您应该知道,您可以使用以下语法选择图像的特定区域:

image.png[WIDTHxHEIGHT+X_OFFSET+Y_OFFSET]

因此,要仅选择特定行,您可以将 HEIGHT 设置为 1。要完全获取任何行,请将 X-OFFSET 设置为 0。要获取特定行,请相应地设置 Y-OFFSET

为了获取索引为 47 的行的值(对于上面使用的内置 向导: 图像),我们可以这样做:

convert wizard:[640x1+0+47] row47.txt

cat row47.txt
# ImageMagick pixel enumeration: 480,1,255,srgb
0,0: (255,255,255) #FFFFFF white
1,0: (255,255,255) #FFFFFF white
2,0: (255,255,255) #FFFFFF white
[....]
428,0: (82,77,74) #524D4A srgb(82,77,74)
429,0: (169,167,168) #A9A7A8 srgb(169,167,168)
430,0: (232,231,228) #E8E7E4 srgb(232,231,228)
432,0: (246,247,249) #F6F7F9 srgb(246,247,249)
[....]
476,0: (255,255,255) #FFFFFF white
477,0: (255,255,255) #FFFFFF white
478,0: (255,255,255) #FFFFFF white
479,0: (255,255,255) #FFFFFF white

如果您不想在文件中输出文本,而是在标准输出 channel 上打印,您可以这样做:

convert wizard:[480x1+0+47] txt:-

3。将它们拼接在一起

根据以上信息片段,可以明确执行此任务的方法:

  1. 遍历图像的所有像素行。
  2. 将每个像素的颜色值输出为文本。
  3. 寻找第一个非白色像素并保留其位置信息。

4。可能的脚本(OS X、Linux、Unix)

这是可以使用的 Bash 脚本的主要部分:

# Define some image specific variables (width, height, ...)
image=${1}
number_of_columns=$(identify -format '%W' ${image})
width=${number_of_columns} # just an alias
number_of_rows=$(identify -format '%H' ${image})
height=${number_of_rows} # just an alias
max_of_indices=$(( ${height} -1 ))

# Loop through all rows and grep for first non-white pixel
for i in $(seq 0 ${max_of_indices}); do
echo -n "Row ${i} : " ;
convert ${image}[${width}x1+0+${i}] txt:- \
| grep -v enumeration \
| grep -v '#FFFFFF' -m 1 \
|| echo "All WHITE pixels in row!"
done

-v white 将取消选择所有包含字符串 white 的行。-m 1 参数将返回最多 1 个匹配项(即第一个匹配项)。

它会很慢,但它会起作用。

关于imagemagick - 使用 ImageMagick 在每一行中找到第一个黑色像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28869455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com