【发布时间】:2014-10-07 05:40:11
【问题描述】:
我正在尝试理解均值滤波器和中值滤波器的 c 代码。 我理解了均值滤波器并实现了。但是对于中值滤波器,我无法理解中值滤波器参考代码之一中使用的以下逻辑。 我想知道为什么在下面的中值滤波器示例中计算最小值和最大值:
#define PAD_LINES 2
void ExecuteMedianFilterReference(cl_uint* p_input, cl_uint* p_output, cl_int width, cl_uint height)
{
memset(p_output, 0, width * (height+4));
// do the Median
for(cl_uint y = 0; y < height; y++) // rows loop
{
int iOffset = (y+PAD_LINES) * width;
int iPrev = iOffset - width;
int iNext = iOffset + width;
for(int x = 0; x < width; x++) // columns loop
{
unsigned uiRGBA[9];
//get pixels within aperture
uiRGBA[0] = p_input[iPrev + x - 1];
uiRGBA[1] = p_input[iPrev + x];
uiRGBA[2] = p_input[iPrev + x + 1];
uiRGBA[3] = p_input[iOffset + x - 1];
uiRGBA[4] = p_input[iOffset + x];
uiRGBA[5] = p_input[iOffset + x + 1];
uiRGBA[6] = p_input[iNext + x - 1];
uiRGBA[7] = p_input[iNext + x];
uiRGBA[8] = p_input[iNext + x + 1];
unsigned uiMin = c4min(uiRGBA[0], uiRGBA[1]);
unsigned uiMax = c4max(uiRGBA[0], uiRGBA[1]);
uiRGBA[0] = uiMin;
uiRGBA[1] = uiMax;
uiMin = c4min(uiRGBA[3], uiRGBA[2]);
uiMax = c4max(uiRGBA[3], uiRGBA[2]);
uiRGBA[3] = uiMin;
uiRGBA[2] = uiMax;
uiMin = c4min(uiRGBA[2], uiRGBA[0]);
uiMax = c4max(uiRGBA[2], uiRGBA[0]);
uiRGBA[2] = uiMin;
uiRGBA[0] = uiMax;
uiMin = c4min(uiRGBA[3], uiRGBA[1]);
uiMax = c4max(uiRGBA[3], uiRGBA[1]);
uiRGBA[3] = uiMin;
uiRGBA[1] = uiMax;
uiMin = c4min(uiRGBA[1], uiRGBA[0]);
uiMax = c4max(uiRGBA[1], uiRGBA[0]);
uiRGBA[1] = uiMin;
uiRGBA[0] = uiMax;
uiMin = c4min(uiRGBA[3], uiRGBA[2]);
uiMax = c4max(uiRGBA[3], uiRGBA[2]);
uiRGBA[3] = uiMin;
uiRGBA[2] = uiMax;
uiMin = c4min(uiRGBA[5], uiRGBA[4]);
uiMax = c4max(uiRGBA[5], uiRGBA[4]);
uiRGBA[5] = uiMin;
uiRGBA[4] = uiMax;
uiMin = c4min(uiRGBA[7], uiRGBA[8]);
uiMax = c4max(uiRGBA[7], uiRGBA[8]);
uiRGBA[7] = uiMin;
uiRGBA[8] = uiMax;
uiMin = c4min(uiRGBA[6], uiRGBA[8]);
uiMax = c4max(uiRGBA[6], uiRGBA[8]);
uiRGBA[6] = uiMin;
uiRGBA[8] = uiMax;
uiMin = c4min(uiRGBA[6], uiRGBA[7]);
uiMax = c4max(uiRGBA[6], uiRGBA[7]);
uiRGBA[6] = uiMin;
uiRGBA[7] = uiMax;
uiMin = c4min(uiRGBA[4], uiRGBA[8]);
uiMax = c4max(uiRGBA[4], uiRGBA[8]);
uiRGBA[4] = uiMin;
uiRGBA[8] = uiMax;
uiMin = c4min(uiRGBA[4], uiRGBA[6]);
uiMax = c4max(uiRGBA[4], uiRGBA[6]);
uiRGBA[4] = uiMin;
uiRGBA[6] = uiMax;
uiMin = c4min(uiRGBA[5], uiRGBA[7]);
uiMax = c4max(uiRGBA[5], uiRGBA[7]);
uiRGBA[5] = uiMin;
uiRGBA[7] = uiMax;
uiMin = c4min(uiRGBA[4], uiRGBA[5]);
uiMax = c4max(uiRGBA[4], uiRGBA[5]);
uiRGBA[4] = uiMin;
uiRGBA[5] = uiMax;
uiMin = c4min(uiRGBA[6], uiRGBA[7]);
uiMax = c4max(uiRGBA[6], uiRGBA[7]);
uiRGBA[6] = uiMin;
uiRGBA[7] = uiMax;
uiMin = c4min(uiRGBA[0], uiRGBA[8]);
uiMax = c4max(uiRGBA[0], uiRGBA[8]);
uiRGBA[0] = uiMin;
uiRGBA[8] = uiMax;
uiRGBA[4] = c4max(uiRGBA[0], uiRGBA[4]);
uiRGBA[5] = c4max(uiRGBA[1], uiRGBA[5]);
uiRGBA[6] = c4max(uiRGBA[2], uiRGBA[6]);
uiRGBA[7] = c4max(uiRGBA[3], uiRGBA[7]);
uiRGBA[4] = c4min(uiRGBA[4], uiRGBA[6]);
uiRGBA[5] = c4min(uiRGBA[5], uiRGBA[7]);
// convert and copy to output
p_output[(y+PAD_LINES) * width + x] = c4min(uiRGBA[4], uiRGBA[5]);
}
}
}
【问题讨论】:
标签: image-processing filtering