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

Ala*_*air 3 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阵列产生一个数字,比如说; 然后该功能作为空间滤镜应用于整个图像.

Ton*_* Yu 9

如何将用户生成的线性过滤器(以小型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_float,有一些方便的方法(例如img_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()
Run Code Online (Sandbox Code Playgroud)

自制非锐化面具

但是,有许多方法可以实现反锐化掩模.

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

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

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