0. 完整仓库 & 教程:
这一章节的完整代码在:Chapter 4. Edge Detection and Grayscale Transformation
如果你喜欢这个系列的文章或者感觉对你有帮助,请给我的仓库一个⭐️。
1. 边缘检测
-
1.1 拉普拉斯算子
算法:
拉普拉斯算子是二阶微分算子,公式如下:
在二维函数中,两个方向的二阶差分分别为:
可得拉普拉斯算子的差分形式:
所以我们可以使用如下3x3系数卷积来实现拉普拉斯:
图像和结果对比(lena, goldhill):
结果分析:
拉普拉斯算子通过增强图像的灰度对比来实现锐化效果。作为一个二阶微分算子,它增强了图像中灰度突变的区域,并减弱了灰度变化缓慢的区域。但处理后的图像失去了边缘的方向信息,并增强了噪声。
代码实现(完整代码见顶部GitHub):
for(int i = 0; i < image->Height; i++) {
for(int j = 0; j < image->Width; j++) {
sum = 0;
for(int m = -1; m <= 1; m += 2) {
for(int n = -1; n <= 1; n += 2) {
// use boundary check:
sum += boundaryCheck(j + n, i + m, image->Width, image->Height) ? tempin[image->Width * (i + m) + (j + n)] : 0;
}
}
int temp = tempin[image->Width * i + j] * 4 - sum;
// handle excess values:
if(temp > 255) temp = 255;
if(temp < 0) temp = 0;
tempout[image->W