关闭

POJ_1009_Edge Detection

标签: POJ1009Edge Detection边缘探测
151人阅读 评论(0) 收藏 举报
分类:
/*
----------思路简述----------
  输入图像         输出图像
  1、1、1     →    2、2、2
  1、3、3     →    2、2、2
  3、3、3     →    2、2、0
  图像的改变位置为临近中间3的周围7个点及中间3本身;
  
  事实上,“输出图像的重复序列的起点”只可能在“原图像的重复序列的起点”的相邻点及该点本身;
  所以,对于输入图像的每个重复序列的起点,将其相邻点及该点视为输出图像的重复序列的可能起点;
  再以这些可能点的原始顺序进行排序,合并连续的重复点,即可得到输出图像;
  ps:图像的最后一个点需要作为可能点之一;感谢大神。
*/

#include<stdio.h>
#include<stdlib.h>
#define ABS(a,b) (((a)>(b))?((a)-(b)):((b)-(a)))
#define MAX(a,b) (((a)>(b))?(a):(b))

int cmp(const void *a, const void *b)
{ return *(int*)a - *(int*)b; }

struct {
	int _value;//像素点的值
	int _begin;//重复序列的图像起点
	int _length;
}pairs[1001];
int width, height, p_count, a_length;
int edges[9100] = { 0 }, e_count = 0;

//获取指定点的边界值
int edgeValue(int position){
	int row = position / width;
	int col = position % width;
	int curIdx;
	int maxAbs = 0;
	int arround[9] = { 0 };
	int a_count = 0;
	int i, j;

	if (row > 0){
		if (col > 0)
			arround[a_count++] = position - width - 1;
		arround[a_count++] = position - width;
		if (col + 1 < width)
			arround[a_count++] = position - width + 1;
	}
	if (col > 0)
		arround[a_count++] = position - 1;
	arround[a_count++] = position; curIdx = a_count - 1;
	if (col + 1 < width)
		arround[a_count++] = position + 1;
	if (row + 1 < height){
		if (col > 0)
			arround[a_count++] = position + width - 1;
		arround[a_count++] = position + width;
		if (col + 1 < width)
			arround[a_count++] = position + width + 1;
	}

	j = 1;
	for (i = 0; i < a_count; i++){
		for (; j < p_count; j++)
			if (pairs[j]._begin > arround[i])
				break;
		arround[i] = pairs[j - 1]._value;
	}
	for (i = 0; i < a_count; i++)
		maxAbs = MAX(maxAbs, ABS(arround[curIdx], arround[i]));
	return maxAbs;
}

void edgeSet(int position){
	if (position > width)//左上存在
		edges[e_count++] = position - width - 1;
	if (position + 1 > width)//上面存在
		edges[e_count++] = position - width;
	if (position + 2> width)//右上存在
		edges[e_count++] = position - width + 1;
	if (position > 0)//左面存在
		edges[e_count++] = position - 1;

	edges[e_count++] = position;

	if (position + 1 < a_length)//右面存在
		edges[e_count++] = position + 1;
	if (position + width < a_length + 1)//左下存在
		edges[e_count++] = position + width - 1;
	if (position + width < a_length)//下面存在
		edges[e_count++] = position + width;
	if (position + width + 1 < a_length)//右下存在
		edges[e_count++] = position + width + 1;
}

int main(){
	int i, position;
	int o_value, o_position, o_temp;

	while (scanf("%d", &width) && width != 0){
		printf("%d\n", width);

		p_count = 0; a_length = 0;
		while (scanf("%d%d", &pairs[p_count]._value, &pairs[p_count]._length)){
			if (pairs[p_count]._value == 0 && pairs[p_count]._length == 0) break;
			pairs[p_count]._begin = a_length; a_length += pairs[p_count]._length;
			p_count++;
		}
		height = a_length / width;

		e_count = 0;
		for (i = 0; i < p_count; i++)//将可能点全部放入edges[]中
			edgeSet(pairs[i]._begin);
		edgeSet(a_length - 1);//最后一个特殊点别忘了!!!!!!!!!!

		qsort(edges, e_count, sizeof(int), cmp);
		
		o_value = edgeValue(0); o_position = 0; position = o_position;
		for (i = 0; i < e_count; i++){
			if (edges[i] == position) continue;
			else position = edges[i];
			o_temp = edgeValue(position);
			if (o_temp != o_value){
				printf("%d %d\n", o_value, position - o_position);
				o_value = o_temp; o_position = position;
			}
		}
		printf("%d %d\n", o_value, a_length - o_position);
		printf("0 0\n");
	}
	printf("0\n");
	return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7737次
    • 积分:904
    • 等级:
    • 排名:千里之外
    • 原创:88篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类