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算子适合识别有一定噪声、灰度梯度明显的图像。
代码实现(完整