Emgu学习之(四)——图像阈值

Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1o7lxYSM

内容

在这篇文章中将提到以下内容:

  • 全局阈值
  • 自适应阈值
  • Otsu‘s二值化

  在图像处理中,会希望忽略掉一些灰度细节,只保留主体的轮廓,对灰度图像进行阈值化处理能达到这个目的。

  “其基本的思想是,给定一个数组和一个阈值,然后根据数组中的每个元素的值是低于还是高于阈值而进行一些处理”——《学习OpenCV(中文版)》,这里说的“数组”即为图像数据,

而“进行一些处理”说的是进行分类,只有两类,根据值不同分到不同的类中。

准备工作

  

  • 设置imageBox1和imageBox2的SizeMode属性为StretchImage

全局阈值

  全局阈值指的是整个图像数据使用一个阈值进行筛选分类,OpenCV提供cvThreshold()方法进行阈值化操作,在Emgu中对应的方法名称为Threshold。

Threshold方法接受一个类型为ThresholdType的参数,ThresholdType是一个枚举类型,其枚举值为:

1         Binary = 0,
2         BinaryInv = 1,
3         Trunc = 2,
4         ToZero = 3,
5         ToZeroInv = 4,
6         Mask = 7,//这里不做介绍
7         Otsu = 8 //后面会做介绍


  • Binary(二进制阈值化)——二进制阈值化是指将大于阀值的像素点设置为最大值,而小于阀值的像素点设置为0,即:

  value = value > threshold ? max_value : 0

  

  • BinaryInv(反向二进制阈值化)——与二进制阈值化正好相反,反向二进制阈值化是在像素点的值大于阀值时像素点设置为0,反之则设置为最大值,即:

  value = value > threshold ? 0 : max_value

  

  • Trunc(截断阈值化)——截断阈值化是指当像素点的值大于阀值时,像素点的值设置为阀值,反之则保留像素值本身,即:

  value = value > threshold ? threshold : value

  

  • ToZero(超阈值归零化)——超阈值归零化是指当像素点的值大于阀值时,像素点保留原值,反之则设置为0,即:

  value = value > threshold ? value : 0

  

  • ToZeroINV(低于阈值归零化)——与超阈值归零化相反,低于阈值归零化是指当像素点的值大于阀值时,像素点值被设置为0,反之则保留像素点原值,即:

  value = value > threshold ? 0 : value

  

  从上边描述我们可以看出二进制阈值化/反二进制阈值化需要一个max_value(最大值)的参数,同时,二进制阈值化/反二进制阈值化处理后图像数据中只存在两种

可能的值:0和max_value,这种图像称为二值化图像。

  “在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮

廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,

否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。”——百度百科

  下面的代码显示了如何使用二进制阈值化处理,如果你要使用不是二进制阈值化处理,那么max_value可以不用在意设什么值。

 1         private void Form1_Load(object sender, EventArgs e)
 2         {
 3             using (var image = new Image<Bgr, Byte>(Properties.Resources.chess3))
 4             {
 5                 var grayImage = image.Convert<Gray, Byte>();//转为灰度图
 6                 var threshImage = grayImage.CopyBlank();
 7
 8                 CvInvoke.Threshold(
 9                     grayImage,
10                     threshImage,
11                     150, //阀值
12                     255, //最大值
13                     ThresholdType.Binary);//二进制阈值化
14
15                 imageBox1.Image = grayImage;
16                 imageBox2.Image = threshImage;
17             }
18     }

  效果如下: Binary -> BinaryInv -> Trunc -> ToZero -> ToZeroInv

             

自适应阈值

  全局阈值是整幅图像使用一个阀值,这并不能适应所有的情况。自适应阈值是图像的不同的区域使用不同的阀值,而阀值是对这个区域计算得来的,OpenCV提供cvAdaptiveThreshold()

函数进行自适应阈值化处理,这个函数提供两种计算阀值的方法,分别为CV_ADAPTIVE_THRESH_MEAN_C和CV_ADAPTIVE_THRESH_GAUSSIAN_C。

  “在这两种情况下,自适应阈值T(x,y)在每个像素点都不同。通过计算像素点周围的b x b区域的加权平均,然后减去一个常数来得到自适应阈值, b有参数block_size指定,常数有param1

指定。如果使用CV_ADAPTIVE_THRESH_MEAN_C方法,那么对区域的所有像素平均加权。如果使用了CV_ADAPTIVE_THRESH_GAUSSIAN_C放,那么区域中的(x,y)周围的像素

根据高斯函数按照它们离中心点的距离进行加权计算。”——《学习OpenCV(中文版)》

  Emgu中CVInvoke类提供了AdaptiveThreshold静态方法进行自适应阈值处理,这个方法的原型为:

