图像的二值化就是将图像上的像素点的灰度值设置为0或255
,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
下面我们来介绍两种二值化的方法
1.threshold
首先,我们先来学习一个新函数——threshold(中文翻译为临界值,实际上也就是阈值函数)
函数原型double threshold( InputArray src,OutputArray
dst,double threshold,double maxval,int type );
参数说明
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);
}
结果截图
<http://photo.blog.sina.com.cn/showpic.html#blogid=154bd48ae0102wboc&url=http://album.sina.com.cn/pic/006eSvYWgy6WGyY8SOabe>
<http://photo.blog.sina.com.cn/showpic.html#blogid=154bd48ae0102wboc&url=http://album.sina.com.cn/pic/006eSvYWgy6WGyYc2czb3>
下面我们来介绍第二种方法
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);
}
结果截图
<http://photo.blog.sina.com.cn/showpic.html#blogid=154bd48ae0102wboc&url=http://album.sina.com.cn/pic/006eSvYWgy6WGyY8SOabe>
<http://photo.blog.sina.com.cn/showpic.html#blogid=154bd48ae0102wboc&url=http://album.sina.com.cn/pic/006eSvYWgy6WGz2x2jR0f>
3.其实我们还可以用一种最原始的方法,写一个for循环遍历Mat内的像素值,大于该值的统一为255,小于该值的统一为0,此处不予实现。
热门工具 换一换