在Python中,我试图将图像分成辐条并计算每个辐条中黑色像素的数量。最终目标是生成图像的天空 View 系数,但任何有关分离成辐条(围绕图像中心的圆的三角形)的帮助都将非常感激。
例如,我有一个用鱼眼镜头捕获的半球形图像(下面绘制的示例),我想将圆形图像分成围绕中心的三角形(如车轮中的辐条或披萨片)
circle divided into triangles like pizza slices or spokes around a wheel
圆圈可能并不总是位于图像上的同一位置,并且最初不会被分成线条,因为它是天空的半球形图像。因此,作为示例,图像看起来更像是这样的:
example of image with no division lines
无论圆在哪里,我都需要相同数量的线段,例如 8
最佳答案
我没有时间像平常那样给出完整的答案,但我想贡献一些小东西,而且没有人说答案必须完整。
第 1 步 - 修剪黑色以找到半径
您可以修剪掉黑色像素,得到一个正方形,中间有您想要的内切圆。您可以使用 numpy 检查图像/ndarray 的行/列中的所有元素是否为零,然后将它们切片。
或者您可以使用this method .
一旦你有了一个正方形,如果你取它的一半宽度,你就会知道圆的半径和中心坐标。
第 2 步 - 生成蒙版
绘制饼图来掩盖所需的像素。我在这里画了 3 个切片来演示如何绕圆移动,但您一次只需要一个。
下面是一些绘制前几个饼图切片的代码,可用于掩盖您想要的部分:
#!/usr/local/bin/python3
import PIL.ImageDraw as ImageDraw,PIL.Image as Image, PIL.ImageShow as ImageShow
im = Image.new("RGB", (400,400))
draw = ImageDraw.Draw(im)
sectors=8
angle=360/sectors
# Draw first sector bright white - fill colour is rgb(255,255,255)
startangle=-90
draw.pieslice((0,0,400,400),startangle,startangle+angle,fill=(255,255,255))
# Draw second sector slightly darker
startangle+=angle
draw.pieslice((0,0,400,400),startangle,startangle+angle,fill=(223,223,223))
# Draw third sector slightly darker still
startangle+=angle
draw.pieslice((0,0,400,400),startangle,startangle+angle,fill=(192,192,192))
im.show()
显然,在您完成的代码中,此步骤将是对所有八个切片进行 for
循环的开始,您将一次执行一个切片。
第 3 步 - 敷面膜
因此,如果您现在拍摄如下所示的蒙版图像:
并将其反转(否定),然后将其叠加到原始图像上,在每个像素位置选择两个图像中较亮的图像,您将得到这个(之后我人为地添加了一个黑色边框,以便您可以看到它的范围) :
您可以使用numpy.maximum()
选择更亮的像素,如图here .
第 4 步 - 计算所需像素
您现在可以希望计算黑色(即零值)像素或白色像素,并从整个形状的面积中减去。
This link展示了一种方法。还有其他的。
关于python - 将图像分割成辐条并计算每个辐条中的黑色像素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189114/