1       public static void AdaptiveThreshold(
2          IInputArray src, //原图像
3          IOutputArray dst, //结果图像
4          double maxValue, //二进制阈值化/反二进制阈值化处理使用到的最大值
5          CvEnum.AdaptiveThresholdType adaptiveType, // 自适应阈值计算方式:MeanC或GaussianC
6          CvEnum.ThresholdType thresholdType, //阈值化方式,必须为二进制阈值化和反二进制阈值化之一(Binary / BinaryInv)
7          int blockSize, //计算使用的区域矩阵大小:3,5,7,9...
8          double param1) //常数      

  同时,Image类也提供了一个封装了AdaptiveThreshold方法的ThresholdAdaptive方法,下面的代码中使用的几位Image类的ThresholdAdaptive方法:

 1        private void Form1_Load(object sender, EventArgs e)
 2         {
 3             var grayImage = new Image<Gray, Byte>(Properties.Resources.chess3);
 4             //CvInvoke.AdaptiveThreshold(grayImage, threshImage, 255, AdaptiveThresholdType.GaussianC, ThresholdType.BinaryInv, 12, 5);
 5             var threshImage = grayImage.ThresholdAdaptive(
 6                 new Gray(255),
 7                 AdaptiveThresholdType.MeanC,
 8                 ThresholdType.Binary,
 9                 9,
10                 new Gray(5));
11
12             imageBox1.Image = grayImage;
13             imageBox2.Image = threshImage;
14         }

  执行效果为:MeanC -> GaussianC

        

Otsu二值化

  在全局阈值的代码中,我们使用150作为二进制阈值化的阀值,但是这个阀值是我随意选择的,我并不确定这个阀值是否是合适的阈值。而如果使用Otsu二值化方法,它可以根据

图像的直方图计算出一个阀值。使用Otsu方法用到的是全局阈值提到过的Threshold方法,只是在传入的ThresholdType值为Otsu,代码如下:

 1             var grayImage = new Image<Gray, Byte>(Properties.Resources.chess3);
 2             var threshImage = grayImage.CopyBlank();
 3             CvInvoke.Threshold(
 4                 grayImage,
 5                 threshImage,
 6                 0,
 7                 255,
 8                 ThresholdType.Otsu);
 9
10             imageBox1.Image = grayImage;
11             imageBox2.Image = threshImage;

  运行效果:

  

时间: 2024-08-07 04:14:19

Emgu学习之(四)——图像阈值的相关文章

Emgu学习之(三)——操作图像数据

Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1jHmlQeE 内容 在这篇文章中将提到以下内容: 修改像素值 图像ROI 图像加法 图像减法 按位运算 图像混合 准备工作 创建工程:参考Emgu学习之(一)——Emgu介绍创建一个WinForm项目 Form1.cs引用命名空间: 1 using Emgu.CV; 2 using Emgu.CV.Structure; 3 using Emgu.CV.CvEnum; 界面:在F

Emgu 图像阈值

原文地址:http://www.cnblogs.com/CoverCat/p/5043833.html 转载,备查 Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1o7lxYSM 内容 在这篇文章中将提到以下内容: 全局阈值 自适应阈值 Otsu's二值化 在图像处理中,会希望忽略掉一些灰度细节,只保留主体的轮廓,对灰度图像进行阈值化处理能达到这个目的. "其基本的思想是,给定一个数组和一个阈值,然后根据数组中的每个元素的值是

Emgu学习之(二)——图像读取、显示、保存

visual Studio Community 2015 工程和源代码:http://pan.baidu.com/s/1o6u5Fdw 内容 在这篇文章中将提到以下内容: 从文件中读取图像 Image类 显示图像 保存图像 在上一篇文章Emgu学习之(一)——Emgu介绍中,我介绍了如何创建Emgu的工程,但是上一个Demo使用的是OpenCV的HighGUI窗体显示图像,这一 次我们要用WinForm窗体显示图像,并将图像进行操作后另存为新的图像文件.首先我们要做的是在Visual studi

opencv学习之路(13)、图像阈值化

一.图像阈值化简介 二.固定阈值 三.自适应阈值 1 #include<opencv2/opencv.hpp> 2 using namespace cv; 3 4 void main(){ 5 Mat src=imread("E://1.jpg",0);//以灰度模式读入 6 Mat dst; 7 //threshold(src,dst,100,255,CV_THRESH_BINARY); 8 //adaptiveThreshold(src,dst,255,CV_ADAPT

opencv2函数学习之threshold:实现图像阈值化

在opencv2中,threshold函数可以进行阈值化操作. double threshold( const Mat& src, Mat& dst, double thresh,double maxVal, int thresholdType ); 参数: src:原图像. dst:结果图像. thresh:当前阈值. maxVal:最大阈值,一般为255. thresholdType:阈值类型,主要有下面几种: enum { THRESH_BINARY=0, THRESH_BINARY

[转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自<OpenCV_基于局部自适应阈值的图像二值化>) 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的.亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适

从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

原文:从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery中的Ajax 从零开始学习jQuery (七) jQuery动画-让页面动起来!

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop