Вычислительное зрение — изображение, качество, оценка

компьютерное зрение
Вычислительное зрение — изображение, качество, оценка

задний план

Однажды по прихоти я искал волну оценки качества изображения на Zhihu и нашел следующий абзац: «Исследователи в области оценки качества изображения сказали, что «оценка качества поливает»; аспиранты также в панике из-за быть вынужденным заниматься этим направлением своими руководителями: «Качество изображения оценивает первокурсник, первый год обучения, научный руководитель не разрешает мне делать проекты, что мне делать, чтобы в будущем я смог найти хорошую работу» ?», добросердечные люди дают советы и предложения «Лучший выбор в соответствии с вашей ситуацией — не идти в аспирантуру. А теперь идите прямо на работу», — сказал человек, чье направление IQA вот-вот сведет с ума его начальник. «Я думаю (оценка качества изображения) бессмысленна»; сомнения публики в действительном значении оценки качества следуют одно за другим: «Зачем мы оцениваем качество изображений. Другими словами, какие практические приложения мы имеем для оценки качества?» изображений?Во-первых, на данном этапе академические оценки - это всевозможные базы данных и искаженные изображения.Сотни методов были предложены, но даже перед лицом естественных баз данных изображений я все еще чувствую себя бессильным;во-вторых, стандарты оценки люди очень сложны, и система оценки, скрытая в базе данных, представляет собой оценку только тех, кого опрашивают, и не обязательно соответствует визуальной согласованности всего человека.Тогда нет ни полностью правильного эталонного Стандарта, и нет практического применения обобщения, в чем смысл тысяч основных журналов для оценки качества изображения каждый год?» (Вышеприведенный контент взят от Zhihu)

На самом деле, оценка качества изображения ни в коем случае не является зверем наводнения и не «просто наводнением». С моей личной точки зрения, я думаю, что эта область больше похожа на исследование, которое обслуживает часть области изображения, с большим упором на академические приложения, а не на инженерные приложения. По сути, то, что делает Оценка качества изображения (IQA), на самом деле исследует основные законы, лежащие в основе оценки человеческого зрения, например, какие изображения люди считают «плохим визуальным опытом» и как количественно описывать людей. довольно интересно.Единственным недостатком является то, что это трудно применить к инженерным приложениям. Нынешние популярные направления, такие как машинное обучение, глубокое обучение и обучение с подкреплением, также известны как «научные исследования, изучающие модели и способы мышления людей», но на самом деле это зависит от информатики, чтобы раскрыть основные законы мышления человеческого мозга. Не то, что наше поколение может засвидетельствовать. Текущее «обучение» все еще находится в застое на этапе обучения нелинейной модели с помощью набора данных, чтобы минимизировать ошибку функции потерь.

Возвращаясь к теме этой статьи, изображениям, качеству и оценке, почему мы должны оценивать качество изображений, на самом деле легко объяснить: если нет набора авторитетных и унифицированных количественных показателей, то все скажут, когда проведут эксперименты и опубликуют "Метод, предложенный в этой статье, лучше, чем современный метод (самый передовой метод)", потому что нет эталона измерения, все будут пускать птиц и летать по желанию. Во избежание этой ситуации, а также для обеспечения строгости научных исследований рождается оценка качества изображения. Итак, сначала я оценю эту область как «эту область больше похожа на исследование, которое обслуживает часть поля изображения, и оно больше ориентировано на академические приложения, чем на инженерные приложения». Ведь инженерные приложения не заботятся об оценке качества изображения. Если пользователи считают, что это хорошо, то это хорошо. А академические исследования больше сосредоточены на количественной оценке. Хорошие показатели — это хорошо. Не могут быть признаны? Что ж, IQA для оценки качества изображения как раз об этом. Конечно, иногда IQA также играет роль в инженерных приложениях, например, при формулировании отраслевых стандартов и национальных стандартов (например, декан колледжа блоггеров сформулировал очень авторитетный стандарт в полиграфической отрасли, поэтому иногда IQA также можно использовать для приложений, не связанных с академическими, предоставляют справку), IQA может пригодиться в это время, но в целом промышленные приложения не пользуются спросом на IQA.

Полная ссылка и слепая оценка

IQA делится на два случая для обсуждения, первый случай заключается в том, что у нас есть эталонное изображение (эталонное изображение), называемое полной оценкой качества эталонного (полного эталона) изображения; другой случай не является эталонным (слепым) оценкой качества изображения. На самом деле существует еще и тип полуэталонного изображения, но из-за отсутствия ограниченных информационных условий этот вид исследования достаточно водянистый.Что такое полуэталон и сколько стоит полуэталон?Используемая информация ибо референс оценка качества более преувеличена чем полный референс.Что называется полуреференсом?Эталон есть эталон, а нет эталона нет эталона.Может это в середине? Плагиат есть плагиат, нет плагиата нет плагиата, какой к черту полуплагиат? Таким образом, полуссылка обычно представляет собой поле, которое не распознается или классифицируется как поле полной ссылки.

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

Полная ссылка: Сходство изображений — разница в цвете (CD)

С точки зрения векторных значений, если вы хотите измерить сходство между двумя векторами, проще думать о евклидовом расстоянии или разнице углов. Хроматическая аберрация — это евклидово расстояние в изображении, а наиболее типичным представителем является среднеквадратическая ошибка (MSE), которая хорошо изучена, как показано в следующей формуле:

MSE=\frac{1}{m\times n}\sum^m_{i=1}\sum^n_{j=1}\left( x\left(i,j \right)- y\left(i,j \right)\right)^2

в,m,nУказывает количество пикселей по длине и ширине изображения,x,yпредставляют искаженное изображение и эталонное изображение соответственно.

MSE, по сути, вычисляет цветовую разницу в цветовом пространстве sRGB, и существенная проблема заключается в том, что восприятие цвета человеческим глазом непоследовательно, а пространственная информация изображения игнорируется.

Цветовое пространство CIELAB ближе к зрительному восприятию человеческим глазом, чем цветовое пространство sRGB, а цветовое пространство L*u*v* еще больше улучшает это. Количественное изменение в любом направлении соответствует восприятию цвета человеческим глазом.

Преобразование из цветового пространства sRGB в L*u*v* происходит следующим образом:

Поскольку sRGB — это цветовое пространство, зависящее от устройства, а L*u*v* — это независимое от устройства цветовое пространство, оно должно пройти через преобразование в цветовое пространство XYZ (независимое от устройства) в качестве перехода следующим образом:

