POJ_1009_Edge Detection

原创 2016年08月30日 11:49:22
/*
----------思路简述----------
  输入图像         输出图像
  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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

深度学习笔记:Holistically-Nested Edge Detection

深度学习笔记:Holistically-Nested Edge Detection
  • liyaohhh
  • liyaohhh
  • 2016年06月09日 11:21
  • 2571

对论文 You Only Look Once: Unified, Real-Time Object Detection 的理解 (一)

本文转载自: http://blog.csdn.net/surgewong/article/details/51864859 背景介绍    在深度神经网络之前,...
  • hx921123
  • hx921123
  • 2017年02月19日 10:36
  • 1036

cvpr2017 object detection

(1)Feature Pyramid Networks for Object Detection 利用简单设计的多层网络融合策略有效解决多尺度目标定位困难的问题 (2)A-Fast-RCNN: H...
  • mengmengmiao
  • mengmengmiao
  • 2017年09月07日 13:17
  • 974

object detection资料汇总

ump to... LeaderboardPapers R-CNNMultiBoxSPP-NetDeepID-NetNoCFast R-CNNDeepBoxMR-CNNFaster R-CNNYO...
  • Lu597203933
  • Lu597203933
  • 2017年04月18日 20:18
  • 2558

object detection(物体检测)系列论文梳理

object detection论文阅读梳理:1、R-CNN:Rich feature hierarchies for accurate object detection and semantic s...
  • zhang_shuai12
  • zhang_shuai12
  • 2016年09月16日 11:32
  • 5390

论文总结: 2009-Pedestrian Detection: A Benchmark

《Pedestrian Detection:A Benchmark》论文总结
  • soul_lxl
  • soul_lxl
  • 2016年04月06日 11:37
  • 483

Object Detection发展介绍

Object Detection发展介绍 Faster rcnn是用来解决计算机视觉(CV)领域中Object Detection的问题的。经典的解决方案是使用: SS(selective ...
  • renjiaer
  • renjiaer
  • 2016年09月02日 10:02
  • 825

Opencv face detection人脸检测

opencv face detection code人脸检测代码
  • hao529good
  • hao529good
  • 2015年04月23日 16:40
  • 1150

Scale-aware Fast R-CNN for Pedestrian Detection

本文主要关注行人检测中的尺度问题。在图像中,离相机近的人尺寸大些,离相机远的人在图像中尺度小些。如下图所示:不同尺寸的人提取出的特征也不一样。以前大多数文献针对该问题只用一个模型来解决。本文提出了一个...
  • cv_family_z
  • cv_family_z
  • 2015年11月25日 14:50
  • 5123

Duanxx的Design abroad California-LaneDetection概述

一 概述 1.1 软件包 California大学的LaneDetection是California大学的一个开源项目,其官方网址为:http://www.vision.caltech.edu/m...
  • daunxx
  • daunxx
  • 2014年10月08日 17:10
  • 2196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ_1009_Edge Detection
举报原因:
原因补充:

(最多只允许输入30个字)