这是this question的更高级版本。从this image开始,如何使用ImageMagick / GraphicsMagick /一个不同的命令行工具从坐标中得到三角形下像素的平均颜色值?优选地,该解决方案也适用于其他多边形。
答案 0 :(得分:1)
我会使用你的坐标使用-draw创建感兴趣区域的蒙版。然后可以将其用于将形状外的区域转换为透明。然后像以前一样将图像缩小为1x1像素。
答案 1 :(得分:1)
在@ Bonzo的答案的骨头上添加一些肉,这是你可以做到的一种方式。
convert image.jpg \
\( +clone -evaluate set 0 -fill white \
-draw "polygon 400,50 450,150 200,220" \
-write mask.png -transparent black \
\) -compose copyopacity -composite \
-write masked.png -resize 1x1! \
-alpha off -depth 8 -format "%[pixel:p{0,0}]\n" info:
srgb(145,114,94)
所以,那说...... “加载原始图像,并在侧面的括号中执行以下操作,远离主图像。复制图像(-clone
)并制作它全黑(-evaluate set 0
),并为我们即将绘制的多边形填充白色(-fill white
)。绘制多边形(-draw "polygon ..."
)并将其保存在名为{的文件中{1}}。现在让图像的所有黑色区域都透明。好,我们有一个蒙版。现在通过关闭括号返回到原始图像。从我们的蒙版图像复制透明度并将其应用到我们的原始图像({ {1}})。将屏蔽图像写为mask.png
。调整大小为1x1像素以对其进行平均。现在关闭透明度并使单个像素保持稳定,并在终端上以人类可读的术语写出它是什么。“
您可以看到中间图像 - 这里是-compose copyopacity -composite
:
这里是masked.png
:
是的,我知道它并不完全匹配,但那只是因为你没有提供坐标,我不得不猜测它们!将您自己的数字放入mask.png
部分,它将完全正常工作。
您实际上并不需要任何一个中间图像,我只保存它们以进行调试和演示,因此您可以从上面的命令中删除masked.png
和-draw polygon
。
<强>验证强>
只是为了检查舍入和平均的准确性,您可以用数学方法计算平均颜色。您使用与上面相同的基本技术,但通过计算蒙版中白色像素的比例然后屏蔽图像并查看蒙版中R,G和B的均值来计算均值的比例因子图像并按比例缩放...
-write mask.png
顺便说一句,这个平均值就是这样:
-write masked.png
答案 2 :(得分:0)
我最终通过使用scikit-image和numpy python模块解决了我的问题。示例代码如下:
from skimage import io, draw
import numpy
# read in the image as a numpy array
image = io.imread("image.png")
# setup a list of coords in the polygon
polygon = numpy.array([[100, 100], [200, 100], [200, 200], [100, 200]])
# Get a 2D list of pixels in the polygon
pixels = image[draw.polygon(polygon[:, 1], polygon[:, 0])]
# Use the channels of each pixel to get averages and convert them to ints
channels = numpy.average(pixels, 0).astype(int)
# Print!
print(channels)