GDI+中的Bitmap类可以用来读取各种格式的图片文件,并对图片进行操作。下面内容主要应用到对图片中每个像素的处理。
应该要用到Curvelets来对图像进行处理,先说一下如何配置项目。
1. 先确认下Curvelets库的包中有dll和lib文件,还有几个头文件。另外的测试程序告诉你如何应用Curvelets的。
2. 新建一个MFC项目,将所有文件复制到项目目录下。项目属性中的链接器选项中,把lib文件名加入到“依赖项”中。将所有头文件加入MFC预编译头中。
3. 在应用Curvelets的时候,记得引用std命名空间和Curvelets的命名空间。
下面用几个代码段来说明如何应用Curvelets对图像进行处理。
假设现在在类(比如文档类)中有m_img为Bitmap,m_matrixR、m_matrixG、m_matrixB为CpxNumMat(复矩阵)。将图片文件读到m_img中,然后对每个像素进行处理,得到RGB颜色分量的三个复矩阵(由于RGB单个分量只是0到254而已,只用整数矩阵即可,但Curvelets只提供了复矩阵进行运算,而且和整数矩阵并没有继承关系,这点有点遗憾,因为整数当然是复数的特例啦)。之后对每个复矩阵进行Curvelets变换。反变换是此的逆过程就不再说明了。下面分别来看下。
1. 将图片文件读到m_img中
m_img = Gdiplus::Bitmap::FromFile(L"h:\01.jpg");
2. 对每个像素进行处理,得到RGB颜色分量的三个复矩阵
int h = m_img->GetHeight();
int w = m_img->GetWidth();
m_matrixR = new CpxNumMat(h, w);
m_matrixG = new CpxNumMat(h, w);
m_matrixB = new CpxNumMat(h, w);
for(int i=0; i<h; i++)
for(int j=0; j<w; j++)

...{
Gdiplus::Color c(0, 0, 0);
m_img->GetPixel(i, j, &c);
(*m_matrixR)(i,j) = cpx(c.GetR(), 0);
(*m_matrixG)(i,j) = cpx(c.GetG(), 0);
(*m_matrixB)(i,j) = cpx(c.GetB(), 0);
}

3. 对复矩阵进行Curvelets变换
vector< vector<CpxNumMat> > c;
int m=m_matrixR->m();
int n=m_matrixR->n();
int nbscales = 8;
int nbangles_coarse = 1;
int ac = 0;
fdct_wrapping(m, n, nbscales, nbangles_coarse, ac, *m_matrixR, c);


发表于 @ 2008年05月23日 21:54:17|评论(loading...)|编辑