OpenCV基本閾值操作

2021-02-06 15:03 更新

目標(biāo)

在本教程中,您將學(xué)習(xí)如何:

Cool Theory

注意
下面的解釋屬于Bradski和Kaehler 的“ 學(xué)習(xí)OpenCV ”一書(shū)。什么是

閾值?

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

OpenCV基本閾值操作


閾值類(lèi)型

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

閾值二進(jìn)制

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

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

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

OpenCV基本閾值操作

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

截短

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

  • 像素的最大強(qiáng)度值是thresh,如果src(x,y)較大,則其值被截?cái)?/em>。見(jiàn)下圖:
OpenCV基本閾值操作

閾值為零

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

閾值為零,倒置

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

  • 如果src(x,y)大于thresh,則新像素值將被設(shè)置為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 );
}

說(shuō)明

  1. 我們來(lái)看一下程序的一般結(jié)構(gòu):
  • 加載圖像。如果是BGR,我們將其轉(zhuǎn)換為灰度。為此,請(qǐng)記住我們可以使用函數(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)建一個(gè)窗口來(lái)顯示結(jié)果
  namedWindow( window_name, WINDOW_AUTOSIZE ); // Create a window to display results
  • 創(chuàng)建軌道欄供用戶(hù)輸入用戶(hù)輸入:2
    • 閾值類(lèi)型:二進(jìn)制,零等
    • 閾值
  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
  • 等待用戶(hù)輸入閾值,閾值類(lèi)型(或直到程序退出)
  • 每當(dāng)用戶(hù)更改任何Trackbars的值時(shí),將調(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)用。我們給出五個(gè)參數(shù):

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

結(jié)果

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

OpenCV基本閾值操作


  • 首先,我們嘗試用二進(jìn)制threhold反轉(zhuǎn)閾值我們的圖像。我們預(yù)計(jì),比亮起的像素將變暗,這是實(shí)際發(fā)生的,正如我們?cè)谙旅娴目煺罩锌吹降模◤脑紙D像注意到,小狗的舌頭和眼睛與圖像相比特別明亮,這個(gè)反映在輸出圖像中)。噸? ? ? 小號(hào)?

OpenCV基本閾值操作

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

OpenCV基本閾值操作


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)