skimage 调整大小给出奇怪的输出
skimage resize giving weird output
我正在使用 skimage.transform.resize
调整图像大小,但我得到了一个非常奇怪的输出,我不明白为什么。有人可以帮忙吗?
这是我的代码:
import matplotlib.pyplot as plt
import skimage.transform
plt.imshow(y)
h,w,c = y.shape
x = skimage.transform.resize(y, (256, (w*256)/h), preserve_range=True)
plt.imshow(x)
这是我的输入图像 y (240, 320, 3):
这是我的输出图像 x (256, 341, 3):
编辑:
好的,如果我更改 preserve_range=False
,它似乎工作正常。但为什么它不允许我保持当前范围?
编辑:
我使用 OpenCV 从视频中随机采样帧。这是我传递给它的视频路径中 returns 帧的函数。
def read_random_frames(vid_file):
vid = cv2.VideoCapture(vid_file)
# get the number of frames
num_frames = vid.get(cv2.CAP_PROP_FRAME_COUNT)
# randomly select frame
p_frame = random.randint(0, (num_frames-1))
# get frame
vid.set(cv2.CAP_PROP_POS_FRAMES, p_frame)
ret, frame = vid.read()
# convert from BGR to RGB
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
return frame
我有一个视频路径列表,我使用 map
函数检索帧,然后将输出列表转换为一个 numpy 数组:
batch_frames = map(lambda vid: read_random_frames(vid), train_vids_batch)
frame_tensor = np.asarray(batch_frames)
y = frame_tensor[0]
你能提供一个完整的例子吗?你如何读取你的图像数据,原始格式是什么? (在 .png 文件上使用 y = scipy.misc.imread("somefile.png")
它在我的机器上完美运行)
您的数据的数据类型(和 ndarray.dtype
)是什么?
import matplotlib.pyplot as plt
import skimage.transform
from scipy.misc import imread
y = imread("tree.png")
plt.subplot(121)
plt.imshow(y)
h,w,c = y.shape
x = skimage.transform.resize(y, (256, (w*256)//h), preserve_range=True)
plt.subplot(122)
plt.imshow(x)
plt.show()
我认为这仅仅是因为通过保留范围,我最终得到了 [0, 255] 范围内的浮点数,而 pyplot.imshow
只能显示 [0.0, 1.0] 范围内的 MxNx3 浮点数组].当我使用 z = np.copy(x).astype('uint8')
将输出转换为 uint8 时,它显示正常。
如 @RHankins 所述,plt.imshow
可以显示像素在 [0.0, 1.0]
范围内的浮点图像或像素在 [0.0, 1.0]
范围内的整数图像范围 [0, 255].
skimage.transform.resize
调用函数 wrap
(_warps.py#L161) which always converts an input image to float64
(_warps.py#L797).
这就是为什么您总是需要将输出转换为您喜欢的任何内容。例如
调整图像大小并在 [0, 255]
的范围内获得 np.uint8
输出图像,你这样做:
import matplotlib.pyplot as plt
from skimage import img_as_ubyte
import skimage.transform
x = img_as_ubyte(skimage.transform.resize(y, (100, 100)))
plt.imshow(x)
实际上,您需要将浮点图像转换为无符号整数in-order才能显示图像。下面是一个简单的调整大小示例。
def ski_resize(path):
image = imread(path)[:,:,:IMG_CHANNELS]
img = resize(image, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
# The below line will convert float to uint8
img = img.astype(np.uint8)
return img, image
我正在使用 skimage.transform.resize
调整图像大小,但我得到了一个非常奇怪的输出,我不明白为什么。有人可以帮忙吗?
这是我的代码:
import matplotlib.pyplot as plt
import skimage.transform
plt.imshow(y)
h,w,c = y.shape
x = skimage.transform.resize(y, (256, (w*256)/h), preserve_range=True)
plt.imshow(x)
这是我的输入图像 y (240, 320, 3):
这是我的输出图像 x (256, 341, 3):
编辑:
好的,如果我更改 preserve_range=False
,它似乎工作正常。但为什么它不允许我保持当前范围?
编辑: 我使用 OpenCV 从视频中随机采样帧。这是我传递给它的视频路径中 returns 帧的函数。
def read_random_frames(vid_file):
vid = cv2.VideoCapture(vid_file)
# get the number of frames
num_frames = vid.get(cv2.CAP_PROP_FRAME_COUNT)
# randomly select frame
p_frame = random.randint(0, (num_frames-1))
# get frame
vid.set(cv2.CAP_PROP_POS_FRAMES, p_frame)
ret, frame = vid.read()
# convert from BGR to RGB
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
return frame
我有一个视频路径列表,我使用 map
函数检索帧,然后将输出列表转换为一个 numpy 数组:
batch_frames = map(lambda vid: read_random_frames(vid), train_vids_batch)
frame_tensor = np.asarray(batch_frames)
y = frame_tensor[0]
你能提供一个完整的例子吗?你如何读取你的图像数据,原始格式是什么? (在 .png 文件上使用 y = scipy.misc.imread("somefile.png")
它在我的机器上完美运行)
您的数据的数据类型(和 ndarray.dtype
)是什么?
import matplotlib.pyplot as plt
import skimage.transform
from scipy.misc import imread
y = imread("tree.png")
plt.subplot(121)
plt.imshow(y)
h,w,c = y.shape
x = skimage.transform.resize(y, (256, (w*256)//h), preserve_range=True)
plt.subplot(122)
plt.imshow(x)
plt.show()
我认为这仅仅是因为通过保留范围,我最终得到了 [0, 255] 范围内的浮点数,而 pyplot.imshow
只能显示 [0.0, 1.0] 范围内的 MxNx3 浮点数组].当我使用 z = np.copy(x).astype('uint8')
将输出转换为 uint8 时,它显示正常。
如 @RHankins 所述,
plt.imshow
可以显示像素在[0.0, 1.0]
范围内的浮点图像或像素在[0.0, 1.0]
范围内的整数图像范围 [0, 255].skimage.transform.resize
调用函数wrap
(_warps.py#L161) which always converts an input image tofloat64
(_warps.py#L797).
这就是为什么您总是需要将输出转换为您喜欢的任何内容。例如
调整图像大小并在 [0, 255]
的范围内获得 np.uint8
输出图像,你这样做:
import matplotlib.pyplot as plt
from skimage import img_as_ubyte
import skimage.transform
x = img_as_ubyte(skimage.transform.resize(y, (100, 100)))
plt.imshow(x)
实际上,您需要将浮点图像转换为无符号整数in-order才能显示图像。下面是一个简单的调整大小示例。
def ski_resize(path):
image = imread(path)[:,:,:IMG_CHANNELS]
img = resize(image, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
# The below line will convert float to uint8
img = img.astype(np.uint8)
return img, image