应该是黑白的图像具有中间值,不能用作二进制掩码

Image supposed to be black and white has intermediate values and can not be used as a binary mask

假设我们有这张看似二进制的图像:

但是,当通过 opencv 读取时:

img = cv2.imread("myImage.png", cv2.IMREAD_UNCHANGED)

我们注意到它的值不同:

例如

array([  0,  16,  32,  48,  64,  79,  80,  95,  96, 111, 112, 127, 128,
   143, 144, 159, 160, 175, 176, 191, 192, 207, 208, 223, 224, 239,
   240, 255], dtype=uint8)

是否有安全的方法将其转换为简单的二进制范围 ([0,1])? 使用的包没有限制,可以是opencv,pillow等

您可以定义一个阈值,例如 127。然后将阈值以下的像素值定义为零,将阈值以上的像素值定义为 1。但我认为您还有另一个问题,因为图像的值范围很广(0 到255).这与您显示的图像不一致。

您的图像具有 Alpha 通道和透明度

import sys
import cv2
import numpy as np

dir = sys.path[0]
im = cv2.imread(dir+'/img.png', -1)

im[np.where(im[:, :, 3] == 0)] = (255, 255, 255, 255)
cv2.imwrite(dir+'/img_without_transparency.png', im)

im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

min = np.min(im)
max = np.max(im)
bw = cv2.threshold(im, (min+max)//2, 255, cv2.THRESH_BINARY)[1]
print(np.min(bw), np.max(bw))  # 0-255

bw = bw/255
print(np.min(bw), np.max(bw))  # 0-1

所以白色 space 不是真的白色:

您图像的 RGB 通道全为零,alpha 通道中存在色差

获取 Alpha 通道

img = cv2.imread("myImage.png", cv2.IMREAD_UNCHANGED)
img_alpha = img[:,:,3]

将 alpha 通道转换为二进制

thresh = 127
im_bw = cv2.threshold(img_alpha, thresh, 255, cv2.THRESH_BINARY)[1]

范围在 [0,1]

im_bw = im_bw // 255