去除孤岛 - RemoveIslands
函数简介
去除图像中的孤岛(小面积连通区域)。此函数可以去除二值化图像中面积小于指定阈值的连通区域,常用于图像去噪、目标检测预处理等场景。适用于清理二值化图像中的噪声点和小面积干扰。
接口名称
RemoveIslands
DLL调用
long RemoveIslands(long instance, long ptr, int minArea)
参数说明
参数名 | 类型 | 说明 |
---|---|---|
instance | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
ptr | 长整数型 | 图像指针,由图像处理函数返回 |
minArea | 整数型 | 最小面积阈值,小于此面积的连通区域将被去除 |
示例
// 基本孤岛去除
long image = LoadImage(ola, "D:\\test\\noisy.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) {
printf("已去除面积小于100像素的孤岛\n");
ShowImage(ola, cleanedImage);
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) {
// OTSU阈值化
long binaryScreen = Threshold(ola, grayScreen, 0.0, 255.0, 5);
if (binaryScreen != 0) {
// 去除小面积噪声
long cleanedScreen = RemoveIslands(ola, binaryScreen, 50);
if (cleanedScreen != 0) {
printf("屏幕截图已去除小面积噪声\n");
FreeImagePtr(ola, cleanedScreen);
}
FreeImagePtr(ola, binaryScreen);
}
FreeImagePtr(ola, grayScreen);
}
FreeImagePtr(ola, screen);
}
// 不同面积阈值的对比
long image = LoadImage(ola, "D:\\test\\image.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 cleaned10 = RemoveIslands(ola, binaryImage, 10);
long cleaned50 = RemoveIslands(ola, binaryImage, 50);
long cleaned100 = RemoveIslands(ola, binaryImage, 100);
printf("不同面积阈值处理完成\n");
// 释放内存
if (cleaned10 != 0) FreeImagePtr(ola, cleaned10);
if (cleaned50 != 0) FreeImagePtr(ola, cleaned50);
if (cleaned100 != 0) FreeImagePtr(ola, cleaned100);
FreeImagePtr(ola, binaryImage);
}
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);
}
返回值
int64_t: 返回处理后的图像指针
注意事项
- 此函数主要适用于二值化图像
- minArea参数决定了保留的连通区域的最小面积
- 面积小于minArea的连通区域将被完全去除
- 建议在阈值化处理后使用此函数
- 处理后的图像需要手动释放内存
- 与 Threshold 函数配合使用效果更佳
- 适用于图像去噪、目标检测预处理、OCR图像清理等场景
- 面积阈值的选择需要根据具体应用场景调整