5

我正在从 Matlab 背景迁移到 python,并且在 Python/skimage 中我还没有征服一些基本操作:

  1. 如何将用户生成的线性滤波器(作为一个小的二维数组给出)应用于图像?我可以用 scipy.ndimage.convolve 做到这一点,但是 skimage 有方法吗?

  2. 在 Matlab 中,图像过滤总是返回与其输入相同的数字类型的结果,无论是 uint8 还是 float。skimage 的行为方式是否相同?

  3. skimage 是否在某处包含不清晰的遮罩?(我在 PIL 中发现了一个不清晰的掩蔽过滤器,但这有点痛苦,因为 PIL 使用它自己的 Image 类,而不是 ndarrays)。

  4. 有没有一种方法,可能类似于 Matlab 的“colfilt”,用户可以通过它对图像应用非线性过滤器?这个想法是用户提供一个函数,该函数从 3x3 数组中生成单个数字,例如;然后将该函数作为空间滤波器应用于整个图像。

4

1 回答 1

12

如何将用户生成的线性滤波器(作为一个小的二维数组给出)应用于图像?我可以用 scipy.ndimage.convolve 做到这一点,但是 skimage 有方法吗?

scikit-image(以及一般的 scikits)的目标是扩展 scipy 的功能。(更小、更专注的项目往往比大型项目发展得更快。)它尽量不复制任何功能,并且只有在可以改进该功能时才会这样做。

在 Matlab 中,图像过滤总是返回与其输入相同的数字类型的结果,无论是 uint8 还是 float。skimage 的行为方式是否相同?

不,没有这样的保证。有时转换为单一类型会更有效。(有时,这只是缺乏时间/人力。)以下是有关此事的一些文档:

http://scikit-image.org/docs/0.9.x/user_guide/data_types.html#output-types

如果您需要某种类型,则有一些方便的方法(例如img_as_floatimg_as_ubyte)来转换图像(它们会检查输入类型是否是所需的类型,因此您不会浪费时间进行不必要的转换)。

skimage 是否在某处包含不清晰的遮罩?(我在 PIL 中发现了一个不清晰的掩蔽过滤器,但这有点痛苦,因为 PIL 使用它自己的 Image 类,而不是 ndarrays)。

不是我知道的,但你可以自己动手。像下面这样的东西会起作用:

from skimage import data
from skimage import filter
from skimage import img_as_float
import matplotlib.pyplot as plt


unsharp_strength = 0.8
blur_size = 8  # Standard deviation in pixels.

# Convert to float so that negatives don't cause problems
image = img_as_float(data.camera())
blurred = filter.gaussian_filter(image, blur_size)
highpass = image - unsharp_strength * blurred
sharp = image + highpass


fig, axes = plt.subplots(ncols=2)
axes[0].imshow(image, vmin=0, vmax=1)
axes[1].imshow(sharp, vmin=0, vmax=1)
plt.show()

自制不锐化掩码

然而,有许多方法可以实现非锐化掩蔽。

有没有一种方法,可能类似于 Matlab 的“colfilt”,用户可以通过它对图像应用非线性过滤器?这个想法是用户提供一个函数,该函数从 3x3 数组中生成单个数字,例如;然后将该函数作为空间滤波器应用于整个图像。

不在 中scikit-image,但在 中具有通用过滤功能scipy.ndimage

https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.ndimage.generic_filter.html

于 2014-04-25T04:25:51.417 回答