OpenCV基本閾值操作

2021-02-06 15:03 更新

目標

在本教程中,您將學習如何:

Cool Theory

注意
下面的解釋屬于Bradski和Kaehler 的“ 學習OpenCV ”一書。什么是

閾值?

  • 最簡單的分割方法
  • 應用示例:分離對應于我們想要分析的對象的圖像的區(qū)域。該分離基于對象像素和背景像素之間的強度變化。
  • 為了區(qū)分我們感興趣的像素(其最終將被拒絕),我們對每個像素強度值相對于閾值進行比較(根據(jù)要解決的問題確定)。
  • 一旦我們正確分離了重要的像素,我們可以用一個確定的值來設置它們來識別它們(即我們可以為它們分配值(黑色),(白色)或適合您需要的任何值)。0255

OpenCV基本閾值操作


閾值類型

  • OpenCV提供函數(shù)cv :: threshold來執(zhí)行閾值操作。
  • 我們可以使用此功能實現(xiàn)種類型的閾值操作。我們將在以下小節(jié)中解釋。5
  • 為了說明這些閾值過程的工作原理,我們假設我們有一個具有強度值為像素的源圖像。下面的情節(jié)描繪了這一點。藍色水平線表示閾值(固定)。src(x,y)thresh
OpenCV基本閾值操作

閾值二進制

  • 該閾值操作可以表示為:d
OpenCV基本閾值操作
  • 因此,如果像素的強度s r c (x ,y)高于 thresh,則將新的像素強度設置為MaxVal。否則,像素被設置為0.
OpenCV基本閾值操作

閾值二進制,倒數(shù)

  • 該閾值操作可以表示為:

OpenCV基本閾值操作

  • 因此,如果像素的強度s r c (x ,y)高于 thresh,則將新的像素強度設置為0。否則,像素被設置為MaxVal.

截短

  • 該閾值操作可以表示為:
OpenCV基本閾值操作

  • 像素的最大強度值是thresh,如果src(x,y)較大,則其值被截斷。見下圖:
OpenCV基本閾值操作

閾值為零

  • 此操作可以表示為:
OpenCV基本閾值操作
  • 如果src(x,y)低于 thresh,則新像素值將被設置為0。
OpenCV基本閾值操作

閾值為零,倒置

  • 此操作可以表示為:
OpenCV基本閾值操作

  • 如果src(x,y)大于thresh,則新像素值將被設置為0。
OpenCV基本閾值操作

Code

教程代碼如下所示。您也可以從這里下載

#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
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 argc, char** argv )
{
  String imageName("../data/stuff.jpg"); // by default
  if (argc > 1)
  {
      imageName = argv[1];
  }
  src = imread( imageName, IMREAD_COLOR ); // Load an image
  if( src.empty() )
    { return -1; }
  cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to Gray
  namedWindow( window_name, WINDOW_AUTOSIZE ); // Create a window to display results
  createTrackbar( trackbar_type,
                  window_name, &threshold_type,
                  max_type, Threshold_Demo ); // Create Trackbar to choose type of Threshold
  createTrackbar( trackbar_value,
                  window_name, &threshold_value,
                  max_value, Threshold_Demo ); // Create Trackbar to choose Threshold value
  Threshold_Demo( 0, 0 ); // Call the function to initialize
  for(;;)
    {
      char c = (char)waitKey( 20 );
      if( 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 );
}

說明

  1. 我們來看一下程序的一般結構:
  • 加載圖像。如果是BGR,我們將其轉換為灰度。為此,請記住我們可以使用函數(shù)cv :: cvtColor
  String imageName("../data/stuff.jpg"); // by default
  if (argc > 1)
  {
      imageName = argv[1];
  }
  src = imread( imageName, IMREAD_COLOR ); // Load an image
  if( src.empty() )
    { return -1; }
  cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to Gray
  • 創(chuàng)建一個窗口來顯示結果
  namedWindow( window_name, WINDOW_AUTOSIZE ); // Create a window to display results
  • 創(chuàng)建軌道欄供用戶輸入用戶輸入:2
    • 閾值類型:二進制,零等
    • 閾值
  createTrackbar( trackbar_type,
                  window_name, &threshold_type,
                  max_type, Threshold_Demo ); // Create Trackbar to choose type of Threshold
  createTrackbar( trackbar_value,
                  window_name, &threshold_value,
                  max_value, Threshold_Demo ); // Create Trackbar to choose Threshold value
  • 等待用戶輸入閾值,閾值類型(或直到程序退出)
  • 每當用戶更改任何Trackbars的值時,將調(diào)用Threshold_Demo函數(shù):
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 );
}

正如你所看到的,函數(shù)cv :: threshold被調(diào)用。我們給出五個參數(shù):

  1. src_gray:我們的輸入圖像
  2. dst:目的地(輸出)圖像
  3. threshold_value:進行閾值操作時閾值的大小。
  4. max_BINARY_value:與二進制閾值操作(用于設置所選像素)一起使用的值
  5. threshold_type:閾值操作之一。它們列在上述功能的注釋部分。

結果

  • 編譯此程序后,運行它給一個圖像的路徑作為參數(shù)。例如,對于輸入圖像為:

OpenCV基本閾值操作


  • 首先,我們嘗試用二進制threhold反轉閾值我們的圖像。我們預計,比亮起的像素將變暗,這是實際發(fā)生的,正如我們在下面的快照中看到的(從原始圖像注意到,小狗的舌頭和眼睛與圖像相比特別明亮,這個反映在輸出圖像中)。噸? ? ? 小號?

OpenCV基本閾值操作

  • 現(xiàn)在我們嘗試將閾值設為零。這樣,我們預期最暗像素(閾值以下)將變?yōu)橥耆谏?,而值大于閾值的像素將保持其原始值。這通過輸出圖像的以下快照來驗證:

OpenCV基本閾值操作


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號