创建映像修补程序,sklearn.feature_extraction.image.extract_patches_2d



我一直在寻找一种方法将 numpy 图像划分为像补丁一样的网格。

此任务已回答了几次。 有效地从python中的图像中提取一定大小的补丁

斯克莱恩斯extract_patches_2d看起来完全正确。

http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.image.extract_patches_2d.html

但是,我觉得我不了解文档。

我有一个图像,它不是特别大,磁盘上有几 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:Python27Libsite-packagessklearnfeature_extractionimage.py", line 374, in extract_patches_2d
extraction_step=1)
File "c:Python27Libsite-packagessklearnfeature_extractionimage.py", line 296, in extract_patches
patches = as_strided(arr, shape=shape, strides=strides)
File "c:Python27Libsite-packagesnumpylibstride_tricks.py", line 48, in as_strided
array = np.asarray(DummyArray(interface, base=x))
File "c:Python27Libsite-packagesnumpycorenumeric.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.

这是一个内存错误。是什么原因造成的?

我感觉我不会完全遵循,让我们制作一个小图像并将其分成相当大的部分

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:python27libsite-packages

该函数从给定图像创建所有可能的补丁组合。 在您的情况下,第一个修补程序将跨 0:49 像素行和 0:49 像素按列。第二个补丁从 1:50 行和列和 o 开始。 因此,如果您有大小(m,n(的图像并希望提取大小为(a,b(的斑块,则可以提取(m-a(+1 x (n-b+1(最大可能的斑块。 在您的情况下,这是 51x 51 = 2601 个补丁。 如果要限制要提取的修补程序数,可以通过max_ patches参数的可选参数来实现。

最新更新