基于Aforge BlobCounter提取并显示8连通符合条件的Blob
如何用AForge.Net的BlobCounter生成仅显示8连通合格Blob的二值图像?
嘿,刚好做过类似的需求,我来一步步帮你实现!你已经完成了Blob的尺寸过滤设置,现在只需要补充几个关键步骤就能生成目标二值图了:
核心思路
- 先把BlobCounter的连通模式改成8连通(默认是4连通,这是最容易忽略的点)
- 执行Blob分析后,提取所有符合尺寸条件的Blob
- 创建一张全黑背景的空白图,把每个合格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
相关产品推荐
相关产品推荐

