使用scikit-image进行图像滤波?
我之前用的是Matlab,现在想转到Python,但在Python/skimage中还有几个基本操作我还没搞明白:
我怎么才能把用户自己生成的线性滤波器(一个小的二维数组)应用到一张图片上?我可以用scipy.ndimage.convolve做到这一点,但在skimage中有没有类似的方法呢?
在Matlab中,图像过滤的结果总是和输入的数字类型相同,无论是uint8还是float。skimage也是这样吗?
skimage里面有没有模糊去锐化的功能?(我在PIL里找到了一个模糊去锐化的滤波器,但用起来有点麻烦,因为PIL用的是自己的Image类,而不是ndarray)。
有没有什么方法,类似于Matlab的“colfilt”,让用户可以对图像应用非线性滤波?这个想法是用户提供一个函数,这个函数从一个3x3的数组中产生一个数字;然后这个函数就可以作为空间滤波器应用到整张图片上。
1 个回答
我怎么才能把用户自己生成的线性滤波器(用一个小的二维数组表示)应用到一张图片上呢?我可以用scipy.ndimage.convolve来做到这一点,但在skimage中有没有类似的方法?
scikit-image
(以及其他scikit项目)的目标是扩展scipy的功能。一般来说,小一些、专注的项目发展得比大项目快。它尽量不重复已有的功能,只有在能改进这些功能时才会重复。
在Matlab中,图像滤波总是返回与输入相同的数值类型,无论是uint8还是float。skimage的表现也是这样吗?
不,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