2.1.22.1.2 ocmath_median_filter


Description

The function will first sort all the data values from the surrounding neighbourhood into numerical order and then replace the data point being considered with the value at a certain percentile.

Syntax

int ocmath_median_filter( const int nSize, const double * pIn, double * pOut, const int nPts, const double dPercent = 50, int nPadding = EDGEPAD_ZERO, bool bAveraging = false )

Parameters

nSize
[input] Size of input and output data array.
pIn
[input] Pointer to input data array of type double to be filtered.
pOut
[output] Pointer to output data array of type double to receive results.
nPts
[input] Number of surrounding points to left and right. Thus the number of points considered in each segment is (2*nPts + 1).
dPercent
[input] The percent for computing median.
nPadding
[input] Padding method:
EDGEPAD_NONE no padding
EDGEPAD_REFLECT pad reflect, end points are repeated such that on the left, [-1] = [0], [-2] = [1], [-3] = [2] and etc
EDGEPAD_REPEAT pad with [0] values the left and with [nSize-1] on the right
EDGEPAD_EXTRAPOLATE linear extrapolation
EDGEPAD_PERIODIC pad periodic, [-1] = [nSize -1], [-2] = [nSize - 2]
bAveraging
[input] If true, the function will average the most nearest neighbors if there is no match to the given percent.

Return

Returns STATS_NO_ERROR on successful exit and a non-zero STATS error code on failure.

Examples

EX1

////////////////////////////////////////////////////////////////////////////////////
// This example performs median filtering on a column of worksheet. At each point in the column,
// n neighboring points on each side are considered, and the median of all those points
// is assigned as the filtered result for that point.
// Parameters:
//            iNumPts:    Number of points on either side of each point, to consider for median
//
// Return:
//            0:            success
//            non-zero:    failure
int ocmath_median_filter_ex1(int iNumPts)
{
    //Assume a worksheet is active
    Worksheet wks = Project.ActiveLayer();
    wks.SetSize(-1,3);
    DataRange dr;
    dr.Add("X", wks, 0, 0, -1, 0);
    dr.Add("X", wks, 0, 1, -1, 1);
    dr.Add("X", wks, 0, 2, -1, 2);
    vector vxData, vyData;
    
    dr.GetData(&vyData, 1);
    uint nSize = vyData.GetSize();
    if( (iNumPts * 2) >= nSize/2)
    {
        printf("Group size is too large!\n");
        return -2;
    }
    // Set size of result to be same as source
    vector vDest;
    vDest.SetSize(nSize);
    double dPerc = 50;
    int iRet = ocmath_median_filter(nSize, vyData, vDest, iNumPts, dPerc);
    if( iRet != OE_NOERROR)
        return iRet;

    dr.SetData(vDest, false, 2);

    return 0;            
}

Remark

See Also

ocmath_percentiles

Header to Include

origin.h

Reference