python - 将图像分割成辐条并计算每个辐条中的黑色像素数

标签 python image-processing

在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 .

一旦你有了一个正方形,如果你取它的一半宽度,你就会知道圆的半径和中心坐标。

enter image description here

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

enter image description here

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

第 3 步 - 敷面膜

因此,如果您现在拍摄如下所示的蒙版图像:

enter image description here

并将其反转(否定),然后将其叠加到原始图像上,在每个像素位置选择两个图像中较亮的图像,您将得到这个(之后我人为地添加了一个黑色边框,以便您可以看到它的范围) :

enter image description here

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

第 4 步 - 计算所需像素

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

This link展示了一种方法。还有其他的。

关于python - 将图像分割成辐条并计算每个辐条中的黑色像素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189114/

相关文章:

java - 有没有相当于 Python 的 Easy String Splicing 的 Java?

python - 未找到 Conda 命令

python - 如何使用 Python 获取带有 Selenium 的 <ul> 中的 <li> 元素列表?

matlab - 从二值图像中去除噪声

python - 如何从使用 .loc 找到的特定行中提取值以返回变量

python 编译器

linux - 如何配置拇指安全性?

c++ - 将矩阵中的 16 位写入文本文件,在 C++ 中以不同的方式读回它们

c++ - OpenCV:自定义区域/图像作为 GrabCut 的 "background"的来源

python - OpenCV Python - 不同的轮廓近似方法具有相同的输出