python - 如何获取图像中分割区域的像素数我使用 Vgg16 进行分割
解决方案
编辑:以什么格式返回区域?您是否只有最终图像或区域作为轮廓给出?如果将它们作为轮廓(坐标列表),则可以直接在该结构上应用 findContourArea。
如果您可以在图像中逐个接收/采样区域(但没有轮廓),则可以顺序绘制清晰图像中的每种颜色/类别,将其转换为灰度或直接将其绘制为灰度或二进制,或用阈值二值化;然后 numberPixels = len(cv2.findNonZero(bwImage))。cv2.findContour 和 cv2.contourArea 应该做同样的事情。
如果您的程序仅接收最终分割而不是每类轮廓,则不是在单独的图像中渲染每个类,您可以通过该图像上的颜色范围过滤/屏蔽区域。我构建了它,它似乎完成了这项工作,粉红色地毯为 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)
如果您没有给定颜色的值或/并且无法控制它们,您可以使用
numpy.unique()
:https ://numpy.org/doc/stable/reference/generated/numpy.unique.html它会返回独特的颜色,然后它们可以应用于上面的算法。编辑 2:顺便说一句,计算或验证此类计数的另一种方法是计算直方图。黑白图像上的 IrfanView 就是这样: