задний план
Однажды по прихоти я искал волну оценки качества изображения на Zhihu и нашел следующий абзац: «Исследователи в области оценки качества изображения сказали, что «оценка качества поливает»; аспиранты также в панике из-за быть вынужденным заниматься этим направлением своими руководителями: «Качество изображения оценивает первокурсник, первый год обучения, научный руководитель не разрешает мне делать проекты, что мне делать, чтобы в будущем я смог найти хорошую работу» ?», добросердечные люди дают советы и предложения «Лучший выбор в соответствии с вашей ситуацией — не идти в аспирантуру. А теперь идите прямо на работу», — сказал человек, чье направление IQA вот-вот сведет с ума его начальник. «Я думаю (оценка качества изображения) бессмысленна»; сомнения публики в действительном значении оценки качества следуют одно за другим: «Зачем мы оцениваем качество изображений. Другими словами, какие практические приложения мы имеем для оценки качества?» изображений?Во-первых, на данном этапе академические оценки - это всевозможные базы данных и искаженные изображения.Сотни методов были предложены, но даже перед лицом естественных баз данных изображений я все еще чувствую себя бессильным;во-вторых, стандарты оценки люди очень сложны, и система оценки, скрытая в базе данных, представляет собой оценку только тех, кого опрашивают, и не обязательно соответствует визуальной согласованности всего человека.Тогда нет ни полностью правильного эталонного Стандарта, и нет практического применения обобщения, в чем смысл тысяч основных журналов для оценки качества изображения каждый год?» (Вышеприведенный контент взят от Zhihu)
На самом деле, оценка качества изображения ни в коем случае не является зверем наводнения и не «просто наводнением». С моей личной точки зрения, я думаю, что эта область больше похожа на исследование, которое обслуживает часть области изображения, с большим упором на академические приложения, а не на инженерные приложения. По сути, то, что делает Оценка качества изображения (IQA), на самом деле исследует основные законы, лежащие в основе оценки человеческого зрения, например, какие изображения люди считают «плохим визуальным опытом» и как количественно описывать людей. довольно интересно.Единственным недостатком является то, что это трудно применить к инженерным приложениям. Нынешние популярные направления, такие как машинное обучение, глубокое обучение и обучение с подкреплением, также известны как «научные исследования, изучающие модели и способы мышления людей», но на самом деле это зависит от информатики, чтобы раскрыть основные законы мышления человеческого мозга. Не то, что наше поколение может засвидетельствовать. Текущее «обучение» все еще находится в застое на этапе обучения нелинейной модели с помощью набора данных, чтобы минимизировать ошибку функции потерь.
Возвращаясь к теме этой статьи, изображениям, качеству и оценке, почему мы должны оценивать качество изображений, на самом деле легко объяснить: если нет набора авторитетных и унифицированных количественных показателей, то все скажут, когда проведут эксперименты и опубликуют "Метод, предложенный в этой статье, лучше, чем современный метод (самый передовой метод)", потому что нет эталона измерения, все будут пускать птиц и летать по желанию. Во избежание этой ситуации, а также для обеспечения строгости научных исследований рождается оценка качества изображения. Итак, сначала я оценю эту область как «эту область больше похожа на исследование, которое обслуживает часть поля изображения, и оно больше ориентировано на академические приложения, чем на инженерные приложения». Ведь инженерные приложения не заботятся об оценке качества изображения. Если пользователи считают, что это хорошо, то это хорошо. А академические исследования больше сосредоточены на количественной оценке. Хорошие показатели — это хорошо. Не могут быть признаны? Что ж, IQA для оценки качества изображения как раз об этом. Конечно, иногда IQA также играет роль в инженерных приложениях, например, при формулировании отраслевых стандартов и национальных стандартов (например, декан колледжа блоггеров сформулировал очень авторитетный стандарт в полиграфической отрасли, поэтому иногда IQA также можно использовать для приложений, не связанных с академическими, предоставляют справку), IQA может пригодиться в это время, но в целом промышленные приложения не пользуются спросом на IQA.
Полная ссылка и слепая оценка
IQA делится на два случая для обсуждения, первый случай заключается в том, что у нас есть эталонное изображение (эталонное изображение), называемое полной оценкой качества эталонного (полного эталона) изображения; другой случай не является эталонным (слепым) оценкой качества изображения. На самом деле существует еще и тип полуэталонного изображения, но из-за отсутствия ограниченных информационных условий этот вид исследования достаточно водянистый.Что такое полуэталон и сколько стоит полуэталон?Используемая информация ибо референс оценка качества более преувеличена чем полный референс.Что называется полуреференсом?Эталон есть эталон, а нет эталона нет эталона.Может это в середине? Плагиат есть плагиат, нет плагиата нет плагиата, какой к черту полуплагиат? Таким образом, полуссылка обычно представляет собой поле, которое не распознается или классифицируется как поле полной ссылки.
Для полной эталонной оценки хорошо понятно, что у меня есть стандартное неискаженное изображение для оценки качества изображения, а слепая оценка изображения — это оценка качества изображения без эталонного изображения. Ниже описаны некоторые из наиболее распространенных методов оценки качества изображения.
Полная ссылка: Сходство изображений — разница в цвете (CD)
С точки зрения векторных значений, если вы хотите измерить сходство между двумя векторами, проще думать о евклидовом расстоянии или разнице углов. Хроматическая аберрация — это евклидово расстояние в изображении, а наиболее типичным представителем является среднеквадратическая ошибка (MSE), которая хорошо изучена, как показано в следующей формуле:
в,Указывает количество пикселей по длине и ширине изображения,представляют искаженное изображение и эталонное изображение соответственно.
MSE, по сути, вычисляет цветовую разницу в цветовом пространстве sRGB, и существенная проблема заключается в том, что восприятие цвета человеческим глазом непоследовательно, а пространственная информация изображения игнорируется.
Цветовое пространство CIELAB ближе к зрительному восприятию человеческим глазом, чем цветовое пространство sRGB, а цветовое пространство L*u*v* еще больше улучшает это. Количественное изменение в любом направлении соответствует восприятию цвета человеческим глазом.
Преобразование из цветового пространства sRGB в L*u*v* происходит следующим образом:
Поскольку sRGB — это цветовое пространство, зависящее от устройства, а L*u*v* — это независимое от устройства цветовое пространство, оно должно пройти через преобразование в цветовое пространство XYZ (независимое от устройства) в качестве перехода следующим образом:
в
в,,, R, G, B — значения трех каналов sRGB. Следует отметить, что цветовое пространство XYZ требует предварительного выбора эталонного белого цвета для определения матрицы преобразования.Здесь мы выбираем эталонный белый цвет под источником света D65 по умолчанию.
Расчет L*u*v* основан на цветовом пространстве Lu'v'. Следует отметить, что это не одно и то же. Расчет и преобразование цветового пространства Lu'v' осуществляется следующим образом:
И метод расчета u*v* выглядит следующим образом:
вбелый для стандартной ссылкизначение, как правило, мы используем эталонный белый цвет при источнике света D65, результат. (Трехцветные значения XYZ эталонного белого цвета при источнике света D65 составляют, можете проверить сами по формуле)
Цветовая разница L*u*v* — это евклидово расстояние в цветовом пространстве L*u*v*.
Полная ссылка: Сходство изображений — отношение пикового сигнала к шуму (PSNR)
Отношение пикового сигнала к шуму (PSNR), объективный стандарт для оценки изображений, PSNR — это аббревиатура от «отношение пикового сигнала к шуму». вершина означает вершину. А соотношение означает соотношение. Весь смысл в том, чтобы достичь пикового сигнала шумового отношения, psnr обычно используется для инженерного проекта между максимальным сигналом и фоновым шумом. Обычно после сжатия изображения выходное изображение обычно в некоторой степени отличается от исходного изображения. Чтобы измерить качество изображения после обработки, мы обычно обращаемся к значению PSNR, чтобы определить, является ли программа обработки удовлетворительной. Это логарифм среднеквадратичной ошибки между исходным изображением и обработанным изображением относительно (2 ^ n-1) ^ 2 (квадрат максимального значения сигнала, n - количество битов на значение выборки), а его единица измерения дБ.
Поскольку изображения и изображения по сути являются многомерными сигналами, для расчета степени искажения можно использовать PSNR, который по функциям аналогичен MSE (поскольку он решается на основе MSE, он кажется немного хулиганским), следующим образом:
Среди них MAX — максимальное значение динамического диапазона изображения.Если для решения задачи используется диапазон по умолчанию [0,255], появится отрицательное значение, а результат после нормализации (изображение с [0,1] динамический диапазон) в норме, поэтому в расчете требуется предварительная обработка.В матлабе изображение нужно обрабатывать с ./255.
Полная ссылка: Сходство изображений - Индекс структурного сходства (SSIM)
Следующий рисунок показывает превосходство SSIM в рассмотрении структуры изображения и производительности локальной пространственной информации изображения, а также можно сказать, что он выявляет проблемы хроматической аберрации и PSNR. Как показано на рисунке ниже, значения MSE и PSNR картинок на кольце одинаковы, но с точки зрения субъективного зрения мы думаем, что верхняя картинка явно выше по качеству, чем нижняя.Но из квантованных значений MSE и PSNR качество изображения нескольких искаженных изображений на кольце одинаковое, что явно не соответствует зрительному восприятию. Это связано с тем, что человеческий глаз более чувствителен к изменениям в прилегающей области, и ни MSE, ни PSNR не учитывают информацию о пространственной информации.
Метод расчета SSIM выглядит следующим образом:
в,отдельные изображенияс изображениемсреднее значение пикселя иипредставляют дисперсию изображения соответственно. и,, T представляет динамический диапазон значений пикселей изображения.
Но следует отметить, что SSIM не лучше хроматических аберраций и пикового отношения сигнал-шум во всех случаях, и каждый имеет свои преимущества в конкретных случаях, поэтому правильнее говорить об этом.
Мы можем увидеть разницу между SSIM и MSE из нескольких наборов тестовых изображений.
Можно обнаружить, что индексная карта SSIM точнее фиксирует ошибку, воспринимаемую человеческим глазом, а описание края искаженного изображения явно точнее, чем MSE. Изображение ниже иллюстрирует ту же проблему.
Давайте посмотрим на результаты квантования искажения группы изображений при MSE и SSIM.На следующем рисунке в качестве эталонного изображения используется рисунок 1, в котором изображения на рисунке 2 и рисунке 3 явно имеют более высокое визуальное качество, чем изображение 456. , а вот свет от МСЭ С точки зрения МСЭ 23456 в принципе такой же, и ССИМ на этом тестовом снимке явно показывает большие преимущества.
Слепой справочник: Насыщенность цвета - Индекс цветовой насыщенности (CCI)
Сходство изображения является типичным случаем полного эталонного изображения, потому что только при наличии эталонного изображения мы можем оценить искажение изображения. Слепая оценка качества эталонного изображения зависит от конкретного приложения.В области цвета изображения, с которой блоггеры более знакомы, насыщенность цвета CCI является широко используемым методом оценки изображения, чтобы описать богатство цветовой информации в изображении, как показано ниже:
в,представляет среднюю насыщенность изображения, аПредставляет стандартное отклонение насыщенности.
Нетрудно понять, что цветовая насыщенность изображения и нарушение цветовой насыщенности используются для представления богатства цвета.С одной стороны, цвет можно описать тремя измерениями оттенка, насыщенности и яркости. , затем по средней насыщенности и ее отклонению и т. д. Добавление весов может хорошо описать богатство цветов, но оно также имеет определенные недостатки, не учитывающие весов обоих.
Код боевой части
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. В следующих двух таблицах представлена общая ситуация с базой данных и типы включенных искажений соответственно.