OpenCV圖像的二值化


圖像的二值化:

與邊緣檢測相比,輪廓檢測有時能更好的反映圖像的內容。而要對圖像進行輪廓檢測,則必須要先對圖像進行二值化,圖像的二值化就是將圖像上的像素點的灰度值設置為0或255,這樣將使整個圖像呈現出明顯的黑白效果。在數字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數據量大為減少,從而能凸顯出目標的輪廓

下面就介紹OpenCV中對圖像進行二值化的關鍵函數——cvThreshold()。

函數功能:采用Canny方法對圖像進行邊緣檢測
函數原型:
void cvThreshold(
  const CvArr* src,        第一個參數表示輸入圖像,必須為單通道灰度圖。
  CvArr* dst,           第二個參數表示輸出的邊緣圖像,為單通道黑白圖。
  double threshold,     第三個參數表示閾值
  double max_value,     第四個參數表示最大值
  int threshold_type    第五個參數表示運算方法。
);
在OpenCV的imgproc\types_c.h中可以找到運算方法的定義。
enum
{
    CV_THRESH_BINARY      =0,   value = value > threshold ? max_value : 0      
    CV_THRESH_BINARY_INV  =1,   value = value > threshold ? 0 : max_value      
    CV_THRESH_TRUNC       =2,   value = value > threshold ? threshold : value  
    CV_THRESH_TOZERO      =3,   value = value > threshold ? value : 0          
    CV_THRESH_TOZERO_INV  =4,   value = value > threshold ? 0 : value          
    CV_THRESH_MASK        =7,
    CV_THRESH_OTSU        =8   use Otsu algorithm to choose the optimal threshold value;
                               combine the flag with one of the above CV_THRESH_* values
};

 

#include "stdafx.h"
#include "iostream"
using namespace std;
#include "opencv2/opencv.hpp"

IplImage *pGrayImage = NULL;
IplImage *pBinaryImage = NULL;

const char *pImagePath = "E:/C_VC_code/Text_Photo/girl001.jpg";
const char *pGrayWindowsTitle = "原圖";
const char *pBinaryWindowsTitle = "二值圖";
const char *pWindowsToolBarTitle = "閥值";
void onCallBack(int pos)
{
    //change into binary image
    cvThreshold(pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);
    cvShowImage(pBinaryWindowsTitle,pBinaryImage);
}
int main()
{
    //load srcouse image from file
    //IplImage *pImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_UNCHANGED);

    //load gray image from srcouce file image
    //pGrayImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_GRAYSCALE);//直接從原圖獲取灰度圖
    //cvCvtColor(pImage,pGrayImage,CV_BGR2GRAY);

    //間接轉化為灰度圖
    IplImage *pImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_UNCHANGED);
    pGrayImage = cvCreateImage(cvGetSize(pImage), IPL_DEPTH_8U,1);
    cvCvtColor(pImage, pGrayImage, CV_BGR2GRAY);

    pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U,1);

    //create window and show orial image
    cvNamedWindow(pGrayWindowsTitle,CV_WINDOW_AUTOSIZE);
    cvNamedWindow(pBinaryWindowsTitle,CV_WINDOW_AUTOSIZE);

    //creat slide bar
    int pos = 1;
    cvCreateTrackbar(pWindowsToolBarTitle, pBinaryWindowsTitle, &pos, 100,onCallBack);
    onCallBack(0);

    cvShowImage(pGrayWindowsTitle,pGrayImage);
    cvShowImage(pBinaryWindowsTitle,pBinaryImage);

    cvWaitKey(0);
    cvDestroyWindow(pBinaryWindowsTitle);
    cvDestroyWindow(pGrayWindowsTitle);
    cvReleaseImage(&pGrayImage);
    cvReleaseImage(&pBinaryImage);
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM