Opencv图像处理---二值化操作

理论

什么是阈值?

  • 最简单的分割方法
  • 应用示例:分离与我们要分析的对象相对应的图像区域。 该分离基于对象像素和背景像素之间的强度变化。
  • 为了区分我们感兴趣的像素,我们执行每个像素强度值相对于阈值的比较(根据要解决的问题确定)。
  • 一旦我们正确地分离了重要像素,我们就可以设置它们以确定它们(即我们可以为它们分配0(黑色),255(白色)或任何适合您需要的值)。

Opencv图像处理---二值化操作_第1张图片

阈值的类型

  • OpenCV提供函数cv :: threshold来执行阈值操作。
  • 我们可以用这个函数实现5种类型的阈值操作。

二值化阈值

该阈值操作可表示为:

因此,如果像素src(x,y)的强度高于阈值,则将新像素强度设置为MaxVal。 否则,像素设置为0。

Opencv图像处理---二值化操作_第2张图片

反二值化阈值

该阈值操作可表示为:

如果像素src(x,y)的强度高于阈值,则将新像素强度设置为0.否则,将其设置为MaxVal。

Opencv图像处理---二值化操作_第3张图片

截断阈值

该阈值操作可表示为:

如果像素src(x,y)的强度高于阈值,则将新像素强度设置为0.否则,将其设置为MaxVal。

Opencv图像处理---二值化操作_第4张图片

归0阈值

该阈值操作可表示为:

如果src(x,y)低于thresh,则新像素值将设置为0。

Opencv图像处理---二值化操作_第5张图片

反归0阈值

该阈值操作可表示为:

如果src(x,y)大于thresh,则新像素值将设置为0。

Opencv图像处理---二值化操作_第6张图片

代码

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include 
#include 
using namespace cv;
int threshold_value = 0;
int threshold_type = 3;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;
Mat src, src_gray, dst;
const char* window_name = "Threshold Demo";
const char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted";
const char* trackbar_value = "Value";
void Threshold_Demo( int, void* );
int main( int, char** argv )
{
  src = imread( argv[1], 1 );
  cvtColor( src, src_gray, COLOR_RGB2GRAY );
  namedWindow( window_name, WINDOW_AUTOSIZE );
  createTrackbar( trackbar_type,
                  window_name, &threshold_type,
                  max_type, Threshold_Demo );
  createTrackbar( trackbar_value,
                  window_name, &threshold_value,
                  max_value, Threshold_Demo );
  Threshold_Demo( 0, 0 );
  for(;;)
    {
      int c;
      c = waitKey( 20 );
      if( (char)c == 27 )
    { break; }
    }
}
void Threshold_Demo( int, void* )
{
  /* 0: Binary
     1: Binary Inverted
     2: Threshold Truncated
     3: Threshold to Zero
     4: Threshold to Zero Inverted
   */
  threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
  imshow( window_name, dst );
}

解释

  • 加载图像。 如果是BGR,我们将其转换为灰度。 为此,请记住我们可以使用函数cv :: cvtColor:
  • 创建一个窗口以显示结果
  • 为用户创建2个轨道栏以输入用户输入:Opencv图像处理---二值化操作_第7张图片
  • 等到用户输入阈值,阈值类型(或直到程序退出)
  • 每当用户更改任何Trackbars的值时,都会调用Threshold_Demo函数:Opencv图像处理---二值化操作_第8张图片
  1. src_gray:我们的输入图片
  2. dst:目标(输出)图像
  3. threshold_value:进行阈值操作的阈值
  4. max_BINARY_value:二进制阈值操作使用的值(设置所选像素)
  5. threshold_type:5个阈值操作之一。

效果

Opencv图像处理---二值化操作_第9张图片Opencv图像处理---二值化操作_第10张图片

你可能感兴趣的:(OpenCV教程)