图像的二值化:

与边缘检测相比,轮廓检测有时能更好的反映图像的内容。而要对图像进行轮廓检测,则必须要先对图像进行二值化,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓

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

函数功能:采用Canny方法对图像进行边缘检测
函数原型:
void cvThreshold(
  const CvArr* src,        第一个参数表示输入图像,必须为单通道灰度图。
  CvArr* dst,           第二个参数表示输出的边缘图像,为单通道黑白图。
  double threshold,     第三个参数表示阈值
  double max_value,     第四个参数表示最大值
  int threshold_type    第五个参数表示运算方法。
);
在OpenCV的imgproc\types_c.h中可以找到运算方法的定义。
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
};

#include "stdafx.h"
#include "iostream"
using namespace std;
#include "opencv2/opencv.hpp" IplImage *pGrayImage = NULL;
IplImage *pBinaryImage = NULL; const char *pImagePath = "E:/C_VC_code/Text_Photo/girl001.jpg";
const char *pGrayWindowsTitle = "原图";
const char *pBinaryWindowsTitle = "二值图";
const char *pWindowsToolBarTitle = "阀值";
void onCallBack(int pos)
{
    //change into binary image
    cvThreshold(pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);
    cvShowImage(pBinaryWindowsTitle,pBinaryImage);
}
int main()
{
    //load srcouse image from file
    //IplImage *pImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_UNCHANGED);     //load gray image from srcouce file image
    //pGrayImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_GRAYSCALE);//直接从原图获取灰度图
    //cvCvtColor(pImage,pGrayImage,CV_BGR2GRAY);     //间接转化为灰度图
    IplImage *pImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_UNCHANGED);
    pGrayImage = cvCreateImage(cvGetSize(pImage), IPL_DEPTH_8U,1);
    cvCvtColor(pImage, pGrayImage, CV_BGR2GRAY);     pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U,1);     //create window and show orial image
    cvNamedWindow(pGrayWindowsTitle,CV_WINDOW_AUTOSIZE);
    cvNamedWindow(pBinaryWindowsTitle,CV_WINDOW_AUTOSIZE);     //creat slide bar
    int pos = 1;
    cvCreateTrackbar(pWindowsToolBarTitle, pBinaryWindowsTitle, &pos, 100,onCallBack);
    onCallBack(0);     cvShowImage(pGrayWindowsTitle,pGrayImage);
    cvShowImage(pBinaryWindowsTitle,pBinaryImage);     cvWaitKey(0);
    cvDestroyWindow(pBinaryWindowsTitle);
    cvDestroyWindow(pGrayWindowsTitle);
    cvReleaseImage(&pGrayImage);
    cvReleaseImage(&pBinaryImage);
    return 0;
}

OpenCV图像的二值化的更多相关文章

  1. OpenCV中对图像进行二值化的关键函数——cvThreshold()。

    函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* src, CvArr* dst, double threshold, doub ...

  2. 实现图像的二值化(java+opencv)

    书里的解释: 其他的没找到什么资料,直接参考百度百科 https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E4%BA%8C%E5%80%BC%E5%8C%9 ...

  3. python实现超大图像的二值化方法

    一,分块处理超大图像的二值化问题   (1) 全局阈值处理  (2) 局部阈值 二,空白区域过滤 三,先缩放进行二值化,然后还原大小 np.mean() 返回数组元素的平均值 np.std() 返回数 ...

  4. Mac中opencv批量对图片进行二值化

    对灰度图像进行二值化,传入的图片是手写汉字的截图,通过二值化把字的部分提出来.用ostu进行二值化 #include <stdio.h> #include <iostream> ...

  5. opencv 对RGB图像直接二值化

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  6. Opencv实现图像的灰度处理,二值化,阀值选择

    前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...

  7. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  8. opencv图像二值化的函数cvThreshold()。 cvAdaptiveThreshol

    OpenCV中对图像进行二值化的关键函数——cvThreshold(). 函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* sr ...

  9. opencv python 图像二值化/简单阈值化/大津阈值法

    pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...

随机推荐

  1. JavaScript 、jQuery动态创建元素的关键字~

    JavaScript动态创建元素: 1.创建元素  如:a 标签 var alink= document.createElement("a"); 2.j添加元素属性 alink.h ...

  2. ASP------<input type="file"/>上传文件

    界面代码(注意:runat="Server"和input file中name一定要有) <html xmlns="http://www.w3.org/1999/xh ...

  3. WinForm------分页控件dll下载地址

    转载: http://files.cnblogs.com/wuhuacong/TestPager_SqlLite.rar

  4. photobooth.js

    HTML5 Webcam for your website, photobooth.js

  5. 9月9日HTML上午表单元素2(框架、样式表)

    五.框架 1.frameset是双标签框架集,如果使用框架集,当前页面不能有body. frameset属性:①cols代表左右拆分.cols=“300,*”表示左边框架宽300,右边宽剩余的宽度.* ...

  6. C++学习之Pair

    C++学习之Pair Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型, ...

  7. join和setdaemon()初探

    join()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程 ...

  8. JavaScript parseInt函数

    首先还是从很热门的实例parseInt("09")==0说起. parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制. 比如说pa ...

  9. 【9-7】XML学习笔记01

    Tips XML标签大小写敏感: XML文件一般使用国际化通用的编码“utf-8”,所以平时看到的XML文件的头部都会有这样的代码: <?xml version="1.0" ...

  10. linux的bash 终端操作快捷键

    bash中的快捷键操作: 分为两大类, 一是移动, 另一个是删除 一. 移动 1. 按字符移动: ctrl+f, ctrl+b 3. 按行移动: ctrl+a, ctrl+e 二. 删除: 1. 按字 ...