#matlab #image-processing #octave #contrast
#matlab #обработка изображений #октава #контраст
Вопрос:
Я хотел бы получить локальный контраст изображения на пиксель, и я думаю, что Weber contrast является правдоподобной формулой для этого. Вопрос в том, как получить это в matlab, предполагая, что мы просто используем соседние пиксели (например, 5×5) для Ib?
Ответ №1:
Для вычисления локального контраста нам нужно изображение яркости и яркость локального фона.
Предполагая, что у нас уже есть изображение с яркостью, локальную фоновую яркость для конкретного пикселя можно вычислить, взяв среднее значение по всем пикселям в локальной области.
Мы можем собрать набор таких локальных фоновых областей (по одной на пиксель в исходном изображении), многократно сдвигая изображение на 0: (n-1) пикселей как в горизонтальном, так и в вертикальном направлениях.
Следующая демонстрационная функция иллюстрирует основную идею:
function weberContrastDemo
imgWidthPixels = 1024;
imgHeightPixels = 1024;
localBackgroundSizePixels = 5; % square patch
luminance = randn( imgHeightPixels, imgWidthPixels );
luminance( 496:528, 496:528 ) = 20;
background = localMeanFilter( luminance, localBackgroundSizePixels );
weberContrast = ( luminance - background );% ./ background;
imagesc( weberContrast );
title( 'Weber Contrast' );
colormap(gray);
end
function filteredImg = localMeanFilter( img, regionSizePixels )
offsetImages = getOffsetImages( img, regionSizePixels );
filteredImg = mean( offsetImages, 3 );
end
function buffer = getOffsetImages( img, regionSizePixels )
% GETOFFSETIMAGES
imgSize = size( img );
imgHeight = imgSize( 1 );
imgWidth = imgSize( 2 );
minDelta = 0;
maxDelta = (regionSizePixels-1);
bufferWidth = imgWidth maxDelta;
bufferHeight = imgHeight maxDelta;
bufferDepth = regionSizePixels .^ 2;
bufferSize = [ bufferHeight bufferWidth bufferDepth ];
buffer = zeros( bufferSize );
iSample = 0;
for deltaX = minDelta:maxDelta
iStartX = 1 deltaX;
iEndX = imgWidth deltaX;
idxX = iStartX:iEndX;
for deltaY = minDelta:maxDelta
iSample = iSample 1;
iStartY = 1 deltaY;
iEndY = imgHeight deltaY;
idxY = iStartY:iEndY;
buffer( idxY, idxX, iSample ) = img;
end
end
iMin = ceil(regionSizePixels/2);
iMax = iMin (imgWidth-1);
buffer = buffer( iMin:iMax, iMin:iMax, : );
end % GETOFFSETIMAGES
Для реального психофизического эксперимента мы хотели бы преобразовать параметры из радианов или стерадианов в пиксели, и нам нужно было бы откалибровать дисплей или устройство захвата изображения, чтобы измерение яркости было точным.