我一直在寻找一种将numpy图像划分为网格状补丁的方法。
此任务已回答了几次。 Extracting patches of a certain size from the image in python efficiently
skleans extract_patches_2d看起来完全正确。
但是,我觉得我不理解文档。
我有一个图像,它不是特别大,磁盘上有几个Mb。 OpenCV没有问题。
其尺寸为
self.original_image.shape
(1536, 2048, 3)
因此,让我们将其提取到每个100 X 100的块中。在信封背面计算补丁的数量应该类似
(1536 * 2048)/(100 * 100)= 314
patches=extract_patches_2d(self.original_image,(100,100))
Traceback (most recent call last):
Debug Probe, prompt 46, line 1
File "c:\Python27\Lib\site-packages\sklearn\feature_extraction\image.py", line 374, in extract_patches_2d
extraction_step=1)
File "c:\Python27\Lib\site-packages\sklearn\feature_extraction\image.py", line 296, in extract_patches
patches = as_strided(arr, shape=shape, strides=strides)
File "c:\Python27\Lib\site-packages\numpy\lib\stride_tricks.py", line 48, in as_strided
array = np.asarray(DummyArray(interface, base=x))
File "c:\Python27\Lib\site-packages\numpy\core\numeric.py", line 482, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.
这是一个numpy内存错误。造成这种情况的原因是什么?
我感觉自己并不完全遵循,让我们制作一个小图像并将其分成相当大的部分
patches=extract_patches_2d(self.original_image[0:100,0:100],(50,50))
这样可行,但会产生数千个补丁
len(patches)
2601
不是我期待的~4。我对这个功能有什么不了解?人们如何获得补丁,这似乎是计算机视觉中的常见问题。
Windows上的Python 2.7,最近安装的软件包和最新的软件
Ben@Laptop MINGW64 ~/Desktop
$ pip install -U scikit-learn
Requirement already up-to-date: scikit-learn in c:\python27\lib\site-packages
答案 0 :(得分:4)
该功能可以从给定图像创建所有可能的补丁组合。
在您的情况下,第一个补丁将按行排列0:49像素,按列排列0:49像素。第二个补丁从1:50行和列方式和o开启。
因此,如果您有大小(m,n)的图像并希望提取大小(a,b)的块,则可以提取(m-a)+1 x(n-b + 1)个最大可能的块。
在你的情况下是51x 51 = 2601补丁..
如果要限制要提取的修补程序数,可以通过max_ patches
参数的可选参数执行此操作。