基于matlab的边缘检测的robert算子的算法?怎么写?

2024-11-08 12:02:54
推荐回答(2个)
回答(1):

matlab本身有库函数的。直接调用啊
VC代码:
void BianYuanJianCeDib::Robert()
{
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
int i,j; //循环变量
int pixel[4]; //Robert算子
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE[wide*height]; //新图像缓冲区
//设定新图像初值为255
memset(temp,255, wide*height);
//由于使用2*2的模板,为防止越界,所以不处理最下边和最右边的两列像素
for(j=0;jfor(i=0;i{
//生成Robert算子
pixel[0]=p_data[j*wide+i];
pixel[1]=p_data[j*wide+i+1];
pixel[2]=p_data[(j+1)*wide+i];
pixel[3]=p_data[(j+1)*wide+i+1];
//处理当前像素
temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
}
//将缓冲区中的数据复制到原图数据区
memcpy(p_data, temp,wide*height);
//删除缓冲区
delete temp;
}

回答(2):

Canny边缘检测算法是利用局部极值检测边缘的方法,canny根据边缘检测的要求,定义了下面三个最有准则:
1)最优检测。对真实边缘不漏检,非边缘点补错检,即要求输出信噪比最大。
2)最优检测精度。检测的边缘点的位置距实际的边缘点的位置最近。
3)检测点与边缘点。每一个实际存在的边缘点和检测的边缘点是一一对应的关系。
Canny首次将上述判断用数学的形式表示出来,然后采用最优化数值方法,得到最佳边缘检测模板。对于二维图形,需要使用若干方向的模板分别对图像进行卷积处理,再取最可能的边缘方向。对于阶跃型的边缘,canny推出的最优边缘检测器的形状与高斯函数的一阶导数类似,二维高斯函数的对称性和分解性,我们可以很容易的计算高斯函数在任一方向上的方向导数与图像的卷积。因此,在实际应用中可以选取高斯函数的一阶导数作为阶跃边缘的次最优检测算子。设二维高斯函数为

在某一个方向 上 的一阶方向导数为

式中

是矢量方向, 是梯度矢量。将图像 与 做卷积,同时改变 的方向, 取得最大值时的 就是正交与边缘检测的方向。由



因此,对应于极值的方向

在该方向上 有最大输出响应,此时

二维次最优阶跃边缘算子是以卷积 为基础的,边缘强度由 决定,而边缘方向为式子 在实际应用中,我们将原始模板截断到有限尺寸N。
Canny边缘检测算子检测的边缘是滤波结果的局部极值点,由于函数的一阶导数局部极值点对应二阶导数的过零点,Canny边缘检测算子对于阶跃边缘可以准确定位,但对于屋顶边缘,Canny边缘检测算子是不适用的。这一点也可以由Canny边缘检测算子的准则是针对阶跃边缘定义反映出来。