如何将用户生成的线性滤波器(作为一个小的二维数组给出)应用于图像?我可以用 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
:
https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.ndimage.generic_filter.html