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

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

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

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

      

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

#include "stdafx.h"
#include "Windows.h"
#include 
#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 
#include 
#include 
#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;ithresh)
                     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学习还是挺满意的,接下来要再接再厉啦~~


你可能感兴趣的:(opencv)