【OpenCV入门指南】第四篇 图像的二值化

原创 2012年12月05日 10:12:32

【OpenCV入门指南】第四篇 图像的二值化

   在上一篇《【OpenCV入门指南】第三篇Canny边缘检测》中介绍了使用Canny算子对图像进行边缘检测。与边缘检测相比,轮廓检测有时能更好的反映图像的内容。而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764

一. 关键函数介绍

下面就介绍OpenCV中对图像进行二值化的关键函数——cvThreshold()

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvThreshold(

  const CvArr* src,

  CvArr* dst,

  double threshold,

  double max_value,

  int threshold_type

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值

第四个参数表示最大值。

第五个参数表示运算方法。

OpenCVimgproc\types_c.h中可以找到运算方法的定义。

/* Threshold types */

enum

{

    CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */

    CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */

    CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */

    CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */

    CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */

    CV_THRESH_MASK        =7,

    CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */

};

注释已经写的很清楚了,因此不再用中文来表达了。

 

二. 示例程序代码

下面给出对图像进行二值化的完整的源代码:

//图像的二值化
//By MoreWindows (http://blog.csdn.net/MoreWindows)
#include <opencv2/opencv.hpp>
using namespace std;

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

IplImage *g_pGrayImage = NULL;
IplImage *g_pBinaryImage = NULL;
const char *pstrWindowsBinaryTitle = "二值图(http://blog.csdn.net/MoreWindows)";

void on_trackbar(int pos)
{
	// 转为二值图
	cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
	// 显示二值图
	cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);
}

int main( int argc, char** argv )
{	
	const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";
	const char *pstrWindowsToolBarName = "二值图阈值";

	// 从文件中加载原图
	IplImage *pSrcImage = cvLoadImage("002.jpg", CV_LOAD_IMAGE_UNCHANGED);

	// 转为灰度图
	g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
	cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);

	// 创建二值图
	g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);

	// 显示原图
	cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
	cvShowImage(pstrWindowsSrcTitle, pSrcImage);
	// 创建二值图窗口
	cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);

	// 滑动条	
	int nThreshold = 0;
	cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);

	on_trackbar(1);

	cvWaitKey(0);

	cvDestroyWindow(pstrWindowsSrcTitle);
	cvDestroyWindow(pstrWindowsBinaryTitle);
	cvReleaseImage(&pSrcImage);
	cvReleaseImage(&g_pGrayImage);
	cvReleaseImage(&g_pBinaryImage);
	return 0;
}

运行结果如下所示,读者可以到下载源文件和程序(Release版本,不用安装OpenCV也能使用),自己动手调试下阈值大小,看看生成的二值图有什么变化。

 

OpenCV还有个cvAdaptiveThreshold()函数,这个函数会使用Otsu算法(大律法或最大类间方差法)(注1)来计算出一个全局阈值,然后根据这个阈值进行二值化。当然直接使用上一篇《OpenCV入门指南】第三篇Canny边缘检测》中的cvCanny()函数也可以对图像进行二值化(想到怎么传参数了吗?)。

 

好了,图像的二值化就介绍到这里了,欢迎继续浏览下面二篇《OpenCV入门指南】第五篇轮廓检测上》和《OpenCV入门指南】第六篇轮廓检测下》,谢谢。

 

  

 

1.调用cvThreshold()时传入参数CV_THRESH_OTSU也是使用Otsu算法来自动生成一个阈值。


 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8239678

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764

版权声明:本文为博主原创文章,未经博主允许不得转载。

【OpenCV图像处理】二、图像的二值化操作

图像的逻辑运算就是将两幅图像的对应像素进行逻辑运算。逻辑运算主要包括 与(AND)或(OR)及补运算。要对灰度图像进行逻辑运算,就要首先对图像进行二值化处理。 二值化的公式如下: 我们对灰度图像进...

OpenCV二值化方法

网名:无名   QQ:16349023 email:mengwzy@qq.com 以前很少写教程,写的可能有点乱希望大对家有帮助 threshold 方法是通过遍历灰度图中点,将图像信息二...

OpenCV二值化方法

cvThreshold是opencv库中的一个函数   作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cv...
  • lbd2008
  • lbd2008
  • 2011年11月10日 08:05
  • 28211

OpenCV【3】---二值化图像

本文主要讲解实现自定义的二值化功能以及讲解OpenCV中的二值化函数adaptiveThreshold和threshold来达到同样的目的,当然还有其他的二值化函数也可以达到同样的目的。1 OpenC...
  • FreeApe
  • FreeApe
  • 2015年12月26日 20:00
  • 3557

Opencv2教程一:图像变换之阈值二值threshold

网名:无名   QQ:16349023 email:mengwzy@qq.com 以前很少写教程,写的可能有点乱希望大对家有帮助 threshold 方法是通过遍历灰度图中点,将图像信息二值化,处理过...
  • nnsword
  • nnsword
  • 2014年06月18日 12:00
  • 14938

利用python opencv实现图像自适应二值化

【译者的话】最近在做一些图像处理方面的工作,发现对手机拍照的照片进行预处理确实有很多问题,首当其冲的就是实现不同光照条件下自适应的二值化处理,正好找到了这样一篇文章讲到了较为简单的方法,翻译出来给大家...
  • deerlux
  • deerlux
  • 2015年09月15日 22:41
  • 5804

【opencv学习笔记】3、opencv图像二值化

#include #include using namespace std; //定义灰度图像变量 IplImage *g_GrayImage = NULL; //定义二值化图片变量 IplIm...
  • tanzui
  • tanzui
  • 2016年12月26日 18:03
  • 707

OpenCV图片二值化

图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越 精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满 ...
  • R10_723
  • R10_723
  • 2014年06月15日 15:14
  • 1213

opencv简单的彩色图像灰度化和二值化(学习笔记)

图像的灰度化即是将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*...

OpenCV二值化函数Threshold

OpenCV二值化函数Threshold【转】 研究下对图像二值化的理解 Threshold 对数组元素进行固定阈值操作 void cvThreshold( const CvArr* s...
  • xuehuic
  • xuehuic
  • 2012年03月27日 23:48
  • 35338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV入门指南】第四篇 图像的二值化
举报原因:
原因补充:

(最多只允许输入30个字)