Wie implementiere ich den Weber-Kontrast eines Bildes in Matlab / Oktave?
-
27-10-2019 - |
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?
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.