天天看點

二值化區分前景和背景

場景

    單純使用二值化函數處理圖像,嘗試擷取前景的物體,存在如下的限制條件

1 前景和背景顔色有着鮮明的差別,可以通過二值化函數的閥值來調整

環境

    目前在進行車輛的邊緣檢測的過程中,道路和車輛連在一起,灰階化之後,進行二值化圖像,其實如果能夠擷取道路的原始圖檔,進行差分,應該是能夠非常輕松的提取車輛的輪廓的,不管如何進行閥值的調整,是以嘗試使用Candy算子進行邊緣的檢測

代碼

//圖像的二值化

//By MoreWindows (http://blog.csdn.net/MoreWindows)

#include <opencv2/opencv.hpp>

using namespace std;

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

IplImage *g_pGrayImage = NULL;

IplImage *g_pBinaryImage = NULL;

const char *pstrWindowsBinaryTitle = "二值圖";

void on_trackbar(int pos)

{

  // 轉為二值圖

  cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);

  // 顯示二值圖

  cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);

}

int main( int argc, char** argv )

  const char *pstrWindowsSrcTitle = "原圖";

  const char *pstrWindowsToolBarName = "二值圖門檻值";

  // 從檔案中加載原圖

  IplImage *pSrcImage = cvLoadImage("D:/20170601092226.png", CV_LOAD_IMAGE_UNCHANGED);

  // 轉為灰階圖

  g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);

  cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);

  // 建立二值圖

  g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);

  // 顯示原圖

  cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);

  cvShowImage(pstrWindowsSrcTitle, pSrcImage);

  // 建立二值圖視窗

  cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);

  // 滑動條

  int nThreshold = 0;

  cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);

  on_trackbar(1);

  cvWaitKey(0);

  cvDestroyWindow(pstrWindowsSrcTitle);

  cvDestroyWindow(pstrWindowsBinaryTitle);

  cvReleaseImage(&pSrcImage);

  cvReleaseImage(&g_pGrayImage);

  cvReleaseImage(&g_pBinaryImage);

  return 0;

參考

http://blog.csdn.net/morewindows/article/details/8239678

    本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1738474,如需轉載請自行聯系原作者