使用scikit-image进行图像过滤?

时间:2014-04-22 00:22:12

标签: python python-imaging-library scikit-image

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

  1. 如何将用户生成的线性滤镜(以小型2d数组给出)应用于图像?我可以用scipy.ndimage.convolve来做,但是在skimage中有一个方法吗?

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

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

  4. 有没有一种方法,可能类似于Matlab" colfilt"用户可以通过它将非线性滤镜应用于图像?这个想法是用户提供一个功能,从3x3阵列产生一个数字,比如说;然后该功能作为空间过滤器应用于整个图像。

1 个答案:

答案 0 :(得分:8)

  

如何将用户生成的线性滤镜(以小型2d数组给出)应用于图像?我可以用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()

Homebrew unsharp-mask

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

  

有没有一种方法,可能类似于Matlab" colfilt"用户可以通过它将非线性滤镜应用于图像?这个想法是用户提供一个功能,从3x3阵列产生一个数字,比如说;然后该功能作为空间过滤器应用于整个图像。

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

http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.generic_filter.html