备注
转到结尾 下载完整示例代码。或在您的浏览器中通过 Binder 运行此示例。
估计模糊强度#
此示例展示了在 measure.blur_effect
中实现的指标如何表现,既作为模糊强度的函数,也作为再模糊滤波器大小的函数。这个无参考的感知模糊指标在 [1] 中描述。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy.ndimage as ndi
import plotly
import plotly.express as px
from skimage import color, data, measure
生成一系列逐渐模糊的图像#
让我们加载一个可通过 scikit-image 的数据注册表获得的图像。模糊度量适用于单通道图像。
image = data.astronaut()
image = color.rgb2gray(image)
让我们用一系列尺寸逐渐增大的均匀滤波器来模糊这张图像。
blurred_images = [ndi.uniform_filter(image, size=k) for k in range(2, 32, 2)]
img_stack = np.stack(blurred_images)
fig = px.imshow(
img_stack,
animation_frame=0,
binary_string=True,
labels={'animation_frame': 'blur strength ~'},
)
plotly.io.show(fig)
绘制模糊度指标#
让我们计算所有模糊图像的模糊度量:我们预计随着模糊强度的增加,它将趋向于1。我们为三种不同的重模糊滤波器值计算它:3、11(默认)和30。
B = pd.DataFrame(
data=np.zeros((len(blurred_images), 3)),
columns=['h_size = 3', 'h_size = 11', 'h_size = 30'],
)
for ind, im in enumerate(blurred_images):
B.loc[ind, 'h_size = 3'] = measure.blur_effect(im, h_size=3)
B.loc[ind, 'h_size = 11'] = measure.blur_effect(im, h_size=11)
B.loc[ind, 'h_size = 30'] = measure.blur_effect(im, h_size=30)
B.plot().set(
xlabel='blur strength (half the size of uniform filter)', ylabel='blur metric'
)
plt.show()
我们可以看到,一旦模糊强度大于(达到)均匀滤波器的大小,该指标就会接近1,因此随着模糊强度的增加,它渐近地趋向于1。11像素的值给出了一个与人类感知最相关的模糊度量。这就是为什么它是感知模糊度量 measure.blur_effect
实现中的默认值。
脚本总运行时间: (0 分钟 1.487 秒)