Как реализовать веберовский контраст изображения в matlab / octave?

#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
  

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