openCV中二值化图像的方法



图像的二值化就是将图像上的像素点的灰度值设置为0255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

   下面我们来介绍两种二值化的方法

   1.threshold

首先,我们先来学习一个新函数——threshold(中文翻译为临界值,实际上也就是阈值函数

函数原型double threshold( InputArray src,OutputArray dst,double threshold,double maxval,intype );

参数说明

src:原始数组,可以是Mat类型

dst:输出数组,必须与 src 的类型一致。

threshold:阈值

maxval:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

type:阈值类型

type=CV_THRESH_BINARY:如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;

type=CV_THRESH_BINARY_INV:如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.

type=CV_THRESH_TRUNC:如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y).

type=CV_THRESH_TOZERO:如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0。

type=CV_THRESH_TOZERO_INV:如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y).

 

代码实例

#include"stdafx.h"

#include "opencv2/imgproc/imgproc.hpp"  

#include "opencv2/highgui/highgui.hpp"  

#include    

using namespace cv;

using namespace std;

void main()

{

//定义变量

Mat img;

Mat result;

//载入图片  

img = imread("E:\\6.jpg",0);

// 转为二值图  

threshold(img, result, 170, 255, CV_THRESH_BINARY);

//显示原图  

namedWindow("Image");

imshow("Image", img);

// 显示二值图 

namedWindow("二值化后的图像1");

imshow("二值化后的图像1",result);

waitKey(0);

}

结果截图

Opencv学习笔记(九)图像的二值化以及轮廓检测

Opencv学习笔记(九)图像的二值化以及轮廓检测
 

下面我们来介绍第二种方法

 

2.第二种方法我们没有用特定的函数,而是用一个简单的语句实现

threshval < 100 ? (img < 160) : (img > 160)

这个语句的意思是,如果阈值小于100,那么中间为真,即像素值小于160的为1,大于160的为0;如果阈值大于100,那么右边为真,即像素值大于160的为1,小于160的为0.

 

代码实例

 

#include"stdafx.h"

#include "opencv2/imgproc/imgproc.hpp"  

#include "opencv2/highgui/highgui.hpp"  

#include    

using namespace cv;

using namespace std;

 

void main()

{

//定义变量

Mat img;

int threshval =170;//设定阈值

Mat result;

    Mat bw = img;

//载入图片  

img = imread("E:\\6.jpg",0);

//显示原图  

namedWindow("Image");

imshow("Image", img);

    bw = threshval < 100 ? (img < 160) : (img > 160);//二值化

    namedWindow("二值化后的图像2");

imshow("二值化后的图像2", bw);

waitKey(0);

}

 

结果截图

Opencv学习笔记(九)图像的二值化以及轮廓检测

Opencv学习笔记(九)图像的二值化以及轮廓检测

 

3.其实我们还可以用一种最原始的方法,写一个for循环遍历Mat内的像素值,大于该值的统一为255,小于该值的统一为0,此处不予实现。

 

猜你喜欢

转载自blog.csdn.net/qq_40969467/article/details/80351472