天天看點

OpenCV實作彩色圖像轉換為灰階圖及二值化處理 OpenCV實作彩色圖像轉換為灰階圖及二值化處理

OpenCV實作彩色圖像轉換為灰階圖及二值化處理

C++代碼

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

// lab_1.cpp : 定義控制台應用程式的入口點。

//

#include "stdafx.h"

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

#include <iostream>

using

namespace

std;

//聲明圖像IplImage指針

IplImage* pSrcImg=NULL;

IplImage* pGrayImg=NULL;

IplImage* pBinaryImg=NULL;

int

Thresh=127;

//初始化滑動條位置

//滑動條響應函數

void

onTrackerSlid(

int

thresh)

{

//将圖像轉化為二值圖

pBinaryImg=cvCreateImage(cvGetSize(pSrcImg),pSrcImg->depth,pSrcImg->nChannels);

cvCopy(pSrcImg,pBinaryImg);

//複制圖像資料

CvScalar scalar;

int

avg;

for

(

int

i=0;i<pBinaryImg->height;i++)

{

for

(

int

j=0;j<pBinaryImg->width;j++)

{

scalar=cvGet2D(pBinaryImg,i,j);

//擷取點(i,j)的像素

avg=(scalar.val[0]+scalar.val[1]+scalar.val[2])/3;

if

(avg<thresh)

//與門檻值比較

{

scalar.val[0]=scalar.val[1]=scalar.val[2]=0;

cvSet2D(pBinaryImg,i,j,scalar);

}

else

{

scalar.val[0]=scalar.val[1]=scalar.val[2]=255;

cvSet2D(pBinaryImg,i,j,scalar);

}

}

}

//顯示圖像

cvShowImage(

"二值化圖像"

,pBinaryImg);

}

int

main(

int

argc,

char

** argv)

{

if

(argc!=2)

argv[1]=

"lena.jpg"

;

//載入圖像

if

((pSrcImg=cvLoadImage(argv[1],1))!=0)

{

cout<<

"按Esc鍵退出..."

<<endl;

//将顔色空間由RGB轉化為Gray

pGrayImg=cvCreateImage(cvGetSize(pSrcImg),8,1);

cvCvtColor(pSrcImg,pGrayImg,CV_RGB2GRAY);

//建立圖像視窗

cvNamedWindow(

"原圖像"

,CV_WINDOW_AUTOSIZE);

cvNamedWindow(

"灰階圖像"

,CV_WINDOW_AUTOSIZE);  

cvNamedWindow(

"二值化圖像"

,CV_WINDOW_AUTOSIZE);

//添加滑動條來調節門檻值

cvCreateTrackbar(

"門檻值"

,

"二值化圖像"

,&Thresh,255,onTrackerSlid);

onTrackerSlid(Thresh);

//顯示圖像

cvShowImage(

"原圖像"

,pSrcImg);

cvShowImage(

"灰階圖像"

,pGrayImg);

//儲存圖像

cvSaveImage(

"Gray_Image.jpg"

,pGrayImg);

cvSaveImage(

"Binary_Image.jpg"

,pBinaryImg);

//等待按"Esc"鍵退出

while

(

true

)

if

(cvWaitKey(100)==27)

break

;

//銷毀視窗

cvDestroyWindow(

"原圖像"

);

cvDestroyWindow(

"灰階圖像"

);

cvDestroyWindow(

"二值化圖像"

);

//釋放圖像

cvReleaseImage(&pSrcImg);

cvReleaseImage(&pGrayImg);

cvReleaseImage(&pBinaryImg);

return

0;

}

return

-1;

}

描述:OpenCV+VS2010實作将彩色圖像轉換為灰階圖,然後将其二值化。