【问题标题】:How To Get The Pixel Count Of A Segmented Area in an Image I used Vgg16 for Segmentation如何获取图像中分割区域的像素数我使用 Vgg16 进行分割
【发布时间】:2021-04-03 07:29:54
【问题描述】:

我是深度学习的新手,但已成功对图像进行语义分割,我试图获取标签中每个类别的像素数。作为图像中的一个示例,我想获取地毯、枝形吊灯或灯架的像素数。我该怎么办?感谢任何建议 会有所帮助。

【问题讨论】:

  • 请提供更多细节。展示从接收推理结果到全彩色分割的步骤。
  • @ChristophRackwitz 我会做并标记你。也将在 github 上关注你。感谢您的回复。祝你有美好的一天。

标签: python tensorflow opencv deep-learning pytorch


【解决方案1】:

编辑:区域以什么格式返回?您是否只有最终图像或区域作为轮廓给出?如果您将它们作为轮廓(坐标列表),您可以直接在该结构上应用 findContourArea。

  1. 如果您可以在图像中逐个接收/采样区域(但没有轮廓),则可以在清晰的图像中顺序绘制每种颜色/类别,将其转换为灰度或直接绘制灰度或二值化,或用阈值二值化;然后 numberPixels = len(cv2.findNonZero(bwImage))。 cv2.findContour 和 cv2.contourArea 应该做同样的事情。

  2. 如果您的程序只接收最终分割而不是每个类的轮廓,而不是在单独的图像中呈现每个类,您可以按该图像上的颜色范围过滤/屏蔽区域。我构建了它,它似乎完成了这项工作,粉红色地毯为 14861 像素:

import cv2
import numpy as np

# rgb 229, 0, 178 # the purple carpet in RGB (sampled with IrfanView)
# b,g,r = 178, 0, 229 # cv2 uses BGR
class_color = [178, 0, 229]
multiclassImage = cv2.imread("segmented.png")
cv2.imshow("MULTI", multiclassImage)
filteredImage = multiclassImage.copy()
low = np.array(class_color);

mask = cv2.inRange(filteredImage, low, low)
filteredImage[mask == 0] = [0, 0, 0]
filteredImage[mask != 0] = [255,255,255]
cv2.imshow("FILTER", filteredImage)
# numberPixelsFancier = len(cv2.findNonZero(filteredImage[...,0]))
# That also works and returns 14861 - without conversion, taking one color channel
bwImage = cv2.cvtColor(filteredImage, cv2.COLOR_BGR2GRAY)  
cv2.imshow("BW", bwImage)
numberPixels = len(cv2.findNonZero(bwImage))
print(numberPixels)
cv2.waitKey(0)
  1. 如果您没有给定颜色的值或/并且无法控制它们,您可以使用numpy.unique():https://numpy.org/doc/stable/reference/generated/numpy.unique.html,它会返回唯一的颜色,然后可以将它们应用到算法中以上。

  2. 编辑 2: 顺便说一句,计算或验证此类计数的另一种方法是计算直方图。这就是黑白图像上的 IrfanView:

【讨论】:

  • 非常感谢。我非常感谢该指南,并将尝试我们的。完成您提供的步骤后,我会回来。再次感谢,祝您有美好的一天。
猜你喜欢
  • 2016-10-08
  • 2011-05-18
  • 2020-07-30
  • 2021-04-05
  • 2016-07-23
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多