天天看点

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实现将彩色图像转换为灰度图,然后将其二值化。