You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Aforge BlobCounter提取并显示8连通符合条件的Blob

如何用AForge.Net的BlobCounter生成仅显示8连通合格Blob的二值图像?

嘿,刚好做过类似的需求,我来一步步帮你实现!你已经完成了Blob的尺寸过滤设置,现在只需要补充几个关键步骤就能生成目标二值图了:

核心思路

  1. 先把BlobCounter的连通模式改成8连通(默认是4连通,这是最容易忽略的点)
  2. 执行Blob分析后,提取所有符合尺寸条件的Blob
  3. 创建一张全黑背景的空白图,把每个合格Blob的像素区域填充为白色

完整代码实现

把你的现有代码补全后,完整的代码应该是这样的:

// 初始化BlobCounter并设置过滤规则
BlobCounter blobCounter = new BlobCounter();
blobCounter.FilterBlobs = true;
blobCounter.MinWidth = minWidth;
blobCounter.MinHeight = minHeight;
blobCounter.MaxWidth = maxWidth;
blobCounter.MaxHeight = maxHeight;

// 关键设置:启用8连通区域分析
blobCounter.Neighbors = 8;

// 假设你的输入二值图像是名为inputImage的Bitmap对象
// 如果输入不是二值图,建议先用AForge的Threshold类转成二值图再处理
blobCounter.ProcessImage(inputImage);

// 获取所有通过过滤的Blob信息
Blob[] qualifiedBlobs = blobCounter.GetObjectsInformation();

// 创建和原图尺寸一致的空白二值图像(背景全黑)
Bitmap resultImage = new Bitmap(inputImage.Width, inputImage.Height, PixelFormat.Format8bppIndexed);

// 配置二值图调色板(确保只有黑白两色)
ColorPalette palette = resultImage.Palette;
for (int i = 0; i < 256; i++)
{
    palette.Entries[i] = Color.FromArgb(i, i, i);
}
resultImage.Palette = palette;

// 锁定图像内存以提升绘制效率
BitmapData bitmapData = resultImage.LockBits(
    new Rectangle(0, 0, resultImage.Width, resultImage.Height),
    ImageLockMode.WriteOnly,
    PixelFormat.Format8bppIndexed
);

// 遍历每个合格Blob,将其像素区域填充为白色
foreach (Blob blob in qualifiedBlobs)
{
    // 获取Blob的所有像素点(8连通区域内的全部像素)
    List<IntPoint> blobPixels = blobCounter.GetBlobPixels(blob);
    
    foreach (IntPoint point in blobPixels)
    {
        // 计算像素在内存中的偏移位置,设置为白色(255)
        int byteOffset = point.Y * bitmapData.Stride + point.X;
        Marshal.WriteByte(bitmapData.Scan0, byteOffset, 255);
    }
}

// 解锁图像内存
resultImage.UnlockBits(bitmapData);

// 现在resultImage就是你需要的仅显示合格8连通Blob的二值图了

几个重要注意事项

  • 必须设置Neighbors=8:这是实现8连通Blob识别的核心,默认的4连通会把相邻的斜向像素判定为不同区域,完全不符合你的需求
  • 输入图像最好是二值图:如果你的原始图像不是黑白二值的,建议先用AForge的Threshold类做二值化处理,否则BlobCounter的分析结果会不准确
  • 高效填充Blob:用GetBlobPixels获取完整像素点比绘制边缘更可靠,能确保整个Blob区域都被填充为白色
  • 内存管理:记得用using语句包裹Bitmap对象,避免内存泄漏,比如:using (Bitmap resultImage = new Bitmap(...)) { ... }

内容的提问来源于stack exchange,提问作者alpine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:01:01