首页 > 解决方案 > 如何获取图像中分割区域的像素数我使用 Vgg16 进行分割

问题描述

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

标签: pythontensorflowopencvdeep-learningpytorch

解决方案


编辑:以什么格式返回区域?您是否只有最终图像或区域作为轮廓给出?如果将它们作为轮廓(坐标列表),则可以直接在该结构上应用 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 就是这样:

在此处输入图像描述


推荐阅读