📄 cu_basic_utils.cpp
字号:
/* * basic_utils.cpp * * Created by Tobias Gebaeck on 12.9.2007. * Copyright 2007 ETH Zurich. All rights reserved. * */#include "CurveletUtils.h"#include "fdct_wrapping.hpp"using namespace fdct_wrapping_ns;namespace CurveletUtils {// Create an all-zero curvelet data structure, from image with dimensions m*nCurvUtilError zero_fdct(int m, int n, CurveletData &cdata, int allcurvelets/* =0 */, int nscales/* = -1 */, int nangles_coarse/* =-1*/){ if (nscales < 0) nscales = (int) ceil(log2(min(m,n)) - 3); if (nangles_coarse < 0) nangles_coarse = 16; if (nscales == 0 || nangles_coarse == 0) return CUError_BadParams; CpxNumMat x(m,n); // all zero matrix fdct_wrapping(m, n, nscales, nangles_coarse, allcurvelets, x, cdata); return CUError_NoError;}// Count the number of non-zeros, and total number of elements in curvelet data structurevoid countnnz(const CurveletData &cdata, int &nnz, int &nel){ nnz = 0; nel = 0; for (int j=0; j<cdata.size(); j++) { for (int l=0; l<cdata[j].size(); l++) { nel += cdata[j][l].m() * cdata[j][l].n(); for (int idx=0; idx<cdata[j][l].m() * cdata[j][l].n(); idx++) { if (cdata[j][l].data()[idx] != cpx(0.0,0.0)) nnz++; } } }}// Count the number of non-zero coefficients, and total number, on selected (zero-based) levelsCurvUtilError countnnz(const CurveletData &cdata, const IntNumVec &levels, int &nnz, int &nel){ nnz = 0; nel = 0; for (int j=0; j<levels.m(); j++) { int lev = levels(j); if (lev < 0 && lev >= cdata.size()) return CUError_BadParams; for (int l=0; l<cdata[lev].size(); l++) { nel += cdata[lev][l].m() * cdata[lev][l].n(); for (int idx=0; idx<cdata[lev][l].m() * cdata[lev][l].n(); idx++) { if (cdata[lev][l].data()[idx] != cpx(0.0,0.0)) nnz++; } } } return CUError_NoError;}// Count number of nonzero curvelet coefficientsint countnnz(const CurveletData &cdata){ int nel, nnz; countnnz(cdata, nnz, nel); return nnz;}// Count number of nonzero curvelet coefficients on selected (zero-based) levelsCurvUtilError countnnz(const CurveletData &cdata, const IntNumVec &levels, int &nnz){ int nel; return countnnz(cdata, levels, nnz, nel); }// Count number of curvelet coefficientsint countnel(const CurveletData &cdata){ int nel = 0; for (int j=0; j<cdata.size(); j++) { for (int l=0; l<cdata[j].size(); l++) { nel += cdata[j][l].m() * cdata[j][l].n(); } } return nel; }// Count number of curvelet coefficients on selected (zero-based) levelsCurvUtilError countnel(const CurveletData &cdata, const IntNumVec &levels, int &nel){ nel = 0; for (int j=0; j<levels.m(); j++) { int lev = levels(j); if (lev < 0 && lev >= cdata.size()) return CUError_BadParams; for (int l=0; l<cdata[lev].size(); l++) { nel += cdata[lev][l].m() * cdata[lev][l].n(); } } return CUError_NoError; }// Maps coordinates x,y to indices on level tolev in CurveletData structure cdata// x and y in [0 1)// dir is 0 or 1 for North/South resp. East/Westvoid MapXYToLevel(const CurveletData &cdata, double x, double y, int tolev, int &ti, int &tj, int dir){ int L1,L2; switch (dir) { case 0: L1 = cdata[tolev][0].m(); L2 = cdata[tolev][0].n(); ti = int(x * L1 + 0.5) % L1; tj = int(y * L2 + 0.5) % L2; break; case 1: L1 = cdata[tolev][cdata[tolev].size()/4].m(); L2 = cdata[tolev][cdata[tolev].size()/4].n(); ti = int(x * L1 + 0.5) % L1; tj = int(y * L2 + 0.5) % L2; break; }} // Maps indices (fi,fj) on level fromlev and dir fromdir (actual direction index), to level tolev and // either N/S or E/W grid, (dir=0 for N/S and dir=1 for E/W)void MapToLevel(const CurveletData &cdata, int fromlev, int fromdir, int fi, int fj, int tolev, int &ti, int &tj, int dir){ MapXYToLevel(cdata, fi / (double) cdata[fromlev][fromdir].m(), fj / (double) cdata[fromlev][fromdir].n(), tolev, ti, tj, dir);} // Map coordinates (x,y) to grid with size m*n, assuming grid is on [0,1) x [0,1)void MapXYToGrid(int m, int n, double x, double y, int &ti, int &tj){ ti = (int(x * m + 0.5)) % m; tj = (int(y * n + 0.5)) % n;}// Map indices (fi,fj) on level fromlev and dir fromdir to a grid with size m*n, assumed to be on [0,1) x [0,1)void MapToGrid(int m, int n, const CurveletData &cdata, int fromlev, int fromdir, int fi, int fj, int &ti, int &tj){ MapXYToGrid(m, n, fi / (double) cdata[fromlev][fromdir].m(), fj / (double) cdata[fromlev][fromdir].n(), ti, tj);}// Get quadrant (0..3 for N,E,S,W) for direction diridx on level levelint GetQuadrant(const CurveletData &cdata, int level, int diridx){ return diridx / (cdata[level].size() / 4);}// Compute variance and mean of a vector vecvoid VarAndMean(const DblNumVec &vec, double &mean, double &var){ double sum=0.0, sqsum=0.0; for (int k=0; k<vec.m(); k++) { sum += vec(k); sqsum += vec(k)*vec(k); } mean = sum/vec.m(); var = sqsum/vec.m() - mean*mean;}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -