Индекс структурного сходства, пиковое отношение сигнала к шуму
При сравнении изображений среднеквадратичная погрешность (MSE), хотя и легко вычисляется, может быть не очень хорошим показателем их воспринимаемого сходства.
Индекс структурного сходства (SSIM) призван устранить этот недостаток: он учитывает текстуру и присваивает более высокую оценку изображениям, которые могут казаться похожими.
using Images, TestImages
using Random
img_orig = float64.(testimage("cameraman"))
Мы используем изображение в оттенках серого из пакета 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)
Мы используем функцию 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
также должен быть вектором.
Справочные материалы
-
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.
-
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.