閾值操作類型

http://blog.csdn.net/xiahouzuoxin/article/details/41047325

這5種閾值操作類型保留opencv tutorials中的英文名稱,依次為:

  1. Threshold Binary:即二值化,將大於閾值的灰度值設為最大灰度值,小於閾值的值設為0。
  2. Threshold Binary, Inverted:將大於閾值的灰度值設為0,大於閾值的值設為最大灰度值。
  3. Truncate:將大於閾值的灰度值設為閾值,小於閾值的值保持不變。
  4. Threshold to Zero:將小於閾值的灰度值設為0,大於閾值的值保持不變。
  5. Threshold to Zero, Inverted:將大於閾值的灰度值設為0,小於閾值的值保持不變。

OpenCV提供了threshold函數專門用於閾值操作,其實實現起來很簡單,為什麼非得調用函數呢?一是熟悉了調用函數很方便,如果一行代碼能搞定的事為什麼非得用幾個循環呢?二是對於新手,自己實現未必敢保證運行效率上未必能達到opencv那樣好。

程序分析

<pre name="code" class="cpp">/*
 * FileName : filter_and_threshold.cpp
 * Author   : xiahouzuoxin @163.com
 * Version  : v1.0
 * Date     : Sat 20 Sep 2014 07:04:29 PM CST
 * Brief    : 
 * 
 * Copyright (C) MICL,USTB
 */
#include "cv.h"
#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

Mat src,gray,dst;

const char *wn = "Demo";
int th_val = 0;
int th_type = 3;
int const max_val = 255;
int const max_type = 4;
int const max_BINARY_val = 255;

static void Thresh(int, void *)
{
    /*
     * 0: Binary
     * 1: Binary Inverted
     * 2: Threshold Truncated
     * 3: Threshold to Zero
     * 4: Threshold to Zero Inverted
     */
    
    threshold(gray, dst, th_val, max_BINARY_val, th_type);

    imshow(wn, dst);
}

/*
 * @brief   
 * @inputs  
 * @outputs 
 * @retval  
 */
int main(int argc, char *argv[])
{
    if (argc < 2) {
        cout<<"Usage: ./threshold [file name]"<<endl;
        return -1;
    }

    // read image as GRAYSCALE
    src = imread(argv[1], CV_LOAD_IMAGE_COLOR);
    if (!src.data) {
        cout<<"Error: read data"<<endl;
        return -1;
    }

    // window to display
    namedWindow(wn);
    createTrackbar("Value", wn, &th_val, max_val, Thresh);  /* bar */
    createTrackbar("Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted", 
            wn, &th_type, max_type, Thresh);

    cvtColor(src, gray, CV_RGB2GRAY);

    // Init by Calling Thresh
    Thresh(0, 0);

    // wait if ESC be pressed
    while(1)
    {
        char c = waitKey(20);

        if(c == 27)         /* ESC */
        {
            break;
        }
    }
}


 
  1. 整個程序就一句話是關鍵:

    <pre name="code" class="cpp"><span style="color: rgb(51, 51, 51); font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; text-align: left; white-space: pre-wrap; background-color: rgb(248, 248, 255); ">threshold(gray, dst, th_val, max_BINARY_val, th_type);</span>
    
     

    threshold的參數依次是原灰度圖、輸出閾值操作後的圖、閾值、最大灰度值以及閾值類型。其中,最大灰度值並不一定就是255,在上面提到的閾值操作1和2中提到,「設為最大灰度值」,如果你覺得不像讓圖像的最大灰度值大於200,那就設為200就好了。閾值類型取值為0~4,按順序依次對應前面提到的5種閾值操作類型。

  2. createTrackbar是創建滑動條的gui函數。以createTrackbar("Value", wn, &th_val, max_val, Thresh);為例,該滑動條值與變量th_val的值關聯,一旦th_val改變,自動調用回調函數Thresh,createTrackbar使用的回調函數格式必需是程序中的void Thresh(int, void *),即返回void,參數含intvoid *類型。

效果

原图-林依晨 结果-使用阈值操作2

林依晨的的圖片被我P一下就成那樣了!上面的第二幅圖片使用的是閾值操作2。

原图-未知美女一枚 结果-使用阈值操作3

這回是未知美女一枚,使用閾值操作方法3後的結果如右圖,感覺沒什麼差別,有木有?確實差別不大,誰叫人家頭發本來就那麼黑那麼靚麗呢!細看還是能看出來眉毛變細了,發絲變黑了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值