poj1009-EdgeDetection

本文深入探讨了一种针对像素点的编码算法,该算法通过计算每个像素点与其周围8个像素点之间的最大绝对值差异来为其编码。文章详细介绍了算法的具体实现过程,包括如何读取像素值和数量、如何计算每个像素点的编码以及如何输出编码结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define size 1000 //题目中给定的上限
int width;  //控制输入的行数
int total=0;  //记录像素点
typedef class OutPut
{
	public:
		int pos;    //OutPut中每个像素点的顺序位置,pos从1开始
		int code;   //OutPut中每个像素点对应InputPair的编码
}output;
int InputPair[size][2];  //InputPair[][0]为像素值,InputPair[][1]为InputPair[][0]连续出现的个数
output Out[size * 8];    //每个output都依赖其周围的8个点编码
int cmp(const void* a,const void* b)
{
	output * x = (output  *)a;
	output * y = (output  *)b;
	return x->pos  -  y->pos;
}
/*返回第pos个像素点的像素值*/
int GetValue(int pos)
{
	int i=0,p=0;
	while( p < pos)
		p += InputPair[i++][1];
	return InputPair[i-1][0];
}

/*返回第pos个像素点的编码*/
int GetCode(int pos)
{
	int code = GetValue(pos);
	int maxAbs = 0;

	int row = (pos - 1) / width;
	int col = (pos - 1) % width;

	for(int  i = row - 1;i <= row + 1;i++)
		for(int j = col - 1;j <= col + 1;j++)
		{
			int tpos = i * width + j;
			if(i<0 || j<0 || j >= width || tpos >= total || tpos==pos-1)  //tpos==pos-1为中心的像素点,即当前待编码的点
				continue;
			int tcode = GetValue(tpos + 1);
			if(maxAbs < abs(tcode - code))   //注意取绝对值
				maxAbs = abs(tcode - code);
		}
	return maxAbs;
}

int main(int k)
{
	while(cin>>width && width)
	{
		int pairv,pairt;
		k=total=0;
		while(cin>>pairv>>pairt && pairt)
		{
			InputPair[k][0]=pairv;
			InputPair[k++][1]=pairt;
			total += pairt;
		}
		int PairNum=k;  //pair的个数

		cout<<width<<endl;

		int pos=1;  //当前处理的像素点的位置
		k=0; //OutMap[]指针
		for(int p=0;p<=PairNum;p++)
		{
			int row=(pos-1)/width;  //得到pos在二维图对应的坐标
			int col=(pos-1)%width;

			for(int i=row-1;i<=row+1;i++)        //枚举(row,col)周围及其自身共9个点(x,y)
				for(int j=col-1;j<=col+1;j++)
				{
					int tpos = i * width + j;  //得到(x,y)的顺序位置

					if(i<0 || j<0 || j >= width || tpos >= total)
						continue;

					Out[k].pos = tpos+1;
					Out[k++].code = GetCode(tpos+1);  //对发生变化的像素点的附近8个点编码
				}

			pos+=InputPair[p][1];  //跳跃,确定下一个像素发生变化的点的位置
		}

		qsort(Out,k,sizeof(output),cmp);  
		output temp=Out[0];
		for(int i=0;i<k;i++)
		{
			if(temp.code==Out[i].code)
				continue;
			cout<<temp.code<<' '<<Out[i].pos-temp.pos<<endl;
			temp=Out[i];
		}
		cout<<temp.code<<' '<<total-temp.pos+1<<endl;
		cout<<"0 0"<<endl;
	}
	cout<<0<<endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值