形态学梯度 - MorphGradient
函数简介
计算图像的形态学梯度。此函数通过形态学操作计算图像的梯度,可以突出图像的边缘信息。形态学梯度是膨胀图像与腐蚀图像的差值,能够有效地检测图像中的边缘和轮廓。
接口名称
MorphGradient
DLL调用
long MorphGradient(long instance, long ptr, int kernelSize)
参数说明
参数名 | 类型 | 说明 |
---|---|---|
instance | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
ptr | 长整数型 | 图像指针,由图像处理函数返回 |
kernelSize | 整数型 | 形态学核的大小,通常为奇数(3、5、7等) |
示例
// 基本形态学梯度计算
long image = LoadImage(ola, "D:\\test\\image.png");
if (image != 0) {
// 转换为灰度图
long grayImage = ConvertColor(ola, image, 0);
if (grayImage != 0) {
// 计算形态学梯度
long gradientImage = MorphGradient(ola, grayImage, 3);
if (gradientImage != 0) {
printf("形态学梯度计算完成\n");
ShowImage(ola, gradientImage);
FreeImagePtr(ola, gradientImage);
}
FreeImagePtr(ola, grayImage);
}
FreeImagePtr(ola, image);
}
// 不同核大小的对比
long image = LoadImage(ola, "D:\\test\\image.png");
if (image != 0) {
long grayImage = ConvertColor(ola, image, 0);
if (grayImage != 0) {
// 不同核大小的形态学梯度
long gradient3 = MorphGradient(ola, grayImage, 3);
long gradient5 = MorphGradient(ola, grayImage, 5);
long gradient7 = MorphGradient(ola, grayImage, 7);
printf("不同核大小的形态学梯度计算完成\n");
// 释放内存
if (gradient3 != 0) FreeImagePtr(ola, gradient3);
if (gradient5 != 0) FreeImagePtr(ola, gradient5);
if (gradient7 != 0) FreeImagePtr(ola, gradient7);
FreeImagePtr(ola, grayImage);
}
FreeImagePtr(ola, image);
}
// 图像处理流程中的形态学梯度
long image = LoadImage(ola, "D:\\test\\target.png");
if (image != 0) {
// 转换为灰度
long grayImage = ConvertColor(ola, image, 0);
if (grayImage != 0) {
// 阈值化
long binaryImage = Threshold(ola, grayImage, 128.0, 255.0, 0);
if (binaryImage != 0) {
// 去除小面积孤岛
long cleanedImage = RemoveIslands(ola, binaryImage, 100);
if (cleanedImage != 0) {
// 计算形态学梯度
long gradientImage = MorphGradient(ola, cleanedImage, 3);
if (gradientImage != 0) {
printf("图像处理流程完成,已计算形态学梯度\n");
FreeImagePtr(ola, gradientImage);
}
FreeImagePtr(ola, cleanedImage);
}
FreeImagePtr(ola, binaryImage);
}
FreeImagePtr(ola, grayImage);
}
FreeImagePtr(ola, image);
}
// 屏幕截图的边缘检测
long screen = GetScreenDataPtr(ola, 0, 0, 1920, 1080);
if (screen != 0) {
// 转换为灰度
long grayScreen = ConvertColor(ola, screen, 0);
if (grayScreen != 0) {
// 计算形态学梯度进行边缘检测
long edgeImage = MorphGradient(ola, grayScreen, 5);
if (edgeImage != 0) {
printf("屏幕截图边缘检测完成\n");
FreeImagePtr(ola, edgeImage);
}
FreeImagePtr(ola, grayScreen);
}
FreeImagePtr(ola, screen);
}
// 结合其他图像处理函数
long image = LoadImage(ola, "D:\\test\\complex.png");
if (image != 0) {
long grayImage = ConvertColor(ola, image, 0);
if (grayImage != 0) {
// 先进行形态学梯度
long gradientImage = MorphGradient(ola, grayImage, 3);
if (gradientImage != 0) {
// 对梯度图像进行阈值化
long binaryGradient = Threshold(ola, gradientImage, 50.0, 255.0, 0);
if (binaryGradient != 0) {
printf("梯度图像二值化完成\n");
FreeImagePtr(ola, binaryGradient);
}
FreeImagePtr(ola, gradientImage);
}
FreeImagePtr(ola, grayImage);
}
FreeImagePtr(ola, image);
}
返回值
int64_t: 返回形态学梯度图像指针
注意事项
- 形态学梯度 = 膨胀图像 - 腐蚀图像
- kernelSize参数决定了形态学操作的结构元素大小
- 较大的核会产生更粗的边缘,较小的核会产生更细的边缘
- 建议使用奇数作为核大小(3、5、7等)
- 处理后的图像需要手动释放内存
- 适用于边缘检测、轮廓提取、图像分割等场景
- 与 Threshold 函数配合使用可以提取边缘
- 形态学梯度能够有效突出图像的边缘信息