我从Matlab背景转移到python,并且还有一些基本的操作我还没有在Python / skimage中征服:
如何将用户生成的线性滤镜(以小型2d数组给出)应用于图像?我可以用scipy.ndimage.convolve来做,但是在skimage中有一个方法吗?
在Matlab中,图像过滤总是返回与其输入相同的数字类型的结果,无论是uint8还是float。 skimage的行为方式是否相同?
skimage是否在某处包含反锐化遮蔽? (我在PIL中发现了一个非锐化的屏蔽过滤器,但这有点痛苦,因为PIL使用自己的Image类,而不是ndarrays)。
有没有一种方法,可能类似于Matlab" colfilt"用户可以通过它将非线性滤镜应用于图像?这个想法是用户提供一个功能,从3x3阵列产生一个数字,比如说;然后该功能作为空间过滤器应用于整个图像。
答案 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_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()
然而,有许多方法可以实现反锐化掩模。
有没有一种方法,可能类似于Matlab" colfilt"用户可以通过它将非线性滤镜应用于图像?这个想法是用户提供一个功能,从3x3阵列产生一个数字,比如说;然后该功能作为空间过滤器应用于整个图像。
不在scikit-image
,但scipy.ndimage
中有通用过滤功能:
http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.generic_filter.html