在python中,我试图将图像分成多个辐条,并计算每个辐条中黑色像素的数量。最终目标是生成图像的天空视图因子,但是对分离为辐条(围绕图像中心的圆三角形)的任何帮助将不胜感激。
例如,我有一个用鱼眼镜头拍摄的图像,一个半球形图像(如下图所示),并且我想将圆形图像分成围绕中心的三角形(例如轮辐或披萨片中的辐条)
circle divided into triangles like pizza slices or spokes around a wheel
圆圈可能并不总是在图像上的同一位置,并且最初不会分成几条线,因为它将是天空的半球图像。例如,图像看起来像这样:
example of image with no division lines
无论圆在哪里,我都需要相同数量的线段,例如8
答案 0 :(得分:1)
我没有通常的时间来做一个完整的答案,但是我觉得自己需要花些力气,而且没有人说答案必须要完整。
步骤1-修剪黑色以找到半径
您可以修剪黑色像素,并在中间与要内切的圆圈形成一个正方形。您可以使用numpy
来检查图像/ ndarray的行/列中的所有元素是否都为零,然后将其切片。
或者您可以使用this method。
一旦有了一个正方形,如果取其一半的宽度,您将知道半径以及圆心。
第2步-生成蒙版
绘制饼图以遮盖所需的像素。我在这里画了三个切片,以演示如何绕圆运动,但是一次只需要一个。
这里有一些代码可以绘制前几个饼图,可用于遮盖所需的部分:
#!/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显示了一种方法。还有其他人。