C语言数字图像处理(九):阈值处理和边缘检测

C语言数字图像处理系列继续更新~

这一章节的完整代码在:9. Thresholding, Roberts, Prewitt, Sobel, and Edge Detection

如果你喜欢这个系列的文章或者感觉对你有帮助,请给我的仓库一个⭐️

1. 图像梯度和阈值处理

1.1 Roberts算子

Roberts 边缘提取算子有一个 2x2 的模板(mask),它使用两个对角相邻像素之间的差异,然后取两个对角像素之间差异的平方和。 模板如下:

​算法为:

图像和结果对比 (headCT_Vandy.pgm, building_original.pgm, noisy_fingerprint):

结果分析:

Roberts 算法使用局部差分算子来查找边缘。 当图像中的边缘接近+45度或-45度时,该算法效果更好。 Roberts算子对边缘的定位精度较高。 从处理结果来看,Roberts 算法对噪声比较敏感,因此适合于边缘比较明显、噪声较少的图像分割。

代码实现:

void Roberts(Image *image) {
    unsigned char *tempin, *tempout;
    float temp1, temp2;
    Image *outimage;
    outimage = CreateNewImage(image, (char*)"#testing function");
    tempin = image->data;
    tempout = outimage->data;
    
    for(int i = 0; i < image->Height-1; i++) {
        for(int j = 0; j < image->Width-1; j++) {
            temp1 = pow((float)tempin[image->Width * i + j] - (float)tempin[image->Width * (i+1) + j + 1], 2);
            temp2 = pow((float)tempin[image->Width * i + j + 1] - (float)tempin[image->Width * (i+1) + j], 2);
            tempout[image->Width * i + j] = (int)sqrt(temp1 + temp2);
        }
    }
    outimage = Threshold(outimage);
    SavePNMImage(outimage, (char*)"Roberts.pgm");
}

1.2 Prewitt算子:

Prewitt算子使用3×3的模板来计算区域内的值,其公式为:

相应的公式为:

图像和结果对比 (headCT_Vandy.pgm, building_original.pgm, noisy_fingerprint):

结果分析:

Prewitt算子采用3×3的模板来计算区域内的像素值,因此其边缘检测结果在水平和垂直方向上都比Robert算子明显。 Prewitt算子对噪声有一定的抑制作用。 抑制噪声的原理是像素平均,但Prewitt算子在定位边缘方面不如Roberts算子,而且可能会产生宽度为多个像素的边缘。 因此,Prewitt算子适合识别有一定噪声、灰度梯度明显的图像。

代码实现(完整

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值