使用:进行简单的图像抽取后img_decim_arr = img_arr[::2,::2],我获得的直方图与原始图像直方图非常相似:
使用:skimage.measure.block_reduce(img_arr, block_size = (2,2), func=np.mean)(2x2块平均)进行抽取,这是下采样的推荐方法(在某些讨论中在stackoverflow上找到)会产生非常有特色的直方图:
每隔一个箱子就更大了.我不确定这可能是由于一些混叠效应.任何人都可以解释并提供一些关于下采样如何影响图像(2D信号)直方图的理论提示?
我需要使用半径为 17 或更大的 3D 结构元素来计算 3D 形状数组 (400,401,401)、大小为 64320400 字节的形态学开度。结构元素 ndarray 的大小为 42875 字节。使用scipy.ndimage.morphology.binary_opening,整个过程消耗 8GB RAM。
I have read scipy/ndimage/morphology.py on GitHub, and as far as I can tell, the morphology erosion operator is implemented in pure C. It is to difficult for me to understand the ni_morphology.c source, so I haven't found any part of this code which leads to such enormous memory utilization. Adding more RAM is not a workable solution, since memory usage may increase …
为什么这个cython功能:
cimport numpy as np
cimport cython
def foo(np.uint32_t b):
cdef np.int32_t a = 0
if a-b <0: return 0
else: return 1
Run Code Online (Sandbox Code Playgroud)
对于foo(1),返回1?我在C中编译了类似的代码,并没有观察到两个操作数(a,b)都被提升为unsigned int.
我很困惑,与Cython相比,NumPy嵌套循环的3D数组是如此之慢.我写了一些简单的例子.
Python/NumPy版本:
import numpy as np
def my_func(a,b,c):
s=0
for z in xrange(401):
for y in xrange(401):
for x in xrange(401):
if a[z,y,x] == 0 and b[x,y,z] >= 0:
c[z,y,x] = 1
b[z,y,x] = z*y*x
s+=1
return s
a = np.zeros((401,401,401), dtype=np.float32)
b = np.zeros((401,401,401), dtype=np.uint32)
c = np.zeros((401,401,401), dtype=np.uint8)
s = my_func(a,b,c)
Run Code Online (Sandbox Code Playgroud)
Cythonized版本:
cimport numpy as np
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
def my_func(np.float32_t[:,:,::1] a, np.uint32_t[:,:,::1] b, np.uint8_t[:,:,::1] c):
cdef np.uint16_t z,y,x
cdef np.uint32_t s = 0
for z in …Run Code Online (Sandbox Code Playgroud) 我注意到各种面向Python科学图形的软件包之间的骨架几何存在显着差异。
使用OpenCV-Python的骨架:

使用pymorph的骨架:

使用scikit-image的骨骼:

可以观察到,OpenCV-Python和pymorph产生相同的骨架,而scikit-image则不然。骨骼差异的原因是什么?哪一个是合适的骨架?
我知道对于3d numpy数组我可以索引如下:
item = x[0,2,1]
Run Code Online (Sandbox Code Playgroud)
要么
item = x[0][2][1]
Run Code Online (Sandbox Code Playgroud)
但切片工作对我来说很奇怪:
item = x[:,:,1]
Run Code Online (Sandbox Code Playgroud)
是不一样的:
item = x[:][:][1]
Run Code Online (Sandbox Code Playgroud)
我错过了什么?