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:
mOutputImageis the image matrix.
numRowsare the matrix dimensions.
vWeightsCoeffis 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:
- Can I do something smart to go over the same pixels yet skip the first
ifwhich works like dividing the pixels as in chess board (White Black Board)?
- Can I do something to avoid the
ifwhich 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.