Документация Engee

Индекс структурного сходства, пиковое отношение сигнала к шуму

При сравнении изображений среднеквадратичная погрешность (MSE), хотя и легко вычисляется, может быть не очень хорошим показателем их воспринимаемого сходства.

Индекс структурного сходства (SSIM) призван устранить этот недостаток: он учитывает текстуру и присваивает более высокую оценку изображениям, которые могут казаться похожими.

using Images, TestImages
using Random

img_orig = float64.(testimage("cameraman"))
xyjhnpu

Мы используем изображение в оттенках серого из пакета TestImages, который содержит стандартный набор тестовых изображений. Типы float, float32 и float64 сохраняют информацию о цветовых составляющих, поэтому изображение теперь состоит из пикселей типа Gray{Float64}.

assess_ssim(img_orig, img_orig)
1.0

Функция assess_ssim, которая принимает два изображения в качестве входных данных и возвращает их индекс структурного сходства, является самым простым способом вычисления SSIM двух изображений.

Оценка SSIM 1.00 означает идеальное структурное сходство, чего и следовало ожидать для идентичных изображений.

Теперь создадим два варианта исходного изображения: На изображении image_const слева интенсивность всех пикселей увеличена в 0.2 раза на диапазон интенсивности, в то время как на изображении image_noise справа интенсивность некоторых пикселей увеличена, а интенсивность остальных уменьшена на ту же величину. Выглядят эти два изображения совершенно по-разному.

noise = ones(size(img_orig)) .* 0.2 .* (maximum(img_orig) - minimum(img_orig))
img_const = img_orig + noise

mask = rand(Float64, size(img_orig)) .< 0.5
noise[mask] = noise[mask] .* -1
img_noise = img_orig + noise

mosaicview(img_const, img_noise; nrow=1)
mllouue

Мы используем функцию mse, определенную в ImageDistances, для вычисления среднеквадратичной погрешности между исходным и двумя измененными изображениями.

mse(img_orig, img_const), mse(img_orig, img_noise)
(0.039999999999999016, 0.039999999999999016)

Несмотря на визуальные различия, оба изображения имеют одинаковую среднеквадратичную погрешность 0.400 по сравнению с оригиналом. Это показывает, что в некоторых случаях MSE может не отражать воспринимаемое сходство изображений.

assess_ssim(img_orig, img_const), assess_ssim(img_orig, img_noise)
(0.8406360281731596, 0.1045754516237563)

Оценки SSIM изображений существенно различаются, причем image_const оценивается гораздо ближе к исходному изображению с точки зрения воспринимаемого сходства, что соответствует наблюдению.

Пользовательские параметры

Хотя функция assess_ssim является удобным способом вычисления SSIM двух изображений, она не позволяет передавать пользовательские параметры в алгоритм SSIM. Для этого есть следующий синтаксис.

iqi = SSIM(KernelFactors.gaussian(2.0, 11), (0.5, 0.5, 0.5))
assess(iqi, img_orig, img_const)
0.9085673404877026

Здесь первый параметр — это ядро, используемое для взвешивания соседства каждого пикселя при локальном вычислении SSIM, по умолчанию KernelFactors.gaussian(1.5, 11). Второй параметр — это набор весов (α, β, γ), присваиваемых членам яркости (L), контрастности © и структуры (S) при вычислении SSIM, по умолчанию (1.0, 1.0, 1.0). Напомним, что SSIM определяется как Lᵅ × Cᵝ × Sᵞ.

Пиковое отношение сигнала к шуму

Пиковое отношение сигнала к шуму (PSNR) используется для измерения качества изображения в присутствии шума и искажений. Именно соотношение между максимально возможной мощностью сигнала и мощностью искажающего шума влияет на точность представления.

Для монохромного изображения I размером m×n без шума и соответствующего зашумленного изображение K MSE определяется следующим образом:

PSNR (в дБ) определяется следующим образом:

Здесь или пиковое значение — это максимально возможное значение пикселя на изображении, которое может быть передано в функции assess_psnr, например assess_psnr(K, I, [1.0]) для монохромных изображений или assess_psnr(K, I, [1.0,1.0,1.0]) для многоканальных.

peakval = maximum(img_orig) .|> Float64 # пиковое значение — это максимальное значение пикселя на исходном изображении
assess_psnr(img_noise, img_orig, [peakval]) # 13.979400086720483
1-element Vector{Float64}:
 13.979400086720483

Давайте изменим содержимое зашумленного изображения перед применением PSNR. Обратите внимание, что передавать пиковое значение не обязательно, так как его можно вычислить автоматически.

noise = ones(size(img_orig)) .* 0.2 .* (maximum(img_orig) - minimum(img_orig))
mask = rand(Float64, size(img_orig)) .< 0.5
noise[mask] = noise[mask] .* -3
img_noise = img_orig + noise

assess_psnr(img_noise, img_orig)
6.994978188506817

Как правило, для изображения K не в оттенках серого PSNR сообщается для каждого канала I и выводится Vector; peakval также должен быть вектором.

Справочные материалы

  1. Zhou Wang; Bovik, A. C. Mean squared error: Love it or leave it? A new look at Signal Fidelity Measures. Signal Processing Magazine, IEEE, vol. 26, no. 1, pp. 98—​117, Jan. 2009.

  2. Z. Wang, A. C. Bovik, H. R. Sheikh and E. P. Simoncelli. Image quality assessment: From error visibility to structural similarity. IEEE Transactions on Image Processing, vol. 13, no. 4, pp. 600—​612, Apr. 2004.


Эта страница была создана с помощью DemoCards.jl и Literate.jl.