您的位置:首页 > 运维架构

opencv学习——彩色图转 灰度图和二值化

2012-12-17 17:03 211 查看
学习opencv当然从最简单的彩色图转灰度图以及二值化开始。在这里,我们需要注意的一个地方是在对灰度图进行二值化处理(阈值用滚动条)。

首先我们完成第一部分:读取一张彩色图片,转换成灰度图并保存

代码如下,还是比较容易懂得

// test.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include "Windows.h"
#include <iostream>
#include "cv.h"//opencv的库,同下
#include "highgui.h"
using namespace std;

int main(int argc, char* argv[])
{
IplImage *image;//初始化保存彩色图
IplImage  *result;//初始化保存灰度图

image=cvLoadImage("D:\\test.jpg",-1);//从本地读取彩色图
//注意指针变量一定要先初始化才能使用,否则崩溃
//灰度转换时通道一定要设置正确
int channel=1;//image->nChannels;
int depth=image->depth;
CvSize sz;
sz.width=image->width;//宽度
sz.height=image->height;//高度

result=cvCreateImage(sz,depth,channel);//生成image
cvCvtColor(image,result,CV_BGR2GRAY);//转换成灰度图
cvNamedWindow("original",1);//窗口名称
cvShowImage("original",image);//显示彩色图
cvNamedWindow("gray",1);
cvShowImage("gray",result);//显示转换后的灰度图
cvSaveImage("D:\\saveImage.jpg",result);//将灰度图保存到本地
cvWaitKey(0);
cvReleaseImage(&image);//释放
cvReleaseImage(&result);
cvDestroyWindow("original");//销毁
cvDestroyWindow("gray");

return 0;
}


显示效果如下:



第二部分:对灰度图进行二值化处理(阈值用滚动条)。在没有学opencv之前,可能你会想到用MFC实现滚动条,但是怎么说还是有点麻烦,查找opencv

资料后发现其实我们只要调用其中的函数就可以了,非常方便,也由此可见opencv的强大之处。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "cv.h"
#include "highgui.h"

//全局变量
IplImage* pSrcImg=NULL;
IplImage* pDecImg =NULL;

//定义滑块事件函数,供调用
void onTrackerSlid(int thresh)
{
int i,j,k;
int height = pDecImg->height;
int width = pDecImg->width;
int step = pDecImg->widthStep;
int Channels = pDecImg->nChannels;
uchar *data0 = (uchar *) pSrcImg->imageData;
uchar *data1 = (uchar *) pDecImg->imageData;

//对图像元素访问
for(i=0;i<height;i++)
for(j=0;j<width;j++)
for(k=0;k<Channels;k++)
{
if(data0[i*step+j+k]>thresh)
data1[i*step+j+k] = 255;
else
data1[i*step+j+k] = 0;
}
cvShowImage( "pDecImg_Image",pDecImg);
}

int main( int argc, char** argv )
{
int Thresh=10;
pSrcImg=cvLoadImage("D:\\saveImage.jpg",-1);//从本地读取前一部分实验生成的灰度图
pDecImg = cvCreateImage(cvGetSize(pSrcImg),8,1); //1通道
pDecImg = cvCloneImage( pSrcImg);
cvNamedWindow( "Source_Image", CV_WINDOW_AUTOSIZE);
cvNamedWindow("pDecImg_Image",CV_WINDOW_AUTOSIZE);
cvShowImage( "Source_Image", pSrcImg );
//创建滚动条
cvCreateTrackbar("threshold","pDecImg_Image",0,255,onTrackerSlid);
onTrackerSlid(Thresh);
cvSaveImage("D:\\erzhihua.jpg", pDecImg);//将二值化后的图保存到本地
cvWaitKey(0);
//销毁窗口
cvDestroyWindow( "Source_Image" );
cvDestroyWindow( "pDecImg_Image" );
//释放图像
cvReleaseImage( &pSrcImg );
cvReleaseImage( &pDecImg);
return -1;
}


最后显示如下:



如果我们移动滚动条,图像就会随之变化



ok,今天的opencv学习还是挺满意的,接下来要再接再厉啦~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: