图像阈值化 - Threshold
函数简介
对图像进行阈值化处理。此函数支持多种阈值化方法,包括二值化、反二值化、截断、阈值化、反阈值化、OTSU自动阈值化等。适用于图像分割、目标检测、噪声去除等场景。
接口名称
Threshold
DLL调用
long Threshold(long instance, long ptr, double thresh, double maxVal, int type)
参数说明
参数名 | 类型 | 说明 |
---|---|---|
instance | 长整数型 | OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。 |
ptr | 长整数型 | 图像指针,由图像处理函数返回 |
thresh | 双精度浮点数 | 阈值 |
maxVal | 双精度浮点数 | 最大值 不超过255 |
type | 整数型 | 阈值化类型: 0: 二值化 1: 反二值化 2: 截断 3: 阈值化 4: 反阈值化 5: 阈值化OTSU 6: 反阈值化OTSU |
示例
// 基本二值化处理
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) {
printf("图像已二值化处理\n");
ShowImage(ola, binaryImage);
FreeImagePtr(ola, binaryImage);
}
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 invertedBinary = Threshold(ola, grayImage, 128.0, 255.0, 1);
if (invertedBinary != 0) {
printf("图像已反二值化处理\n");
FreeImagePtr(ola, invertedBinary);
}
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 truncatedImage = Threshold(ola, grayImage, 128.0, 255.0, 2);
if (truncatedImage != 0) {
printf("图像已截断处理\n");
FreeImagePtr(ola, truncatedImage);
}
FreeImagePtr(ola, grayImage);
}
FreeImagePtr(ola, image);
}
// OTSU自动阈值化
long image = LoadImage(ola, "D:\\test\\image.png");
if (image != 0) {
long grayImage = ConvertColor(ola, image, 0);
if (grayImage != 0) {
// OTSU自动阈值化(thresh参数会被忽略)
long otsuImage = Threshold(ola, grayImage, 0.0, 255.0, 5);
if (otsuImage != 0) {
printf("图像已OTSU阈值化处理\n");
FreeImagePtr(ola, otsuImage);
}
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) {
printf("屏幕截图已OTSU阈值化处理\n");
// 可以进一步处理,如去除孤岛
long cleanedScreen = RemoveIslands(ola, binaryScreen, 100);
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 binary = Threshold(ola, grayImage, 128.0, 255.0, 0);
// 反二值化
long inverted = Threshold(ola, grayImage, 128.0, 255.0, 1);
// 截断
long truncated = Threshold(ola, grayImage, 128.0, 255.0, 2);
// OTSU
long otsu = Threshold(ola, grayImage, 0.0, 255.0, 5);
printf("不同阈值化方法处理完成\n");
// 释放内存
if (binary != 0) FreeImagePtr(ola, binary);
if (inverted != 0) FreeImagePtr(ola, inverted);
if (truncated != 0) FreeImagePtr(ola, truncated);
if (otsu != 0) FreeImagePtr(ola, otsu);
FreeImagePtr(ola, grayImage);
}
FreeImagePtr(ola, image);
}
返回值
int64_t: 返回处理后的图像指针
注意事项
- 阈值化类型说明:
- 0: 二值化 - 像素值大于阈值设为maxVal,否则设为0
- 1: 反二值化 - 像素值大于阈值设为0,否则设为maxVal
- 2: 截断 - 像素值大于阈值设为阈值,否则保持不变
- 3: 阈值化 - 像素值大于阈值设为maxVal,否则保持不变
- 4: 反阈值化 - 像素值大于阈值保持不变,否则设为maxVal
- 5: 阈值化OTSU - 自动计算最优阈值进行二值化
- 6: 反阈值化OTSU - 自动计算最优阈值进行反二值化
- OTSU方法会自动计算最优阈值,thresh参数会被忽略
- 建议先转换为灰度图像再进行阈值化处理
- 处理后的图像需要手动释放内存
- 与 RemoveIslands 函数配合使用可以去除噪声
- 适用于图像分割、目标检测、OCR预处理等场景