Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I have the following MATLAB Code which I want to optimize.
It's related to an image matrix (2D) which I want to filter.
Though it is MATLAB code, the same problem would arise in C code.

The problem is that I'm trying to access neighbors of the pixel which might cause problems at the boundaries of the image matrix.

vWeightsCoeff = zeros((2 * numRows * numCols), 1);

weightsIdx = -3;

% Filteration
for iColIdx = 1:numCols
    for iRowIdx = 1:numRows
        if(mod((iRowIdx + iColIdx), 2) == 0)
            continue;
        end

        weightsIdx = weightsIdx + 4;

        refPixel = mOutputImage(iRowIdx, iColIdx);

        if(iRowIdx < numRows)
            relPixel1 = mOutputImage((iRowIdx + 1), iColIdx);
            relWeight1 = vRangeTable(round((refPixel - relPixel1) * RANGE_RESOLUTION) + RANGE_CENTER_IDX);
        else
            relPixel1 = 0;
            relWeight1 = 0;
        end

        if(iRowIdx > 1)
            relPixel2 = mOutputImage((iRowIdx - 1), iColIdx);
            relWeight2 = vRangeTable(round((refPixel - relPixel2) * RANGE_RESOLUTION) + RANGE_CENTER_IDX);
        else
            relPixel2 = 0;
            relWeight2 = 0;
        end

        if(iColIdx < numCols)
            relPixel3 = mOutputImage(iRowIdx, (iColIdx + 1));
            relWeight3 = vRangeTable(round((refPixel - relPixel3) * RANGE_RESOLUTION) + RANGE_CENTER_IDX);
        else
            relPixel3 = 0;
            relWeight3 = 0;
        end

        if(iColIdx > 1)
            relPixel4 = mOutputImage(iRowIdx, (iColIdx - 1));
            relWeight4 = vRangeTable(round((refPixel - relPixel4) * RANGE_RESOLUTION) + RANGE_CENTER_IDX);
        else
            relPixel4 = 0;
            relWeight4 = 0;
        end

        weightsNormalizationFactor = PREDICT_NORMALIZATION_FACTOR / (relWeight1 + relWeight2 + relWeight3 + relWeight4);

        relWeight1 = relWeight1 * weightsNormalizationFactor;
        relWeight2 = relWeight2 * weightsNormalizationFactor;
        relWeight3 = relWeight3 * weightsNormalizationFactor;
        relWeight4 = relWeight4 * weightsNormalizationFactor;

        mOutputImage(iRowIdx, iColIdx) = mOutputImage(iRowIdx, iColIdx) - ((relWeight1 * relPixel1) + (relWeight2 * relPixel2) + (relWeight3 * relPixel3)+ (relWeight4 * relPixel4));

        vWeightsCoeff(weightsIdx:(weightsIdx + 3)) = [relWeight1; relWeight2; relWeight3; relWeight4];

    end
end

Just to clarify the variables:

  • mOutputImage is the image matrix.
  • numCols and numRows are the matrix dimensions.
  • vWeightsCoeff is the vector of the weights.

Since each pixel is related to 4 others yet working only on half the pixels its size is 2 times the number of pixels.

Now, the questions are:

  1. Can I do something smart to go over the same pixels yet skip the first if which works like dividing the pixels as in chess board (White Black Board)?
  2. Can I do something to avoid the if which secures I'm not stepping out of boundaries and yet go through the same pixels?

If someone comes which a completely different arrangement I will be open for that as well.

share|improve this question
    
Why are you doing the if(mod((iRowIdx + iColIdx), 2) == 0) near the top? Is that part of the filter? Could you describe the filter in words? –  brechmos Jun 16 '14 at 19:21
    
@brechmos, The reason is simple. Think on the matrix as a chessboard, each entry is either white or black. Now, I want to work only on the black / white. This if separates white form black (Or the other way). Thank You. –  Drazick Jun 16 '14 at 21:29

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.