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补丁产量:
两件事情:
您正在将补丁矩阵初始化为错误的数据类型.默认情况下,numpy会使补丁矩阵成为一种np.float64类型,如果您将其用于保存,则无法获得预期的结果.具体来说,如果您咨询F先生的答案,实际上会对浮点图像执行一些缩放,其中图像的最小值和最大值分别缩放为黑色和白色,因此如果您的图像背景完全均匀,最小值和最大值都是相同的,并且可视化为黑色.因此,最好的方法是尊重原始图像的数据类型,即将dtype补丁矩阵设置为np.uint8.
从for循环索引来看,您想要提取出不重叠的 8 x 8个补丁.这意味着如果你有一个带有8 x 8补丁的32 x 32图像,那么总共有16个补丁以4 x 4网格排列.
因此,您需要更改patches语句,使其在第一维中具有16,而不是36.此外,您必须调整索引到图像的方式以提取8 x 8补丁,因为现在,补丁是重叠的.具体而言,要做出像块索引从去8*i到8*(i+1)该行,8*j到8*(j+1)了列.如果你替换的样本值i和j你自己,你会看到,我们得到唯一的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图像,但所有通道都相同,因此在我们显示图像之前,这会被视为灰度.
我们得到:
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |