问题描述
我对 python 非常陌生,并试图将图像中的彩色部分与灰度分开。 尽管此代码(见下文)为我提供了我正在寻找的结果,但它需要很长时间(在正常图像上需要 10 秒以上)。
我找了一个小时,没有找到合适的答案,因为大多数只是将特定颜色(黑色、白色、...)或阈值分开。
据我(已经)知道 numpy 是要走的路,但我没有成功:S
期待帮助 - 谢谢!!
gray_elements = np.zeros_like(image)
gray_elements[:] = 255
colored_segments = np.zeros_like(image)
colored_segments[:] = 255
# Separate black-to-white-colors from colored
for y in range(image.shape[0]):
for x in range(image.shape[1]):
pxl = image[y,x]
if max(pxl) - min(pxl) > 5:
colored_segments[y,x] = pxl
else:
gray_elements[y,x] = pxl
解决方法
未经测试,但因为是圣帕特里克节...
如果您有一个包含 3 通道 RGB 图像的 Numpy 数组 na
,它将具有 na.shape
的 (h,w,3)
。
您可以通过以下方式获得每个点 3 个通道中的最大值:
ma = np.amax(na,axis=2,keepdims=True)
和最小值:
mi = np.amin(na,keepdims=True)
然后区别:
diff = ma - mi
然后制作一个布尔(真/假)掩码:
grey = diff < 5
如果/当您对 Numpy 更加熟悉时,您可能会使用 peak-to-peak 函数。
但通常情况下,您会使用 OpenCV 转换为 HSL 色彩空间,然后找到饱和度通道较低的像素,这意味着颜色是不饱和的且相当灰色。