Frage

Ich möchte den lokalen Kontrast eines Bildes pro Pixel erhalten, und ich denke, WeberKontrast ist dafür eine plausible Formel.Die Frage ist, wie man es in Matlab bekommt, vorausgesetzt, wir verwenden nur benachbarte Pixel (z. B. 5x5) für Ib?

War es hilfreich?

Lösung

Zur Berechnung des lokalen Kontrasts benötigen wir ein Luminanzbild und eine lokale Hintergrundluminanz.

Angenommen, wir haben bereits ein Luminanzbild, kann die lokale Hintergrundluminanz für ein bestimmtes Pixel berechnet werden, indem der Durchschnitt über alle Pixel in der lokalen Region genommen wird.

Wir können einen Satz solcher lokaler Hintergrundbereiche (einen pro Pixel im Originalbild) erfassen, indem wir das Bild wiederholt um 0: (n-1) Pixel sowohl in horizontaler als auch in vertikaler Richtung verschieben.

Die folgende Demofunktion veranschaulicht die Grundidee:

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

Für ein echtes psychophysisches Experiment möchten wir Parameter von Bogenmaß oder Steradiant in Pixel konvertieren und müssen die Anzeige oder das Bildaufnahmegerät kalibrieren, damit das Luminanzmaß genau ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top