【发布时间】:2021-04-03 07:29:54
【问题描述】:
【问题讨论】:
-
请提供更多细节。展示从接收推理结果到全彩色分割的步骤。
-
@ChristophRackwitz 我会做并标记你。也将在 github 上关注你。感谢您的回复。祝你有美好的一天。
标签: python tensorflow opencv deep-learning pytorch
【问题讨论】:
标签: python tensorflow opencv deep-learning pytorch
编辑:区域以什么格式返回?您是否只有最终图像或区域作为轮廓给出?如果您将它们作为轮廓(坐标列表),您可以直接在该结构上应用 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:
【讨论】: