将图像拆分为辐条并计算每个辐条中的黑色像素数

时间:2018-07-05 10:34:09

标签: python image-processing

在python中,我试图将图像分成多个辐条,并计算每个辐条中黑色像素的数量。最终目标是生成图像的天空视图因子,但是对分离为辐条(围绕图像中心的圆三角形)的任何帮助将不胜感激。

例如,我有一个用鱼眼镜头拍摄的图像,一个半球形图像(如下图所示),并且我想将圆形图像分成围绕中心的三角形(例如轮辐或披萨片中的辐条)

circle divided into triangles like pizza slices or spokes around a wheel

圆圈可能并不总是在图像上的同一位置,并且最初不会分成几条线,因为它将是天空的半球图像。例如,图像看起来像这样:

example of image with no division lines

无论圆在哪里,我都需要相同数量的线段,例如8

1 个答案:

答案 0 :(得分:1)

我没有通常的时间来做一个完整的答案,但是我觉得自己需要花些力气,而且没有人说答案必须要完整。

步骤1-修剪黑色以找到半径

您可以修剪黑色像素,并在中间与要内切的圆圈形成一个正方形。您可以使用numpy来检查图像/ ndarray的行/列中的所有元素是否都为零,然后将其切片。

或者您可以使用this method

一旦有了一个正方形,如果取其一半的宽度,您将知道半径以及圆心。

enter image description here

第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()

enter image description here

很显然,在完成的代码中,此步骤将是对所有八个切片进行for循环的开始,并且您一次只能做一个切片。

第3步-遮罩

因此,如果您现在拍摄这样的蒙版图像:

enter image description here

并将其反转(取反),然后将其叠加到原始图像上,在每个像素位置选择两个图像中的较亮的颜色,您将得到此图像(此后我人工添加了黑色边框,因此您可以看到其范围:

enter image description here

您可以使用numpy.maximum()选择较亮的像素,如图here所示。

第4步-计算所需像素

现在,您可以希望对黑色(即零值)像素或白色像素进行计数,然后从整个形状的面积中减去。

This link显示了一种方法。还有其他人。