Emgu 图像阈值

原文地址:http://www.cnblogs.com/CoverCat/p/5043833.html

转载,备查

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

内容

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

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

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

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

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

准备工作

 using Emgu.CV;
 using Emgu.CV.Structure;
 using Emgu.CV.CvEnum;

  

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

全局阈值

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

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

Binary = 0,BinaryInv = 1,
Trunc = 2,
ToZero = 3,
ToZeroInv = 4,
Mask = 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可以不用在意设什么值。

     {
            using (var image = new Image<Bgr, Byte>(Properties.Resources.chess3))
            {
                var grayImage = image.Convert<Gray, Byte>();//转为灰度图
                var threshImage = grayImage.CopyBlank();

                CvInvoke.Threshold(
                    grayImage,
                    threshImage,
                    150, //阀值
                    255, //最大值
                    ThresholdType.Binary);//二进制阈值化

                imageBox1.Image = grayImage;
                imageBox2.Image = threshImage;
            }
    }

 效果如下: 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静态方法进行自适应阈值处理,这个方法的原型为:

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

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

        private void Form1_Load(object sender, EventArgs e)
        {
            var grayImage = new Image<Gray, Byte>(Properties.Resources.chess3);
            //CvInvoke.AdaptiveThreshold(grayImage, threshImage, 255, AdaptiveThresholdType.GaussianC, ThresholdType.BinaryInv, 12, 5);
            var threshImage = grayImage.ThresholdAdaptive(
                new Gray(255),
                AdaptiveThresholdType.MeanC,
                ThresholdType.Binary,
                9,
                new Gray(5));

            imageBox1.Image = grayImage;
            imageBox2.Image = threshImage;
        }

执行效果为:MeanC -> GaussianC

        

Otsu二值化

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

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

            var grayImage = new Image<Gray, Byte>(Properties.Resources.chess3);
            var threshImage = grayImage.CopyBlank();
            CvInvoke.Threshold(
                grayImage,
                threshImage,
                0,
                255,
                ThresholdType.Otsu);

            imageBox1.Image = grayImage;
            imageBox2.Image = threshImage;

运行效果:

  

时间: 2024-07-30 23:38:22

Emgu 图像阈值的相关文章

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

OpenCV实现图像阈值化

纯粹阅读,请移步OpenCV实现图像阈值化 效果图 源码 KqwOpenCVBlurDemo 阈值化是一种将我们想要在图像中分析的区域分割出来的方法. 我们把每个像素值都与一个预设的阈值做比较,再根据比较的结果调整像素值. 类似这样 Imgproc.threshold(src,src,100,255,Imgproc.THRESH_BINARY); 其中100是阈值,255是最大值(纯白色的值). 常量 名称 常量 二值阈值化 Imgproc.THRESH_BINARY 阈值化到零 Imgproc

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学习之(四)——图像阈值

Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1o7lxYSM 内容 在这篇文章中将提到以下内容: 全局阈值 自适应阈值 Otsu's二值化 在图像处理中,会希望忽略掉一些灰度细节,只保留主体的轮廓,对灰度图像进行阈值化处理能达到这个目的. “其基本的思想是,给定一个数组和一个阈值,然后根据数组中的每个元素的值是低于还是高于阈值而进行一些处理”——<学习OpenCV(中文版)>,这里说的“数组”即为图像数据, 而“进行一些处

python中使用mahotas包函数实现图像阈值处理

阈值处理是将图像按照特定的一个值将图像分为1/0两个值. mahotas使用两种方式,一种是传统的otsu方式,另外一种是Rildley-Calavard当时 import mahotas as mh image=mh.imread('image/building05.jpg') #image=image-image.mean() from matplotlib import pyplot as plt import numpy as np image=mh.colors.rgb2gray(im

openCV—Python(10)—— 图像阈值化处理

一.函数简介 1.threshold-图像简单阈值化处理 函数原型:threshold(src, thresh, maxval, type, dst=None) src:图像矩阵 thresh:阈值 maxVal:像素最大值 type:阈值化类型 2.adaptiveThreshold-图像自适应阈值化处理 函数原型:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None) sr

图像阈值化-threshold、adaptivethreshold

在图像处理中阈值化操作,从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体).这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割.opencv的二值化操作函数,如果你是一位经验丰富的专业人员,可以发现阈值化操作有很多小技巧,不只是单单调用二值化操作函数,就完成阈值化操作,往往还是结合形态学处理. 阈值化操作在图像处理中是一种常用的算法,比如图像的二值化就是一种最常见的一种阈值化操作.opencv2和opencv3中提供了直接阈值化操作

OpenCV—图像阈值

1.简单阈值 如同简单阈值的名字一样,这种处理方式也的确比较简单.当像素值高于阈值时,将该像素设为白色或者黑色.OpenCV中使用cv2.threshold()函数来实现.该函数的定义如下: double cv::threshold(InputArray   src, OutputArray   dst, double  thresh, double maxval, int type) 第一个参数是输入的图片,应该是灰度图:第二个图像是输出图像,第三个参数是阈值,第四个参数是当像素低于或者高于阈

python opencv图像阈值处理

######################################################### 学习函数 cv2.threshold, cv2.adaptiveThreshold等等 简单阈值: 原理很直接,如果像素值大于一个阈值,那么久将它赋值一个数,否则赋值成另外一个数.函数使用cv2.threshold 第一参数是原图像,而且这个图像应该是一个灰度图像.第二个参数用来区分像素的阈值.第三个参数是像素值大于阈值时的上限.opencv提供了不同样式的阈值并且由第四个参数决定