patternMinor
Avoiding Boundaries `if` Cases When Filtering Image Matrix
Viewed 0 times
matrixboundariesimagecaseswhenavoidingfiltering
Problem
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.
Just to clarify the variables:
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 1)
relPixel2 = mOutputImage((iRowIdx - 1), iColIdx);
relWeight2 = vRangeTable(round((refPixel - relPixel2) * RANGE_RESOLUTION) + RANGE_CENTER_IDX);
else
relPixel2 = 0;
relWeight2 = 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
endJust to clarify the variables:
mOutputImageis the image matrix.
numColsandnumRowsare the matrix dimensions.
vWeightsCoeffis t
Solution
visiting black chess board squares
You might do a mod2 pre-calculation of
But much better would be to step
boundary checking
Your matrix now is C x R. Simply allocate a (C+2) x (R+2) matrix, so you have zeros running along all four sides. Then iterate over just the middle, rather than over the whole matrix as you are now. So
Doing this will delete a great many
style
It would have been helpful to see the method signature, but your English description that
Typo: % Filteration
It would be natural to express the normalization e.g. like this:
Leave a blank after
The extra parentheses in
are a little odd, you could safely elide them.
You might do a mod2 pre-calculation of
mod(iRowIdx + iColIdx, 2) by creating a chess board boolean matrix before the loop, using matrix operations.But much better would be to step
iColIdx by 2. And have iRowIdx start at 1 or 2 as appropriate, and then step it by 2.boundary checking
Your matrix now is C x R. Simply allocate a (C+2) x (R+2) matrix, so you have zeros running along all four sides. Then iterate over just the middle, rather than over the whole matrix as you are now. So
iColIdx for example would start at 2 and stop one short of the end.Doing this will delete a great many
ifs, to give you Version2 of the code. You might even find that puts you in a position to produce Version3, which takes advantage of matrix operations instead of scalar operations, pushing much of the looping work down into matlab primitives, which would be faster.style
It would have been helpful to see the method signature, but your English description that
mOutputImage is the only return value worked well enough.Typo: % Filteration
It would be natural to express the normalization e.g. like this:
relWeight4 *= weightsNormalizationFactor;Leave a blank after
if, please.The extra parentheses in
mod and places like this:relPixel1 = mOutputImage((iRowIdx + 1), iColIdx);are a little odd, you could safely elide them.
Code Snippets
relWeight4 *= weightsNormalizationFactor;relPixel1 = mOutputImage((iRowIdx + 1), iColIdx);Context
StackExchange Code Review Q#54262, answer score: 2
Revisions (0)
No revisions yet.