Numpy图像切片返回黑色补丁/错误值

Dr.*_*all 4 python numpy image image-processing scipy

最终目标是拍摄图像并将其切片成我保存的样本.问题是我的切片随机返回黑色/不正确的补丁.贝娄是一个小样本计划.

import scipy.ndimage as ndimage
import scipy.misc as misc
import numpy as np

image32 = misc.imread("work0.png")
patches = np.zeros((36, 8, 8))
for i in range(4):
  for j in range(4):
    patches[i*4 + j] = image32[i:i+8,j:j+8]
    misc.imsave("{0}{1}.png".format(i,j), patches[i*4 + j])
Run Code Online (Sandbox Code Playgroud)

我的形象的一个例子是:

我收到补丁的信

8x8补丁的0,0补丁产量:

在此输入图像描述

ray*_*ica 7

两件事情:

  1. 您正在将补丁矩阵初始化为错误的数据类型.默认情况下,numpy会使补丁矩阵成为一种np.float64类型,如果您将其用于保存,则无法获得预期的结果.具体来说,如果您咨询F先生的答案,实际上会对浮点图像执行一些缩放,其中图像的最小值和最大值分别缩放为黑色和白色,因此如果您的图像背景完全均匀,最小值和最大值都是相同的,并且可视化为黑色.因此,最好的方法是尊重原始图像的数据类型,即将dtype补丁矩阵设置为np.uint8.

  2. for循环索引来看,您想要提取出不重叠的 8 x 8个补丁.这意味着如果你有一个带有8 x 8补丁的32 x 32图像,那么总共有16个补丁以4 x 4网格排列.

因此,您需要更改patches语句,使其在第一维中具有16,而不是36.此外,您必须调整索引到图像的方式以提取8 x 8补丁,因为现在,补丁是重叠的.具体而言,要做出像块索引从去8*i8*(i+1)该行,8*j8*(j+1)了列.如果你替换的样本值ij你自己,你会看到,我们得到唯一的8×8补丁的映像中的每个网格.


对于我上面提到的两件事,修改后的代码应该是:

import scipy.ndimage as ndimage
import scipy.misc as misc
import numpy as np

image32 = misc.imread('work0.png')

patches = np.zeros((16,8,8), dtype=np.uint8) # Change

for i in range(4):
    for j in range(4):
        patches[i*4 + j] = image32[8*i:8*(i+1),8*j:8*(j+1)] # Change
        misc.imsave("{0}{1}.png".format(i,j), patches[i*4 + j])
Run Code Online (Sandbox Code Playgroud)

当我这样做并看一下输出图像时,我得到了我的期望.


为了绝对确定,让我们使用绘制段matplotlib.您已经方便地保存了所有补丁,patches因此不应该显示我们需要的问题.但是,我会在注释中放置一些代码,以便您可以使用上面的代码读取从磁盘保存的图像,这样您就可以验证它是否仍然有效,无论是查看patches还是磁盘上的图像:

import matplotlib.pyplot as plt

plt.figure()
for i in range(4):
    for j in range(4):
        plt.subplot(4, 4, 4*i + j + 1)
        img = patches[4*i + j]
        # or you can do this:
        # img = misc.imread('{0}{1}.png'.format(i,j))
        img = np.dstack([img, img, img])
        plt.imshow(img)

plt.show()
Run Code Online (Sandbox Code Playgroud)

奇怪的matplotlib.pyplot.imshow是,如果你有一个单一通道的图像(例如你的情况),周围的强度相同,无论颜色图是什么,它都会变成黑色,就像我们经历的那样imsave.因此,我必须人为地将其设为RGB图像,但所有通道都相同,因此在我们显示图像之前,这会被视为灰度.

我们得到:

在此输入图像描述