Примечание
Перейти к концу, чтобы загрузить весь пример кода. Или запустить этот пример в браузере через JupyterLite или Binder
Сглаживание изображения с помощью обучения словарям
Пример, сравнивающий эффект восстановления шумных фрагментов изображения лица енота, используя сначала онлайн обучение словарям и различные методы преобразования.
Словарь подгоняется к искажённой левой половине изображения, и затем используется для восстановления правой половины. Обратите внимание, что ещё лучшей производительности можно достичь, подгоняя к неискажённому (т.е. без шума) изображению, но здесь мы исходим из предположения, что оно недоступно.
Общая практика для оценки результатов сглаживания изображения заключается в анализе разницы между восстановленным и исходным изображением. Если восстановление идеальное, то это будет выглядеть как гауссовский шум.
Из графиков видно, что результаты Метода ортогонального преследования (OMP) с двумя ненулевыми коэффициентами несколько менее смещены, чем при сохранении только одного (края выглядят менее выраженными). Кроме того, он ближе к истине в норме Фробениуса.
Результат Регрессии по наименьшему углу сильно смещён: разница напоминает локальное значение интенсивности исходного изображения.
Порогование явно не пригодно для сглаживания, но оно представлено здесь для демонстрации того, что оно может давать наглядный результат с очень высокой скоростью, и, следовательно, может быть полезно для других задач, таких как классификация объектов, где производительность не обязательно связана с визуализацией.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Сгенерировать искажённое изображение
import numpy as np
try: # Scipy >= 1.10
from scipy.datasets import face
except ImportError:
from scipy.misc import face
raccoon_face = face(gray=True)
# Convert from uint8 representation with values between 0 and 255 to
# a floating point representation with values between 0 and 1.
raccoon_face = raccoon_face / 255.0
# downsample for higher speed
raccoon_face = (
raccoon_face[::4, ::4]
+ raccoon_face[1::4, ::4]
+ raccoon_face[::4, 1::4]
+ raccoon_face[1::4, 1::4]
)
raccoon_face /= 4.0
height, width = raccoon_face.shape
# Distort the right half of the image
print("Distorting image...")
distorted = raccoon_face.copy()
distorted[:, width // 2 :] += 0.075 * np.random.randn(height, width // 2)
Distorting image...
Отобразить искажённое изображение
import matplotlib.pyplot as plt
def show_with_diff(image, reference, title):
"""Helper function to display denoising"""
plt.figure(figsize=(5, 3.3))
plt.subplot(1, 2, 1)
plt.title("Image")
plt.imshow(image, vmin=0, vmax=1, cmap=plt.cm.gray, interpolation="nearest")
plt.xticks(())
plt.yticks(())
plt.subplot(1, 2, 2)
difference = image - reference
plt.title("Difference (norm: %.2f)" % np.sqrt(np.sum(difference**2)))
plt.imshow(
difference, vmin=-0.5, vmax=0.5, cmap=plt.cm.PuOr, interpolation="nearest"
)
plt.xticks(())
plt.yticks(())
plt.suptitle(title, size=16)
plt.subplots_adjust(0.02, 0.02, 0.98, 0.79, 0.02, 0.2)
show_with_diff(distorted, raccoon_face, "Distorted image")

Извлечь эталонные фрагменты
from time import time
from sklearn.feature_extraction.image import extract_patches_2d
# Extract all reference patches from the left half of the image
print("Extracting reference patches...")
t0 = time()
patch_size = (7, 7)
data = extract_patches_2d(distorted[:, : width // 2], patch_size)
data = data.reshape(data.shape[0], -1)
data -= np.mean(data, axis=0)
data /= np.std(data, axis=0)
print(f"{data.shape[0]} patches extracted in %.2fs." % (time() - t0))
Extracting reference patches... 22692 patches extracted in 0.01s.
Обучить словарь по эталонным фрагментам
from sklearn.decomposition import MiniBatchDictionaryLearning
print("Learning the dictionary...")
t0 = time()
dico = MiniBatchDictionaryLearning(
# increase to 300 for higher quality results at the cost of slower
# training times.
n_components=50,
batch_size=200,
alpha=1.0,
max_iter=10,
)
V = dico.fit(data).components_
dt = time() - t0
print(f"{dico.n_iter_} iterations / {dico.n_steps_} steps in {dt:.2f}.")
plt.figure(figsize=(4.2, 4))
for i, comp in enumerate(V[:100]):
plt.subplot(10, 10, i + 1)
plt.imshow(comp.reshape(patch_size), cmap=plt.cm.gray_r, interpolation="nearest")
plt.xticks(())
plt.yticks(())
plt.suptitle(
"Dictionary learned from face patches\n"
+ "Train time %.1fs on %d patches" % (dt, len(data)),
fontsize=16,
)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)

Learning the dictionary... 2.0 iterations / 125 steps in 15.62.
Извлечь шумные фрагменты и восстановить их с помощью словаря
from sklearn.feature_extraction.image import reconstruct_from_patches_2d
print("Extracting noisy patches... ")
t0 = time()
data = extract_patches_2d(distorted[:, width // 2 :], patch_size)
data = data.reshape(data.shape[0], -1)
intercept = np.mean(data, axis=0)
data -= intercept
print("done in %.2fs." % (time() - t0))
transform_algorithms = [
("Orthogonal Matching Pursuit\n1 atom", "omp", {"transform_n_nonzero_coefs": 1}),
("Orthogonal Matching Pursuit\n2 atoms", "omp", {"transform_n_nonzero_coefs": 2}),
("Least-angle regression\n4 atoms", "lars", {"transform_n_nonzero_coefs": 4}),
("Thresholding\n alpha=0.1", "threshold", {"transform_alpha": 0.1}),
]
reconstructions = {}
for title, transform_algorithm, kwargs in transform_algorithms:
print(title + "...")
reconstructions[title] = raccoon_face.copy()
t0 = time()
dico.set_params(transform_algorithm=transform_algorithm, **kwargs)
code = dico.transform(data)
patches = np.dot(code, V)
patches += intercept
patches = patches.reshape(len(data), *patch_size)
if transform_algorithm == "threshold":
patches -= patches.min()
patches /= patches.max()
reconstructions[title][:, width // 2 :] = reconstruct_from_patches_2d(
patches, (height, width // 2)
)
dt = time() - t0
print("done in %.2fs." % dt)
show_with_diff(reconstructions[title], raccoon_face, title + " (time: %.1fs)" % dt)
plt.show()
Extracting noisy patches... done in 0.00s. Orthogonal Matching Pursuit 1 atom... done in 0.57s. Orthogonal Matching Pursuit 2 atoms... done in 1.25s. Least-angle regression 4 atoms... done in 8.95s. Thresholding alpha=0.1... done in 0.10s.
Общее время выполнения скрипта: (0 минут 27.779 секунд)
Похожие примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/decomposition/plot_image_denoising.html



