【问题标题】:skimage resize giving weird outputskimage 调整大小给出奇怪的输出
【发布时间】:2016-03-17 14:23:37
【问题描述】:

我正在使用 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 从视频中随机抽样帧。这是从我传递给它的视频路径返回一帧的函数。

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]

【问题讨论】:

    标签: python matplotlib scikit-image


    【解决方案1】:

    你能提供一个完整的例子吗?您如何读取图像数据,原始格式是什么? (在 .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()
    

    【讨论】:

      【解决方案2】:

      我认为这仅仅是因为通过保留范围,我最终会在 [0, 255] 范围内得到一个浮点数,而 pyplot.imshow 只能在 [0.0, 1.0] 范围内显示 MxNx3 浮点数组。当我使用 z = np.copy(x).astype('uint8') 将输出转换为 uint8 时,它显示正常。

      【讨论】:

        【解决方案3】:
        1. 正如 @RHankins 所述,plt.imshow 可以显示像素在 [0.0, 1.0] 范围内的浮点图像或像素在 [0, 255] 范围内的整数图像。

        2. skimage.transform.resize 调用函数 wrap (_warps.py#L161),该函数始终将输入图像转换为 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)
        

        【讨论】:

          猜你喜欢
          • 2017-10-30
          • 2012-10-30
          • 2012-12-27
          • 2014-01-21
          • 2014-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          相关资源
          最近更新 更多