\left[ \begin{matrix} X\\ Y \\Z \end{matrix} \right]= \left[ \begin{matrix} 0.412456 & 0.357576 & 0.180438\\0.212673 & 0.715152 & 0.072175 \\0.019334 & 0.119192 & 0.950304 \end{matrix} \right] \left[ \begin{matrix} V'_R\\ V'_G \\V'_B \end{matrix} \right]

в

V'_c=\left\{ \begin{aligned} \frac{V_c}{12.92}\ \ \ \ \ \ \ \ \ \ \ \ \ \  & ,\   if \ \ V_c\le 0.04045 \\ (\frac{V_c+0.055}{1.055})^{2.4} & ,\   if \ \ V_c>0.04045 \end{aligned} \right.

в,V'_c=\frac{C}{255},C=R,G,B, R, G, B — значения трех каналов sRGB. Следует отметить, что цветовое пространство XYZ требует предварительного выбора эталонного белого цвета для определения матрицы преобразования.Здесь мы выбираем эталонный белый цвет под источником света D65 по умолчанию.

Расчет L*u*v* основан на цветовом пространстве Lu'v'. Следует отметить, что это не одно и то же. Расчет и преобразование цветового пространства Lu'v' осуществляется следующим образом:

\left\{ \begin{aligned} L= \left\{ \begin{aligned}  903.3Y\ \ \ \ \ \ \ \ \ \ \ \ \  & ,\   if \ \ Y\le 0.008856 \\ 116(Y)^{1/3}-16 & ,\   if \ \ Y>0.008856 \end{aligned} \right.\\ u'=\frac{4X}{X+15Y+3Z}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ v'=\frac{9Y}{X+15Y+3Z}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  \end{aligned} \right.

И метод расчета u*v* выглядит следующим образом:

\left\{ \begin{aligned} L^*=L\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  \\ u^*=13L^* \times (u'-u'_0) \\ v^*=13L^* \times (v'-v'_0) \  \end{aligned} \right.

вu'_0,v'_0белый для стандартной ссылкиu',v'значение, как правило, мы используем эталонный белый цвет при источнике света D65, результат(u'_{D65},v'_{D65})=(0.1978,0.4451). (Трехцветные значения XYZ эталонного белого цвета при источнике света D65 составляют(0.9505, 1, 1.088), можете проверить сами по формуле)

Цветовая разница L*u*v* — это евклидово расстояние в цветовом пространстве L*u*v*.

Полная ссылка: Сходство изображений — отношение пикового сигнала к шуму (PSNR)

Отношение пикового сигнала к шуму (PSNR), объективный стандарт для оценки изображений, PSNR — это аббревиатура от «отношение пикового сигнала к шуму». вершина означает вершину. А соотношение означает соотношение. Весь смысл в том, чтобы достичь пикового сигнала шумового отношения, psnr обычно используется для инженерного проекта между максимальным сигналом и фоновым шумом. Обычно после сжатия изображения выходное изображение обычно в некоторой степени отличается от исходного изображения. Чтобы измерить качество изображения после обработки, мы обычно обращаемся к значению PSNR, чтобы определить, является ли программа обработки удовлетворительной. Это логарифм среднеквадратичной ошибки между исходным изображением и обработанным изображением относительно (2 ^ n-1) ^ 2 (квадрат максимального значения сигнала, n - количество битов на значение выборки), а его единица измерения дБ.

Поскольку изображения и изображения по сути являются многомерными сигналами, для расчета степени искажения можно использовать PSNR, который по функциям аналогичен MSE (поскольку он решается на основе MSE, он кажется немного хулиганским), следующим образом:

PSNR=10\times \log_{10}\big ( \frac{MAX^2}{MSE} \big )

Среди них MAX — максимальное значение динамического диапазона изображения.Если для решения задачи используется диапазон по умолчанию [0,255], появится отрицательное значение, а результат после нормализации (изображение с [0,1] динамический диапазон) в норме, поэтому в расчете требуется предварительная обработка.В матлабе изображение нужно обрабатывать с ./255.

Полная ссылка: Сходство изображений - Индекс структурного сходства (SSIM)

Следующий рисунок показывает превосходство SSIM в рассмотрении структуры изображения и производительности локальной пространственной информации изображения, а также можно сказать, что он выявляет проблемы хроматической аберрации и PSNR. Как показано на рисунке ниже, значения MSE и PSNR картинок на кольце одинаковы, но с точки зрения субъективного зрения мы думаем, что верхняя картинка явно выше по качеству, чем нижняя.Но из квантованных значений MSE и PSNR качество изображения нескольких искаженных изображений на кольце одинаковое, что явно не соответствует зрительному восприятию. Это связано с тем, что человеческий глаз более чувствителен к изменениям в прилегающей области, и ни MSE, ни PSNR не учитывают информацию о пространственной информации.

Метод расчета SSIM выглядит следующим образом:

SSIM(x,y)=\frac{(2\mu_x\mu_y+c_1)(2\sigma_{xy}+c_2)}{(\mu_x^2+\mu_y^2+c_1)(\sigma_x^2+\sigma_y^2+c_1)}

в,\mu_x,\mu_yотдельные изображенияxс изображениемyсреднее значение пикселя и\sigma_x^2и\sigma_y^2представляют дисперсию изображения соответственно. иc_1=(0.01T)^2,c_2=(0.03T)^2, T представляет динамический диапазон значений пикселей изображения.

Но следует отметить, что SSIM не лучше хроматических аберраций и пикового отношения сигнал-шум во всех случаях, и каждый имеет свои преимущества в конкретных случаях, поэтому правильнее говорить об этом.

Мы можем увидеть разницу между SSIM и MSE из нескольких наборов тестовых изображений.

Можно обнаружить, что индексная карта SSIM точнее фиксирует ошибку, воспринимаемую человеческим глазом, а описание края искаженного изображения явно точнее, чем MSE. Изображение ниже иллюстрирует ту же проблему.

Давайте посмотрим на результаты квантования искажения группы изображений при MSE и SSIM.На следующем рисунке в качестве эталонного изображения используется рисунок 1, в котором изображения на рисунке 2 и рисунке 3 явно имеют более высокое визуальное качество, чем изображение 456. , а вот свет от МСЭ С точки зрения МСЭ 23456 в принципе такой же, и ССИМ на этом тестовом снимке явно показывает большие преимущества.

Слепой справочник: Насыщенность цвета - Индекс цветовой насыщенности (CCI)

Сходство изображения является типичным случаем полного эталонного изображения, потому что только при наличии эталонного изображения мы можем оценить искажение изображения. Слепая оценка качества эталонного изображения зависит от конкретного приложения.В области цвета изображения, с которой блоггеры более знакомы, насыщенность цвета CCI является широко используемым методом оценки изображения, чтобы описать богатство цветовой информации в изображении, как показано ниже:

CCI=\bar{S}+\sigma

в,\bar{S}представляет среднюю насыщенность изображения, а\sigmaПредставляет стандартное отклонение насыщенности.

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

Код боевой части

MSE

% Matlab 2017a
function MSE=MSE_compute(img1,img2)
    [m,n,k]=size(img1);
    [m2,n2,k2]=size(img2);
    if m==m2 && n==n2 && k==k2
        MSE=sqrt(sum(sum(sum((img1-img2).^2)))./(m*n));
    end
end

Lu*v* CD

function luvcd=luvcolordifference(img1,img2)

    WHITEPOINT=[0.950456,1,1.088754];
    WHITEPOINTU=(4*WHITEPOINT(1))./(WHITEPOINT(1)+15*WHITEPOINT(2)+3*WHITEPOINT(3));
    WHITEPOINTV=(9*WHITEPOINT(1))./(WHITEPOINT(1)+15*WHITEPOINT(2)+3*WHITEPOINT(3));
    [m,n,k]=size(img1);
    img1=img1+0.0000001*ones(m,n,k);
    L=zeros(m,n);
    xyz=rgb2xyz(img1./255,'WhitePoint','d65');
    u=4*xyz(:,:,1)./(xyz(:,:,1)+15.*xyz(:,:,2)+3.*xyz(:,:,3));
    v=9*xyz(:,:,2)./(xyz(:,:,1)+15.*xyz(:,:,2)+3.*xyz(:,:,3));
    for i=1:m
        for j=1:n
            if xyz(i,j,2)<=0.008856
                L(i,j)=903.3*xyz(i,j,2);
            else
                L(i,j)=116*(xyz(i,j,2)).^(1/3)-16;
            end
        end
    end
    uu=13.*L.*(u-WHITEPOINTU.*ones(m,n)); 	 
    vv=13.*L.*(v-WHITEPOINTV.*ones(m,n));


    img2=img2+0.0000001*ones(m,n,k);
    L2=zeros(m,n);
    xyz2=rgb2xyz(img2./255,'WhitePoint','d65');
    u2=4*xyz2(:,:,1)./(xyz2(:,:,1)+15.*xyz2(:,:,2)+3.*xyz2(:,:,3));
    v2=9*xyz2(:,:,2)./(xyz2(:,:,1)+15.*xyz2(:,:,2)+3.*xyz2(:,:,3));
    for i1=1:m
        for j1=1:n
            if xyz2(i1,j1,2)<=0.008856
                L2(i1,j1)=903.3*xyz2(i1,j1,2);
            else
                L2(i1,j1)=116*(xyz2(i1,j1,2)).^(1/3)-16;
            end
        end
    end
    uu2=13.*L2.*(u2-WHITEPOINTU.*ones(m,n)); 	 
    vv2=13.*L2.*(v2-WHITEPOINTV.*ones(m,n));


	luvcd = mean(mean(sqrt((L-L2).^2+(uu-uu2).^2 +(vv-vv2).^2)));
end

PSNR

function [peaksnr, snr] = psnr(A, ref, peakval)
checkImages(A,ref);
if nargin < 3
    peakval = diff(getrangefromclass(A));
else
    checkPeakval(peakval, A);
    peakval = double(peakval);
end

if isempty(A) % If A is empty, ref must also be empty
    peaksnr = zeros(0, 'like', A);
    snr     = zeros(0, 'like', A);
    return;
end

err = immse(A,ref);

peaksnr = 10*log10(peakval.^2/err);

if nargout > 1
    if isinteger(ref)  
        ref = double(ref);
    end                      
    snr = 10*log10(mean(ref(:).^2)/err);
end

end

function checkImages(A, ref)

validImageTypes = {'uint8','uint16','int16','single','double'};

validateattributes(A,validImageTypes,{'nonsparse'},mfilename,'A',1);
validateattributes(ref,validImageTypes,{'nonsparse'},mfilename,'REF',2);

if ~isa(A,class(ref))
    error(message('images:validate:differentClassMatrices','A','REF'));
end   
if ~isequal(size(A),size(ref))
    error(message('images:validate:unequalSizeMatrices','A','REF'));
end

end

function checkPeakval(peakval, A)

validateattributes(peakval,{'numeric'},{'nonnan', 'real', ...
    'nonnegative','nonsparse','nonempty','scalar'}, mfilename, ...
    'PEAKVAL',3);
if isinteger(A) && (peakval > diff(getrangefromclass(A)))
    warning(message('images:psnr:peakvalTooLarge', 'A', 'REF'));
end

end

SSIM

function [ssimval, ssimmap] = ssim(varargin)
narginchk(2,10);

[A, ref, C, exponents, radius] = parse_inputs(varargin{:});

if isempty(A)
    ssimval = zeros(0, 'like', A);
    ssimmap = A;
    return;
end

if isa(A,'int16') % int16 is the only allowed signed-integer type for A and ref.
    % Add offset for signed-integer types to bring values in the
    % non-negative range.
    A = double(A) - double(intmin('int16'));
    ref = double(ref) - double(intmin('int16'));
elseif isinteger(A)
    A = double(A);
    ref = double(ref);
end
      
% Gaussian weighting function
gaussFilt = getGaussianWeightingFilter(radius,ndims(A));

% Weighted-mean and weighted-variance computations
mux2 = imfilter(A, gaussFilt,'conv','replicate');
muy2 = imfilter(ref, gaussFilt,'conv','replicate');
muxy = mux2.*muy2;
mux2 = mux2.^2;
muy2 = muy2.^2;

sigmax2 = imfilter(A.^2,gaussFilt,'conv','replicate') - mux2;
sigmay2 = imfilter(ref.^2,gaussFilt,'conv','replicate') - muy2;
sigmaxy = imfilter(A.*ref,gaussFilt,'conv','replicate') - muxy;

% Compute SSIM index
if (C(3) == C(2)/2) && isequal(exponents(:),ones(3,1))
    % Special case: Equation 13 from [1]
    num = (2*muxy + C(1)).*(2*sigmaxy + C(2));
    den = (mux2 + muy2 + C(1)).*(sigmax2 + sigmay2 + C(2));
    if (C(1) > 0) && (C(2) > 0)
        ssimmap = num./den;
    else
        % Need to guard against divide-by-zero if either C(1) or C(2) is 0.
        isDenNonZero = (den ~= 0);           
        ssimmap = ones(size(A));
        ssimmap(isDenNonZero) = num(isDenNonZero)./den(isDenNonZero);
    end
    
else
    % General case: Equation 12 from [1] 
    % Luminance term
    if (exponents(1) > 0)
        num = 2*muxy + C(1);
        den = mux2 + muy2 + C(1); 
        ssimmap = guardedDivideAndExponent(num,den,C(1),exponents(1));
    else 
        ssimmap = ones(size(A), 'like', A);
    end
    
    % Contrast term
    sigmaxsigmay = [];
    if (exponents(2) > 0)  
        sigmaxsigmay = sqrt(sigmax2.*sigmay2);
        num = 2*sigmaxsigmay + C(2);
        den = sigmax2 + sigmay2 + C(2); 
        ssimmap = ssimmap.*guardedDivideAndExponent(num,den,C(2),exponents(2));        
    end
    
    % Structure term
    if (exponents(3) > 0)
        num = sigmaxy + C(3);
        if isempty(sigmaxsigmay)
            sigmaxsigmay = sqrt(sigmax2.*sigmay2);
        end
        den = sigmaxsigmay + C(3); 
        ssimmap = ssimmap.*guardedDivideAndExponent(num,den,C(3),exponents(3));        
    end
    
end

ssimval = mean(ssimmap(:));
    
end

% -------------------------------------------------------------------------
function component = guardedDivideAndExponent(num, den, C, exponent)

if C > 0
    component = num./den;
else
    component = ones(size(num),'like',num);
    isDenNonZero = (den ~= 0);
    component(isDenNonZero) = num(isDenNonZero)./den(isDenNonZero);
end

if (exponent ~= 1)
    component = component.^exponent;
end

end

function gaussFilt = getGaussianWeightingFilter(radius,N)
% Get 2D or 3D Gaussian weighting filter

filtRadius = ceil(radius*3); % 3 Standard deviations include >99% of the area. 
filtSize = 2*filtRadius + 1;

if (N < 3)
    % 2D Gaussian mask can be used for filtering even one-dimensional
    % signals using imfilter. 
    gaussFilt = fspecial('gaussian',[filtSize filtSize],radius);
else 
    % 3D Gaussian mask
     [x,y,z] = ndgrid(-filtRadius:filtRadius,-filtRadius:filtRadius, ...
                    -filtRadius:filtRadius);
     arg = -(x.*x + y.*y + z.*z)/(2*radius*radius);
     gaussFilt = exp(arg);
     gaussFilt(gaussFilt<eps*max(gaussFilt(:))) = 0;
     sumFilt = sum(gaussFilt(:));
     if (sumFilt ~= 0)
         gaussFilt  = gaussFilt/sumFilt;
     end
end

end

function [A, ref, C, exponents, radius] = parse_inputs(varargin)

validImageTypes = {'uint8','uint16','int16','single','double'};

A = varargin{1};
validateattributes(A,validImageTypes,{'nonsparse','real'},mfilename,'A',1);

ref = varargin{2};
validateattributes(ref,validImageTypes,{'nonsparse','real'},mfilename,'REF',2);

if ~isa(A,class(ref))
    error(message('images:validate:differentClassMatrices','A','REF'));
end
    
if ~isequal(size(A),size(ref))
    error(message('images:validate:unequalSizeMatrices','A','REF'));
end

if (ndims(A) > 3)
    error(message('images:validate:tooManyDimensions','A and REF',3));
end

% Default values for parameters
dynmRange = diff(getrangefromclass(A));        
C = [];
exponents = [1 1 1];
radius = 1.5;

args_names = {'dynamicrange', 'regularizationconstants','exponents',...
              'radius'};

for i = 3:2:nargin
    arg = varargin{i};
    if ischar(arg)        
        idx = find(strncmpi(arg, args_names, numel(arg)));
        if isempty(idx)
            error(message('images:validate:unknownInputString', arg))
            
        elseif numel(idx) > 1
            error(message('images:validate:ambiguousInputString', arg))
            
        elseif numel(idx) == 1
            if (i+1 > nargin) 
                error(message('images:validate:missingParameterValue'));             
            end
            if idx == 1
                dynmRange = varargin{i+1};
                validateattributes(dynmRange,{'numeric'},{'positive', ...
                    'finite', 'real', 'nonempty','scalar'}, mfilename, ...
                    'DynamicRange',i);
                dynmRange = double(dynmRange);
                
            elseif idx == 2
                C = varargin{i+1};
                validateattributes(C,{'numeric'},{'nonnegative','finite', ...
                    'real','nonempty','vector', 'numel', 3}, mfilename, ...
                    'RegularizationConstants',i);                              
                C = double(C);                              
                              
            elseif idx == 3
                exponents = varargin{i+1};
                validateattributes(exponents,{'numeric'},{'nonnegative', ...
                    'finite', 'real', 'nonempty','vector', 'numel', 3}, ...
                    mfilename,'Exponents',i);
                exponents = double(exponents);
                
            elseif idx == 4
                radius = varargin{i+1};
                validateattributes(radius,{'numeric'},{'positive','finite', ...
                    'real', 'nonempty','scalar'}, mfilename,'Radius',i);
                radius = double(radius);
            end
        end    
    else
        error(message('images:validate:mustBeString')); 
    end
end

% If 'RegularizationConstants' is not specified, choose default C.
if isempty(C)
    C = [(0.01*dynmRange).^2 (0.03*dynmRange).^2 ((0.03*dynmRange).^2)/2];
end

end

CCI

img=double(imread('testimage.png'));
[m,n,k]=size(img);
img_hsv=rgb2hsv(img);
S_average=mean(mean(img_hsv(:,:,2)));
S_standarddeviation=sqrt(sum(sum(1/(m*n).*(img_hsv(:,:,2)-S_average.*ones(m,n)).^2)));
CCI=S_average+S_standarddeviation

function [h, s, v] = rgb2hsv(varargin)
[r, g, b, isColorMap, isEmptyInput, isThreeChannel] = parseInputs(varargin{:});

if(~isEmptyInput)

    if(isThreeChannel)
        imageIn(:,:,1) = r;
        imageIn(:,:,2) = g;
        imageIn(:,:,3) = b;
    elseif(isColorMap)
        imageIn = reshape(varargin{1},size(varargin{1},1),1,size(varargin{1},2));
    else
        imageIn = r;        
    end

    h = images.internal.rgb2hsvmex(imageIn);

    if(nargout == 3)
        s = h(:,:,2);
        v = h(:,:,3);
        h = h(:,:,1);        
    elseif(isColorMap)
        h = reshape(h,size(h,1), size(h,3));
    end
    
else
    if(isThreeChannel)
        h = r;
        s = g;
        v = b;
    else
        h = r;
    end
end
end

function [r, g, b, isColorMap, isEmptyInput, isThreeChannel] = parseInputs(varargin)

isColorMap = 0;
isEmptyInput = 0;
isThreeChannel = 0;

if (nargin == 1)
    r = varargin{1};
    g = [];
    b = [];
    if (ndims(r)==3)
        if isempty(r)
            isEmptyInput = 1;
            return
        end
        if(size(r,3) ~= 3)
            error(message('MATLAB:rgb2hsv:invalidInputSizeRGB'));
        end

        validateattributes(r, {'uint8', 'uint16', 'double', 'single'}, {'real'}, mfilename, 'RGB', 1);

    elseif ismatrix(r) %M x 3 matrix for M colors.
        
        isColorMap = 1;
        if(size(r,2) ~=3)
            error(message('MATLAB:rgb2hsv:invalidSizeForColormap'));
        end

        validateattributes(r, {'double'}, {'real','nonempty','nonsparse'}, mfilename, 'M');

        if((any(r(:) < 0) || any(r(:) > 1)))
            error(message('MATLAB:rgb2hsv:badMapValues'));
        end
        
    else
        error(message('MATLAB:rgb2hsv:invalidInputSize'));
    end

elseif (nargin == 3)
    isThreeChannel = 1;
    r = varargin{1};
    g = varargin{2};
    b = varargin{3};

    if isempty(r) || isempty(g) || isempty(b)
        isEmptyInput = 1;
        return
    end  
    
    validateattributes(r, {'uint8', 'uint16', 'double', 'single'}, {'real', '2d'}, mfilename, 'R', 1);
    validateattributes(g, {'uint8', 'uint16', 'double', 'single'}, {'real', '2d'}, mfilename, 'G', 2);
    validateattributes(b, {'uint8', 'uint16', 'double', 'single'}, {'real', '2d'}, mfilename, 'B', 3);

    if ~isa(r, class(g)) || ~isa(g, class(b)) || ~isa(r, class(b)) % mixed type inputs.
        r = im2double(r);
        g = im2double(g);
        b = im2double(b);
    end
    
    if ~isequal(size(r),size(g),size(b))
        error(message('MATLAB:rgb2hsv:InputSizeMismatch'));
    end
    
else
    error(message('MATLAB:rgb2hsv:WrongInputNum'));
end
end

Пример

clc,clear,close all
img1=double(imread('img_original.png'));
img2=double(imread('img_2.png'));
img3=double(imread('img_3.png'));
img4=double(imread('img_4.png'));
figure
subplot(221)
imshow(uint8(img1))
title('参考图像1')
subplot(222)
imshow(uint8(img2))
title('失真图像2')
subplot(223)
imshow(uint8(img3))
title('失真图像3')
subplot(224)
imshow(uint8(img4))
title('失真图像4')

Загрузить изображение и отобразить

%% MSE
MSEofimg2=MSE_compute(img1,img2)
MSEofimg3=MSE_compute(img1,img3)
MSEofimg4=MSE_compute(img1,img3)

Результаты расчета MSE

MSEofimg2 =

   12.0006


MSEofimg3 =

   11.0482


MSEofimg4 =

   11.0482

Можно обнаружить, что показатели MSE трех изображений существенно не различаются.

PSNR рассчитывается следующим образом:

%% PSNR
PSNRofimg2=psnr(img1./255,img2./255)
PSNRofimg3=psnr(img1./255,img3./255)
PSNRofimg4=psnr(img1./255,img4./255)

Результат выглядит следующим образом:

PSNRofimg2 =

   26.5468


PSNRofimg3 =

   27.2650


PSNRofimg4 =

   27.6282

Точно так же разница в PSNR невелика.

ССИМ:

%% SSIM
SSIMofimg2=ssim(img1./255,img2./255)
SSIMofimg3=ssim(img1./255,img3./255)
SSIMofimg4=ssim(img1./255,img4./255)
SSIMofimg2 =

    0.9871


SSIMofimg3 =

    0.7427


SSIMofimg4 =

    0.7162

При измерении SSIM разница в визуальном качестве трех изображений, наконец, может быть четко отражена.Следует отметить, что решение SSIM также требует, чтобы динамический диапазон пикселей изображения находился между [0, 1].

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

clc,clear,close all
img1=double(imread('testcolorimg1.png'));
img2=double(imread('testcolorimg2.png'));
figure,subplot(121),imshow(uint8(img1)),title('原图像')
subplot(122),imshow(uint8(img2)),title('失真图像')

загрузить изображение

%% 图像相似度指标计算
LuvCDofimg=luvcolordifference(img1,img2)
SSIMofimg=ssim(img1./255,img2./255)
MSE=MSE_compute(img1,img2)
LuvCDofimg =

   10.6537


SSIMofimg =

    0.6408
    
MSE =

   25.6127

Наконец, расчет насыщенности цвета

img=img1;
[m,n,k]=size(img);
img_hsv=rgb2hsv(img);
S_average=mean(mean(img_hsv(:,:,2)));
S_standarddeviation=sqrt(sum(sum(1/(m*n).*(img_hsv(:,:,2)-S_average.*ones(m,n)).^2)));
CCI=S_average+S_standarddeviation

img=img2;
[m,n,k]=size(img);
img_hsv=rgb2hsv(img);
S_average=mean(mean(img_hsv(:,:,2)));
S_standarddeviation=sqrt(sum(sum(1/(m*n).*(img_hsv(:,:,2)-S_average.*ones(m,n)).^2)));
CCI2=S_average+S_standarddeviation

Результаты расчета цветовой насыщенности двух изображений следующие:

CCI =

    0.9007


CCI2 =

    0.9491

Количественная оценка показывает, что тестовое цветное изображение 2 (изображение кленового листа на синем фоне) более красочно, чем тестовое цветное изображение 1.

напиши в конце

Оценка качества изображения — это показатель, свидетельствующий о превосходстве предлагаемого метода в области изображения, и для большинства областей исследований должны быть соответствующие оценочные показатели. Поэтому, если вы обнаружите, что в определенной области не хватает соответствующих исследований, вы можете потратить некоторое время на эту область.Если вы можете предложить количественные показатели с достаточной интерпретируемостью, то вы можете не только опубликовать статью для доказать свою способность к научным исследованиям, что может обеспечить большое удобство для последующих исследователей.

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

Среди них K-кратная перекрестная проверка — это метод оценки, используемый при небольшом наборе данных, и он очень практичен, как показано на следующем рисунке.

Новички в исследованиях по оценке качества изображений: методы оценки качества изображений, основанные на вероятностных моделях, нейронных сетях и низкоуровневых функциях.

  • Методы, основанные на вероятностных моделях:

Этот тип метода сначала устанавливает модель статистической вероятности между признаками изображения и качеством изображения, и в большинстве из них используется многомерное распределение Гаусса для описания распределения вероятностей.Для оцениваемого изображения после извлечения признаков качество изображения с максимальным апостериорным вероятность рассчитывается в соответствии с вероятностной моделью, или качество изображения с максимальной апостериорной вероятностью рассчитывается в соответствии с вероятностной моделью Насколько хорошо модель соответствует (например, расстояние между признаками), оценивается качество изображения. Для сложных моделей потребуется больше данных, и такие методы могут дать лучшие результаты только при большом объеме данных.

  • Методы на основе нейронных сетей:

Этот тип метода сначала извлекает определенную область преобразования изображения или пространственные признаки, а затем обучает модель регрессионного анализа нейронной сети на основе известных данных о качестве для прогнозирования качества изображения на основе признаков изображения. Однако, если я хочу оценить качество изображения оценкой вероятностной модели и нейронной сети, то хочу сказать, что методы, основанные на обучении (методы, основанные на вероятностных моделях и нейронных сетях) по сути хулиганские == с одной стороны, они не могу понять визуальные характеристики человеческого глаза.С другой стороны, какой смысл брать модель черного ящика.... Так что следующий метод мой самый оптимистичный!

  • Методы, основанные на низкоуровневых функциях:

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

Общедоступный набор данных для оценки качества изображения

Существует множество баз данных для оценки качества изображения, и различные типы искажений нацелены на разные изображения, но четыре наиболее известных набора данных — это LIVE, CSIQ, TID2008 и TID2013. Эти библиотеки обеспечивают субъективное значение оценки каждого искаженного изображения, то есть количественное эталонное значение качества изображения (основная правда). Первые два набора данных в основном относятся к распространенным типам искажений, а именно к аддитивному гауссовскому белому шуму, размытию по Гауссу, сжатию JPEG и сжатию JPEG2000, тогда как TID2013 содержит 3000 искаженных изображений, а количество субъективных тестовых оценок составляет 917 человек, авторитетные. Самое высокое, конечно, но и самый сложный из-за количества типов искажения до 25. В следующих двух таблицах представлена ​​общая ситуация с базой данных и типы включенных искажений соответственно.