当使用scipy.ndimage.interpolation.shift使用周期性边界处理(mode = 'wrap')沿一个轴移动numpy数据数组时,我得到一个意外的行为.例程尝试强制第一个pixel(index 0)与最后一个(index N-1)相同而不是"last plus one(index N)".
最小的例子:
# module import
import numpy as np
from scipy.ndimage.interpolation import shift
import matplotlib.pyplot as plt
# print scipy.__version__
# 0.18.1
a = range(10)
plt.figure(figsize=(16,12))
for i, shift_pix in enumerate(range(10)):
# shift the data via spline interpolation
b = shift(a, shift=shift_pix, mode='wrap')
# plotting the data
plt.subplot(5,2,i+1)
plt.plot(a, marker='o', label='data')
plt.plot(np.roll(a, shift_pix), marker='o', label='data, roll')
plt.plot(b, marker='o',label='shifted data')
if i == 0: …Run Code Online (Sandbox Code Playgroud) 我试图找到给定图像的一些相对最大值。据我所知,有两种可能的方法,第一种是使用scipy.ndimage.maximum_filter(),第二种是使用 skimage.feature.peak_local_max()。
为了比较这两种方法,我修改了此处显示的skimage 的示例,以便比较找到的峰值。
from scipy import ndimage as ndi
import matplotlib.pyplot as plt
from skimage.feature import peak_local_max
from skimage import data, img_as_float
im = img_as_float(data.coins())
# use ndimage to find the coordinates of maximum peaks
image_max = ndi.maximum_filter(im, size=20) == im
j, i = np.where(image_max)
coordinates_2 = np.array(zip(i,j))
# use skimage to find the coordinates of local maxima
coordinates = peak_local_max(im, min_distance=20)
# display results
fig, axes = plt.subplots(1, 2, figsize=(8, 3), sharex=True, sharey=True) …Run Code Online (Sandbox Code Playgroud) 是否有类似于支持向量输出ndimage的generic_filter的过滤器?我没有设法让scipy.ndimage.filters.generic_filter回报超过标量.取消注释下面代码中的行以获取错误:TypeError: only length-1 arrays can be converted to Python scalars.
我正在寻找一个处理2D或3D数组的通用过滤器,并在每个点返回一个向量.因此,输出将具有一个附加维度.对于下面的例子,我希望这样的事情:
m.shape # (10,10)
res.shape # (10,10,2)
Run Code Online (Sandbox Code Playgroud)
示例代码
import numpy as np
from scipy import ndimage
a = np.ones((10, 10)) * np.arange(10)
footprint = np.array([[1,1,1],
[1,0,1],
[1,1,1]])
def myfunc(x):
r = sum(x)
#r = np.array([1,1]) # uncomment this
return r
res = ndimage.generic_filter(a, myfunc, footprint=footprint)
Run Code Online (Sandbox Code Playgroud) 假设这X是numpy.ndarray一个包含一组彩色图像的张量。例如,X的形状是(100, 3, 32, 32); 即,我们有 100 张 32x32 rgb 图像(例如由 CIFAR 数据集提供的图像)。
我想旋转图像X,我发现这可以使用scipy 的 scipy.ndimage.interpolation.rotate函数来完成。
但是,我每次只能对单个图像和单个颜色通道正确执行此操作,而我想一次对所有图像和所有颜色通道应用该功能。
到目前为止,我尝试并有效的方法如下:
import scipy.ndimage.interpolation
image = X[0,0,:,:]
rotated_image = scipy.ndimage.interpolation.rotate(input=image, angle=45, reshape=False)
Run Code Online (Sandbox Code Playgroud)
但我想做的事,看起来像这样
X_rot = scipy.ndimage.interpolation.rotate(input=X, angle=45, reshape=False)
Run Code Online (Sandbox Code Playgroud)
不起作用。
有没有办法申请scipy.ndimage.interpolation.rotate像numpy.ndarray张量这样的一批图像X?
无论如何,有没有更好的方法来有效地旋转一批图像(存储在 a 中numpy.ndarray)?
我试图重现的输出值scipy的ndimage.affine_transform功能,但似乎我使用的是不同的‘立方’内插方案相比scipy实现。
让我们看一个非常简单的示例(不是您想使用三次插值的数据,而是易于理解的数据)。为了检查值,我实现了统一的Catmull-Rom样条曲线。我的小型实现示例:
import numpy as np
from scipy.ndimage import affine_transform
def catmull_rom_interp(p0, p1, p2, p3, x):
return (
(-0.5 * p0 + 1.5 * p1 - 1.5 * p2 + 0.5 * p3) * (x ** 3)
+ (p0 - 2.5 * p1 + 2 * p2 - 0.5 * p3) * (x ** 2)
+ (-0.5 * p0 + 0.5 * p2) * x
+ p1
)
image = …Run Code Online (Sandbox Code Playgroud) 我试图通过删除所有完全隔离的单个单元来减少二进制python数组中的噪声,即如果它们完全被其他"0"包围,则将"1"值单元设置为0.通过使用循环删除大小等于1的blob,我已经能够获得一个有效的解决方案,但对于大型数组来说,这似乎是一个非常低效的解决方案:
import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt
# Generate sample data
square = np.zeros((32, 32))
square[10:-10, 10:-10] = 1
np.random.seed(12)
x, y = (32*np.random.random((2, 20))).astype(np.int)
square[x, y] = 1
# Plot original data with many isolated single cells
plt.imshow(square, cmap=plt.cm.gray, interpolation='nearest')
# Assign unique labels
id_regions, number_of_ids = ndimage.label(square, structure=np.ones((3,3)))
# Set blobs of size 1 to 0
for i in xrange(number_of_ids + 1):
if id_regions[id_regions==i].size == 1:
square[id_regions==i] = 0
# Plot desired …Run Code Online (Sandbox Code Playgroud) 我注意到scipy.ndimage.zoom的结果取决于原始图像的大小。在下面的代码示例中,将生成一个棋盘图像,然后使用ndimage.zoom进行缩放。如果一个棋盘格拼贴仅为2x2像素,则缩放系数似乎太大,并且裁剪出了生成的图像。相反,如果图块的尺寸为10x10,则结果看起来不错。
from __future__ import division
import numpy as np
from scipy import ndimage, misc
import wx
y,x = 2,2 # change tile size here
imgdata = np.zeros((y,x),dtype='uint8')
imgdata[y/2:,x/2:] = 255
imgdata[:y/2,:x/2] = 255
imgdata = np.tile(imgdata,(4,4))
imgdata = np.array((imgdata,imgdata,imgdata))
d,y,x = imgdata.shape
zoom = 200.0/y
w, h = int(x*zoom), int(y*zoom)
app = wx.App(None)
zoomed = np.ascontiguousarray(ndimage.interpolation.zoom(imgdata,[1,zoom, zoom],order=0).transpose((1,2,0)), dtype='uint8')
image = wx.ImageFromBuffer(w, h, zoomed)
image.SaveFile('zoomed.png',wx.BITMAP_TYPE_PNG)
Run Code Online (Sandbox Code Playgroud)
据我所知,我一直在使用scipy.misc.imresize,它没有显示此行为,但我想避免对PIL的其他依赖。
我是在做错什么还是缩放错误?
鉴于其中有一些不规则物体的图像,我想找到它们各自的直径.
感谢这个答案,我知道如何识别对象.但是,是否可以测量图像中显示的对象的最大直径?
我查看了scipy-ndimage文档,但没有找到专用函数.
对象识别代码:
import numpy as np
from scipy import ndimage
from matplotlib import pyplot as plt
# generate some lowpass-filtered noise as a test image
gen = np.random.RandomState(0)
img = gen.poisson(2, size=(512, 512))
img = ndimage.gaussian_filter(img.astype(np.double), (30, 30))
img -= img.min()
img /= img.max()
# use a boolean condition to find where pixel values are > 0.75
blobs = img > 0.75
# label connected regions that satisfy this condition
labels, nlabels = ndimage.label(blobs) …Run Code Online (Sandbox Code Playgroud) 更新:
我创建了一个记录良好的ipython笔记本.如果您只想要代码,请查看第一个答案.
题
我有40x40x40的灰度值.这需要旋转/移位/剪切.
这是一个有用的同类转换集合:http://www.lfd.uci.edu/~gohlke/code/transformations.py.html
我需要像处理一对(位置矢量,值)来处理我体积中的每个体素.然后我将变换位置并从变换矢量集合中为每个坐标采样新值.
抽样似乎相当困难,我很高兴找到这个:https: //docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.ndimage.affine_transform.html#scipy.ndimage.affine_transform
给定的矩阵和偏移用于通过仿射变换为输出中的每个点找到输入中的对应坐标.这些坐标处的输入值由所请求顺序的样条插值确定.根据给定的模式填充输入边界之外的点.
听起来很完美.
但用法非常棘手.这里有人使用该代码来旋转图像.他的旋转矩阵是2x2,所以它不是同质坐标.我尝试将同源坐标(2D)中的平移矩阵传递给函数:
dim =10
arr=np.zeros((dim,dim))
arr[0,0]=1
mat=np.array([[1,0,1],[0,1,0],[0,0,1]])
out3=scipy.ndimage.affine_transform(arr,mat)
print("out3: ",out3)
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
Traceback (most recent call last):
File "C:/Users/212590884/PycharmProjects/3DAugmentation/main.py", line 32, in <module>
out3=scipy.ndimage.affine_transform(arr,mat)
File "C:\Users\212590884\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\ndimage\interpolation.py", line 417, in affine_transform
raise RuntimeError('affine matrix has wrong number of rows')
RuntimeError: affine matrix has wrong number of rows
Run Code Online (Sandbox Code Playgroud)
显然,这不适用于齐次坐标.如何使用它来移动数据?
这只是在2D中,在3D中我甚至无法旋转音量:
dim =10
arr=np.zeros((dim,dim,dim))
arr[0,0]=1
angle=10/180*np.pi
c=np.cos(angle)
s=np.sin(angle)
mat=np.array([[c,-s,0,0],[s,c,0,0],[0,0,1,0],[0,0,0,1]])
out3=scipy.ndimage.affine_transform(arr,mat)
print("out3: ",out3)
Run Code Online (Sandbox Code Playgroud)
错误消息是相同的: affine matrix has wrong number …
ndimage ×10
python ×10
scipy ×7
numpy ×5
geometry ×1
pdf ×1
python-2.6 ×1
rotation ×1
scikit-image ×1
wand ×1