已知二维数组的数据,T[i][j],i表示行数,一行一行的数据进行边缘检测,找到边缘点,还要记下它所对应的i,j的值。请高手指点!边缘检测有好多种方法,最好给出一个相对简单点的算法,同时也能保证精度的。谢谢!
解决方案 »
- 在网页中加载ocx控件
- VC中的CListCtrl大量数据插入并且实时更新的问题
- 请教SetupDiEnumDeviceInterfaces和SetupDiEnumDeviceInfo的区别
- Visual C++启动另一个可执行程序的方案
- 在win32的基础上,画出正弦图
- 利用snmp++开发时的问题
- 专家门诊visualC++300问的光盘 那位大侠有?
- 问个初级问题:如何在菜单项的事件处理程序中得到此菜单项的ID值?
- EOF结束标志是'\0' ?// 0x00表示 ?????
- 如何通过一个工作站连接并访问两个不同局域网中的异种数据库?
- 不知道是什么问题的问题!
- 弱问:关于不能显示按纽的一个小问题
这些算子实际上就是对以像素f(i,j)为中心的3*3领域作卷积交换(即对应元素相乘),结果赋予f(i,j)(检测后的像素值)
拉普拉斯算子的卷积核为
|0 -1 0 |
|-1 5 -1|
|0 -1 0 |.其他算法的卷积核可以上网查
int value[9];
for(i=0;i<2048;i++)
for(j=0;j<ln;j++)
{ t1[i][j]=T1[i][j];//原始数据
value[0]=T1[i-1][j-1];
value[1]=T1[i-1][j];
value[2]=T1[i-1][j+1];
value[3]=T1[i][j-1];
value[4]=T1[i][j];
value[5]=T1[i][j+1];
value[6]=T1[i+1][j-1];
value[7]=T1[i+1][j];
value[8]=T1[i+1][j+1];
for(int m=0;m<9;m++)
{
t1[i][j]=t1[i][j]+value[m]*h[m];
}
}
但我实际上还要找出边缘点,这只是把处理后的结果显示了,并不知道哪些是边缘点啊。如何把边缘点找出来呢?
首先你要定义一个和图像一样尺度的bool型数组,来记录边界,还要有个判断是不是边缘的门限才行(相当于二值化),比如threshold=100,当大于threshold时为边界:int h[9]={0,-1,0,-1,5,-1,0,-1,0};//定义卷积核
int value[9];
for(i=0;i <2048;i++)
for(j=0;j <ln;j++)
{
t1[i][j]=T1[i][j];//原始数据
value[0]=T1[i-1][j-1];
value[1]=T1[i-1][j];
value[2]=T1[i-1][j+1];
value[3]=T1[i][j-1];
value[4]=T1[i][j];
value[5]=T1[i][j+1];
value[6]=T1[i+1][j-1];
value[7]=T1[i+1][j];
value[8]=T1[i+1][j+1];
for(int m=0;m <9;m++)
{
t1[i][j]=t1[i][j]+value[m]*h[m];
}
if (t1[i][j]>threshold) edge[i][j]=true;//记录边界
} 当然了,门限的选择还可以有很多方法,就看你怎么用了!!