应该是黑白的图像具有中间值,不能用作二进制掩码
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
假设我们有这张看似二进制的图像:
但是,当通过 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