poj1009 Edge Detection 解题报告(二)

2014-11-24 08:48:13 · 作者: · 浏览: 1
private:
// set block
void set_block(int index, short value, int position)
{
m_data[index].value = value;
m_data[index].position = position;
}
// search pixel
short search_pixel(int idx, int block, bool bBackward, int& location)
{
if(idx < 1 || idx > m_data[m_count].position)
{
location = -1;
return 0;
}
int i = block;
if(bBackward)
{
for(i = block-1; i >= 0; --i)
if(idx > m_data[i].position)
{
location = i+1;
return m_data[i+1].value;
}
}
else
{
for(i = block; i <= m_count; ++i)
if(idx <= m_data[i].position)
{
location = i;
return m_data[i].value;
}
}
}
// calculate edge
short calculate_edge(int idx, int block)
{
bool flag[8]; // does neighbor exist
for(int i = 0; i < 8; ++i)
flag[i] = true;
// top
if((idx - 1)/m_width == 0)
flag[0] = flag[1] = flag[2] = false;
// bottom
if(idx + m_width > m_data[m_count].position)
flag[5] = flag[6] = flag[7] = false;
// left (especially when width is 1)
if(m_width == 1 || idx % m_width == 1 )
flag[0] = flag[3] = flag[5] = false;
// right
if(idx % m_width == 0 )
flag[2] = flag[4] = flag[7] = false;
// valid neighbor
short base = m_data[block].value;
short edge = 0;
int nidx; // index of neighbor short
for(int i = 0; i < 8; ++i)
if(flag[i])
{
switch(i)
{
case 0:
case 1:
case 2:
nidx = idx - m_width + i - 1;
break;
case 3:
nidx = idx - 1;
break;
case 4:
nidx = idx + 1;
break;
default:
nidx = idx + m_width + i - 6;
}
short neighbor;
int location;
neighbor = search_pixel(nidx, block, (nidx
short temp = ((neighbor > base) (neighbor - base) : (base - neighbor));
if(temp > edge)
edge = temp;
}
return edge;
}
};
// entry point
int main()
{
CRLEImage image;
while( image.Scan() )
image.Process();
return 0;
}