标签: ndimage

如何将魔杖图像对象转换为 numpy 数组(没有 OpenCV)?

我正在使用Wand将 pdf 文件转换为图像。然后,我使用 ndimage 进行进一步的图像处理。

我想直接将 Wand 图像转换为 ndarray ......我在这里看到了答案,但它使用 OpenCV。这可能不使用 OpenCV 吗?

目前我保存了一个临时文件,它用 scipy.misc.imread() 重新打开

python pdf numpy wand ndimage

7
推荐指数
1
解决办法
3620
查看次数

移位插值不会产生预期的行为

当使用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)

python interpolation scipy ndimage

7
推荐指数
1
解决办法
350
查看次数

使用 ndimage.maximum_filter 和 skimage.peak_local_max 查找图像峰值

我试图找到给定图像的一些相对最大值。据我所知,有两种可能的方法,第一种是使用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)

python scikit-image ndimage

7
推荐指数
1
解决办法
5996
查看次数

具有多维(或非标量)输出的Scipy滤波器

是否有类似于支持向量输出ndimagegeneric_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)

python numpy image-processing scipy ndimage

6
推荐指数
1
解决办法
662
查看次数

使用 `scipy.ndimage.interpolation.rotate` 旋转一批图像

假设这Xnumpy.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)?

python rotation scipy batch-processing ndimage

6
推荐指数
1
解决办法
626
查看次数

scipy ndimage对affine_transform使用哪种三次样条方法?

背景/背景

我试图重现的输出值scipyndimage.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 scipy ndimage

6
推荐指数
1
解决办法
78
查看次数

从Python数组中删除完全隔离的单元格?

我试图通过删除所有完全隔离的单个单元来减少二进制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)

python numpy python-2.6 scipy ndimage

5
推荐指数
1
解决办法
2240
查看次数

scipy.ndimage.zoom结果取决于图像大小

我注意到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)

02x02磁贴: 2x2磁贴

10x10磁贴: 10x10磁贴

据我所知,我一直在使用scipy.misc.imresize,它没有显示此行为,但我想避免对PIL的其他依赖。

我是在做错什么还是缩放错误?

python interpolation scipy ndimage

5
推荐指数
1
解决办法
1177
查看次数

如何在Python中使用图像处理找到对象的直径?

鉴于其中有一些不规则物体的图像,我想找到它们各自的直径.

感谢这个答案,我知道如何识别对象.但是,是否可以测量图像中显示的对象的最大直径?

我查看了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)

python geometry numpy image-processing ndimage

5
推荐指数
1
解决办法
4076
查看次数

使用numpy/scipy转换和重新采样3D卷

更新:

我创建了一个记录良好的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 …

python numpy scipy geometry-shader ndimage

5
推荐指数
1
解决办法
3153
查看次数