0
我想获得图像的每像素局部对比度,我猜Weber contrast是一个合理的公式。问题是,如何在matlab中得到它,假设我们只使用相邻像素(例如,5x5)作为Ib?如何在matlab/octave中实现Weber对比度图像?
我想获得图像的每像素局部对比度,我猜Weber contrast是一个合理的公式。问题是,如何在matlab中得到它,假设我们只使用相邻像素(例如,5x5)作为Ib?如何在matlab/octave中实现Weber对比度图像?
为了计算局部对比度,我们需要一个亮度图像和局部背景亮度。
假设我们已经有一个亮度图像,特定像素的局部背景亮度可以通过获取局部区域中所有像素的平均值来计算。
通过在水平和垂直两个方向上将图像重复偏移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
对于一个真正的心理实验中,我们会想参数从弧度和球面度的像素转换,并且需要显示或图像捕获设备校准等等亮度测量准确。