图像二值化
二值图像顾名思义图像中只有两种颜色的信息,通常是黑色和白色。是将普通图像二值化后得到的图像
图像二值化的作用是为了方便提取图像中的信息
。二值图像在进行计算机识别时可以增加识别效率
。
固定阈二值化
threshold()
double cv::threshold(InputArray src,
OutputArray dst,
double thresh,
double maxVal,
int type)
- 待二值化图像:图像只能是
CV_8U
和CV_32F
两种数据类型。对于图像通道数目的要求与选择的二值化方法相关。 - dst:二值化后的图像,与输入图像具有相同的尺寸、数据类型和通道数。
- thresh:二值化的阈值
- maxval:二值化过程中的最大值,它只在
THRESH_BINARY
和THRESH_BINARY_INV
两种二值化方法中才使用。 - type:图像二值化方法的标志。
自适应阈二值化
adaptiveThreshold
void cv::adaptiveThreshold(InputArray src,
OutputArray dst,
double maxValue,
int adaptivMethod,
int blockSize,
double C)
- src:待二值化图像
- dst:二值化后的图像
- maxValue:二值化最大值
- adaptivMethod:自适应确定阈值的方法
- 均值法
ADAPTIVE_THERESH_MEAN_c
- 高斯法
ADAPTIVE_THERESH_GAUSSIAN_C
- 均值法
- thresholdType:选择图像二值化方法的标志,
只能是THRESH_BINARY和THRESH_BINARY_INV
- blockSize:自适应确定阈值的相邻像素邻域大小,一般为3,5,7的奇数
- C:从平均值或加权平均值中减去的常数,可以为正,也可以为负。
代码展示
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lena.png");
if (img.empty())
{
cout << "input picture wrong!" << endl;
return -1;
}
Mat gray;
cvtColor(img, gray, COLOR_RGB2GRAY);
Mat img_B, img_B_V, gray_B, gray_B_V, gray_T, gray_T_V, gray_TRUNC;
// 彩色图像二值化
threshold(img, img_B, 125, 255, THRESH_BINARY);
threshold(img, img_B_V, 125, 255, THRESH_BINARY_INV);
imshow("img_B", img_B);
imshow("img_B_V", img_B_V);
// 灰度图BINARY二值化
threshold(gray, gray_B, 125, 255, THRESH_BINARY);
threshold(gray, gray_B_V, 125, 255, THRESH_BINARY_INV);
imshow("gray_B", gray_B);
imshow("gray_B_V", gray_B_V);
// 灰度图TOZERO变换
threshold(gray, gray_T, 125, 255, THRESH_TOZERO);
threshold(gray, gray_T_V, 125, 255, THRESH_TOZERO_INV);
imshow("gray_T", gray_T);
imshow("gray_T_V", gray_T_V);
// 灰度图像TRUNC变换
threshold(gray, gray_TRUNC, 125, 255, THRESH_TRUNC);
imshow("gray_TRUNC", gray_TRUNC);
// 灰度图像大津法和三角形法变换
Mat img_Thr = imread("threshold.png", IMREAD_GRAYSCALE);
Mat img_Thr_O, img_Thr_T;
threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU);
threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE);
imshow("img_Thr", img_Thr);
imshow("img_Thr_O", img_Thr_O);
imshow("img_Thr_T", img_Thr_T);
// 灰度图像自适应二值化
Mat adaptive_mean, adaptive_gauss;
adaptiveThreshold(img_Thr, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C,
THRESH_BINARY, 55, 0);
adaptiveThreshold(img_Thr, adaptive_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C,
THRESH_BINARY, 55, 0);
imshow("adaptive_man:", adaptive_mean);
imshow("adaptive_gauss", adaptive_gauss);
waitKey(0);
return 0;
}