【问题标题】:How to implement Weber contrast of an image in matlab/octave?如何在 matlab/octave 中实现图像的韦伯对比度?
【发布时间】:2011-04-30 08:48:49
【问题描述】:

我想获得图像的每像素局部对比度,我猜Weber contrast 是一个合理的公式。问题是,假设我们只对 Ib 使用相邻像素(例如,5x5),如何在 matlab 中得到它?

【问题讨论】:

    标签: matlab image-processing octave contrast


    【解决方案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
    

    对于真正的心理物理实验,我们希望将参数从弧度或球面度转换为像素,并且需要校准显示器或图像捕获设备,以便准确测量亮度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多