【OpenCV(C++)】图像处理:阈值化
阈值化
在对各种图形进行处理操作的过程中,我们常常需要对图像中的像素做出取舍决策,直接剔除一些低于或高于一定值的像素。
阈值可以被视作最简单的图像分割方法。从一幅图像中利用阈值分割出我们需要的物体部分的方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。为了从一幅图像中提取出我们需要的部分,应该用图像中的每一个像素点的灰度值与选取的阈值进行比较,并作出相应判断。一旦找到了需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。
固定阈值操作:Threshold()函数
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type) ;
自适应阈值操作:adaptiveThreshold()函数
void adaptiveThreshold(InputArray src, OutputArraay dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C) ;
基本阈值操作程序
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "【程序窗口】"
int g_nThresholdValue = 100;
int g_nThresholdType = 3;
Mat g_srcImage, g_grayImage, g_dstImage;
static void ShowHelpText();
void on_Threshold(int, void*);
int main()
{
system("color 1F");
ShowHelpText();
g_srcImage = imread("fg.jpg");
if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }
imshow("原始图", g_srcImage);
cvtColor(g_srcImage, g_grayImage, CV_RGB2GRAY);
namedWindow(WINDOW_NAME, CV_WINDOW_AUTOSIZE);
createTrackbar("模式",
WINDOW_NAME, &g_nThresholdType,
4, on_Threshold);
createTrackbar("参数值",
WINDOW_NAME, &g_nThresholdValue,
255, on_Threshold);
on_Threshold(0, 0);
while (1)
{
int key;
key = waitKey(20);
if ((char)key == 27) { break; }
}
}
void on_Threshold(int, void*)
{
threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);
imshow(WINDOW_NAME, g_dstImage);
}
static void ShowHelpText()
{
printf("\n\n ----------------------------------------------------------------------------\n");
printf("\n\t按键操作说明: \n\n"
"\t\t键盘按键【ESC】- 退出程序\n"
"\t\t滚动条模式0- 二进制阈值\n"
"\t\t滚动条模式1- 反二进制阈值\n"
"\t\t滚动条模式2- 截断阈值\n"
"\t\t滚动条模式3- 反阈值化为0\n"
"\t\t滚动条模式4- 阈值化为0\n");
}
运行效果如下: