OpenCvSharp—图像分割
·
最简单的阈值分割即为手动设置阈值对图像进行二值化,大于设定的阈值像素值设置为255,小于设定阈值则为0.这种方法一般称为全局阈值分割。
下面介绍的是一种局部阈值分割算法,其原理很简单,通俗地讲就是图片的每个局部都会通过处理得到一个阈值,这个区域就用这个阈值来进行分割,同理,每个区域都有不同的阈值来处理,如何来获取这个阈值就是整个算法的关键。
本次介绍的分割方法如下:
方法一:阈值分割
Cv2.Threshold;(手动操作),程序参考上节的图像二值化。
方法二:自适应阈值分割
Sigma的一阶高斯滤波器
/*
* 第一个参数,InputArray src,原图,即输入图像,是一个8位单通道的图像;
* 第二个参数,OutputArray dst,目标图像,与原图像具有同样的尺寸与类型;
* 第三个参数,double maxValue,分配给满足条件的像素的非零值;
* 第四个参数,int adaptiveMethod,自适应阈值的方法,通常有以下几种方法;
* ADAPTIVE_THRESH_MEAN_C,阈值T(x, y)是(x, y)减去C的Blocksize×Blocksize邻域的平均值。
* ADAPTIVE_THRESH_GAUSSIAN_C ,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的加权和(与高斯相关),默认sigma(标准差)用于指定的Blocksize;具体的情况可以参见getGaussianKernel函数;
第五个参数,int thresholdType,阈值的类型必须是以下两种类型,
THRESH_BINARY,正向二值化
THRESH_BINARY_INV ,反向二值化
* 第六个参数,int blockSize,计算blocksize x blocksize大小的领域内的阈值,必须为奇数,例如,3,5,7等等,一般二值化使用21,31,41;
* 第七个参数,double C,从平均数或加权平均数减去常量。通常,它是正的,但也可能是零或负数。,二值化时使用的7。
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace Adaptive_Threshold
{
class Program
{
static void Main(string[] args)
{
string FileName = "1.jpg";
Mat InputImage = new Mat(FileName, ImreadModes.Grayscale);
Mat Output = new Mat();
Console.WriteLine("开始处理图像.....");
Mat DispositionImage = Cv2.ImRead(FileName, ImreadModes.Grayscale);
//分割图像
int ReadValue = Console.Read();
Cv2.AdaptiveThreshold(DispositionImage, Output, 255,
AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, ReadValue, 1);
Cv2.ImShow("自适应阈值分割", Output);
Cv2.WaitKey(10);
Console.ReadKey();
}
}
}
变量ReadValue=3的时候的处理结果如下:
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)