现在的位置: 首页 > 综合 > 正文

opencv学习_14 (图像的尺度空间)

2014年01月24日 ⁄ 综合 ⁄ 共 1548字 ⁄ 字号 评论关闭

什么是图像的尺度空间?

    比如用baidu地图的放大缩小查看国家地区信息,这个放大缩小就涉及到图片的尺度信息。

为什么需要尺度空间?

视觉系统处理这些图片时,这些图片来自于未知的一些场景,未知的尺度,未知的角度等噪声影响下,我们为了克服这些困难,就需要建立相应的尺度空间

怎么样去建立尺度空间?

通过不同方差的高斯和去做卷积

结论:通过高斯和获取图像的尺度空间

高斯窗口和高斯方差之间的关系:

高斯窗口(winsize)=  2*(3*方差(sigma))+ 1;  sigma 也称为尺度因子

随着高斯窗口的减小即高斯方差的减小,我们获取到的轮廓信息更加的详细。

因此 此时图像的表示可以引用到三维空间中即x,y,sigma,记为I(x,y,sigma).

测试代码:

#include <iostream>
#include <sstream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;

#define SCALESIZE 20
int main(int argc, char* argv[])
{
	IplImage* src;
	src = cvLoadImage("E:\\study_opencv_video\\lesson20_1\\test1.jpg",0);
	int winSize[SCALESIZE],i;
	IplImage* scaleImage[SCALESIZE];
	IplImage* edgeImage[SCALESIZE];
	char filename[256];
	char filename2[256];
	winSize[0] = 3;
	scaleImage[0]=cvCreateImage(cvGetSize(src),8,1);
	edgeImage[0]=cvCreateImage(cvGetSize(src),8,1);	
	for( i=1;i<SCALESIZE;i++)
	{
		winSize[i] = winSize[i-1]+2;
		scaleImage[i]=cvCreateImage(cvGetSize(src),8,1);
		edgeImage[i]=cvCreateImage(cvGetSize(src),8,1);
	}	
	for(i=0;i<SCALESIZE;i++)
	{
		cvSmooth(src,scaleImage[i],CV_GAUSSIAN,winSize[i],winSize[i]);

		cvCanny(scaleImage[i], edgeImage[i], 30, 90, 3);
	}
	//保存图像
	for(i=0;i<SCALESIZE;i++)
	{
		string s1 = "scale_";
		string jpg = ".jpg";
		stringstream ss;
		ss << s1;
		ss << i;
		ss << jpg;
		ss >> filename;
		//sprintf(filename,"scale_%d.jpg",i);
		cvSaveImage(filename,scaleImage[i]);
		ss.clear();
		string s2 = "edge_";
		ss << s2;
		ss << i;
		ss << jpg;
		ss >> filename2;
		cvSaveImage(filename2,edgeImage[i]);
	}

	for(i=0;i<SCALESIZE;i++)
	{
		cvReleaseImage(&scaleImage[i]);
		cvReleaseImage(&edgeImage[i]);
	}
	cvReleaseImage(&src);
	return 0;
}

作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)

抱歉!评论已关闭.