如何高效运用OpenCVSharp进行复杂连通性检测?
摘要:连通性检测 连通性检测是计算机视觉中的一种基础图像处理技术,用于识别和标记二值图像中相互连接的像素区域。简单来说,它能够找出图像中所有独立的"连通区域"(即像素之间相互连接形成的区域)。
连通性检测
连通性检测是计算机视觉中的一种基础图像处理技术,用于识别和标记二值图像中相互连接的像素区域。简单来说,它能够找出图像中所有独立的"连通区域"(即像素之间相互连接形成的区域)。
应用场景
更多的是其它图像处理的一个前置步骤,可能有时候可以用来统计物体数量,但是使用场景很有限。
效果
实践
图像灰度化
首先需要将图像转化为灰度图:
// 转换为灰度图像
using var gray = src.CvtColor(ColorConversionCodes.BGR2GRAY);
灰度图是一种只包含亮度信息而不包含颜色信息的图像表示方式,它将彩色图像中的每个像素转换为从黑色(最暗)到白色(最亮)的256个灰度级别中的一个值,通常用0-255的数值来表示,其中0代表纯黑色,255代表纯白色,中间值代表不同深浅的灰色。
图像二值化
然后再将灰度图转化为二值图像:
// 二值化处理
using var binary = new Mat();
ThresholdTypes thresholdType = GetThresholdType();
if (ThresholdType == "Adaptive")
{
Cv2.AdaptiveThreshold(gray, binary, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 11, 2);
}
else
{
Cv2.Threshold(gray, binary, ThresholdValue, 255, thresholdType);
}
private ThresholdTypes GetThresholdType()
{
return ThresholdType switch
{
"Otsu" => ThresholdTypes.Otsu,
"Binary" => ThresholdTypes.Binary,
_ => ThresholdTypes.Otsu
};
}
这里展示了OpenCVSharp中进行图像二值化的两种方法,分别是Cv2.AdaptiveThreshold与Cv2.Threshold。
先来看下Cv2.AdaptiveThreshold:
public static void AdaptiveThreshold(InputArray src, OutputArray dst,
double maxValue, AdaptiveThresholdTypes adaptiveMethod, ThresholdTypes thresholdType, int blockSize, double c)
{
if (src is null)
throw new ArgumentNullException(nameof(src));
if (dst is null)
throw new ArgumentNullException(nameof(dst));
src.ThrowIfDisposed();
dst.ThrowIfNotReady();
NativeMethods.HandleException(
NativeMethods.imgproc_adaptiveThreshold(src.CvPtr, dst.CvPtr, maxValue, (int) adaptiveMethod, (int)thresholdType, blockSize, c));
GC.KeepAlive(src);
GC.KeepAlive(dst);
dst.Fix();
}
AdaptiveThreshold 方法是OpenCV中的一个自适应阈值处理函数,它的主要作用是对图像进行局部自适应的二值化处理。
与全局阈值处理不同,它不是对整个图像使用单一的阈值,而是根据图像中每个像素周围的局部区域动态计算阈值。这种方法特别适用于光照不均匀的图像,能够更好地处理图像中不同区域亮度差异较大的情况。
该方法通过计算每个像素周围邻域的平均值或高斯加权平均值,然后减去一个常数c来得到局部阈值,最后根据这个局部阈值对像素进行二值化。在连通性分析应用中,自适应阈值能够在光照不均匀的情况下产生比全局阈值更好的二值化效果,从而提高连通区域检测的准确性。
