Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

2B.cpp

Go to the documentation of this file.
00001 #include "2B.h"
00002 #include "vuVHImage.h"
00003 #include <stdio.h>
00004 #include <string.h>
00005 
00006 //----------------------------------------------------------------------------
00007 //------------------------- public read() ------------------------------------
00008 //----------------------------------------------------------------------------
00009 
00010 bool vu11122::read(void)
00011 {
00012     if (m_FileName.isEmpty()) return setError("No file name specified.");
00013     FILE *file = fopen(m_FileName,"rb");
00014     if (file != NULL)
00015     {
00016         bool success = read(file);
00017         fclose(file);
00018         return success;
00019     }
00020     else
00021         return setError("Could not open the specified file.");
00022 }
00023 
00024 //----------------------------------------------------------------------------
00025 //------------------------- public write() -----------------------------------
00026 //----------------------------------------------------------------------------
00027 
00028 bool vu11122::write(void)
00029 {
00030     if (m_FileName.isEmpty()) return setError("No file name specified.");
00031     
00032     FILE *file = fopen(m_FileName,"wb");
00033     if (file != NULL)
00034     {
00035         bool success = write(file);
00036         fclose(file);
00037         return success;
00038     }
00039     else
00040         return setError("Could not open the specified file.");
00041 }
00042 
00043 //----------------------------------------------------------------------------
00044 //------------------------- protected read() ---------------------------------
00045 //----------------------------------------------------------------------------
00046 
00048 bool vu11122::read(FILE *file)
00049 {
00050     int ret = 0;
00051     dword size = 0;
00052     int len = 0;
00053 
00054     //Read in the base data.
00055     bool success = vu1112::read(file);
00056     if (!success) return false;
00057 
00058     //Read in the name of the data
00059     char dataName[64];
00060     ret = fscanf(file,"SCALARS %s ",dataName);
00061     if (ret != 1) return setInvalidFormatError();
00062     //Store the name of the data
00063     m_DataName = dataName;
00064 
00065     //Read in the type of data and the colour lookup table.
00066     fscanf(file,"word LOOKUP_TABLE default%n",&len);
00067     if ((len < 25) || (fgetc(file) != '\n')) return setInvalidFormatError();
00068 
00069     //check data size
00070     if (m_DataSize != (m_Dim1Size * m_Dim2Size * m_Dim3Size*2))
00071         return setInvalidFormatError();
00072 
00073     //Allocate memory for the volume data
00074     m_Data = new byte[m_DataSize];
00075 
00076     //Read in the volume data according to the format of the file
00077     if (m_Binary)
00078         size = fread(m_Data,1,m_DataSize,file);
00079     else
00080     {
00081         ret = 1;
00082         dword i = 0;
00083         while ((ret > 0) && (i < m_DataSize)) {
00084             int n;
00085             ret = fscanf(file," %i", &n);
00086             *((word*)&m_Data[i+=2]) = (word)n;
00087         }
00088         size = i;
00089     }
00090     
00091     //Make sure that the right amount of data was read in
00092     if (size != m_DataSize) return setInvalidFormatError();
00093 
00094     return true;
00095 }
00096 
00097 //----------------------------------------------------------------------------
00098 //------------------------- protected write() --------------------------------
00099 //----------------------------------------------------------------------------
00100 
00101 bool vu11122::write(FILE *file)
00102 {
00103     int ret;
00104     dword size = 0;
00105 
00106     m_Binary = true;
00107 
00108     bool success = vu1112::write(file);
00109     if (!success) return false;
00110     
00111     fprintf(file,"SCALARS ");
00112 
00113     //Write the name of the data
00114     if (!m_DataName.isEmpty())
00115         fprintf(file,"%s ",m_DataName.c_str());
00116     else
00117         fprintf(file,"data ");
00118 
00119     fprintf(file,"word\nLOOKUP_TABLE default\n");
00120 
00121     //Write the volume data according to it's format
00122     if (m_Binary)
00123         size = fwrite(m_Data,1,m_DataSize,file);
00124     else
00125     {
00126         ret = 1;
00127         dword i = 0;
00128         while ((ret > 0) && (i < m_DataSize/2))
00129             ret = fprintf(file," %d",((word*)m_Data)[i++]);
00130         size = i*2;
00131     }
00132     
00133     if (size == m_DataSize)
00134         return true;
00135     else
00136         return setWriteError();
00137 }
00138 
00139 word vu11122::getDataValue(unsigned int x, unsigned int y, unsigned int z)
00140 {
00141   if ( (x<0) || (x>=m_Dim1Size) || (y<0) || (y>=m_Dim2Size) || (z<0) || (z>=m_Dim3Size) )
00142     return 0;
00143   else
00144     return m_Data[(x+y*m_Dim1Size+z*m_Dim1Size*m_Dim2Size)*2];
00145 }
00146 
00147 void vu11122::generateLapWeightHistogram(const char* filename)
00148 {
00155     unsigned long laplace_hist[256*256];
00156     unsigned long surface_area[256*256];
00157     //
00158     // generate laplacian weighted histogram
00159     //
00160 
00161     for (int i=0; i<256*256; i++)
00162       {
00163         laplace_hist[i] = 0;
00164         surface_area[i] = 0;
00165       }
00166 
00167     for (unsigned int k=0; k<m_Dim3Size; k++)
00168       for (unsigned int j=0; j<m_Dim2Size; j++)
00169         for (unsigned int i=0; i<m_Dim1Size; i++)
00170           {
00171             unsigned int val = getDataValue(i,j,k);
00172             
00173             laplace_hist[val] +=
00174               ((getDataValue(i, j , k) - getDataValue(i+2, j, k)) - (getDataValue(i-2, j , k) - getDataValue(i, j, k))) +
00175               ((getDataValue(i, j , k) - getDataValue(i, j+2, k)) - (getDataValue(i, j-2 , k) - getDataValue(i, j, k))) +
00176               ((getDataValue(i, j , k) - getDataValue(i, j, k+2)) - (getDataValue(i, j , k-2) - getDataValue(i, j, k)));
00177 
00178               if (val > getDataValue(i+1,j,k))
00179                 surface_area[val] += 1;
00180               if (val < getDataValue(i+1,j,k))
00181                 surface_area[val] -= 1;
00182               if (val > getDataValue(i-1,j,k))
00183                 surface_area[val] += 1;
00184               if (val < getDataValue(i-1,j,k))
00185                 surface_area[val] -= 1;
00186 
00187               if (val > getDataValue(i,j+1,k))
00188                 surface_area[val] += 1;
00189               if (val < getDataValue(i,j+1,k))
00190                 surface_area[val] -= 1;
00191               if (val > getDataValue(i,j-1,k))
00192                 surface_area[val] += 1;
00193               if (val < getDataValue(i,j-1,k))
00194                 surface_area[val] -= 1;
00195 
00196               if (val > getDataValue(i,j,k+1))
00197                 surface_area[val] += 1;
00198               if (val < getDataValue(i,j,k+1))
00199                 surface_area[val] -= 1;
00200               if (val > getDataValue(i,j,k-1))
00201                 surface_area[val] += 1;
00202               if (val < getDataValue(i,j,k-1))
00203                 surface_area[val] -= 1;
00204           }
00205 
00206     for (int i = 256*256-2; i>= 0; i--)
00207       {
00208         laplace_hist[i] += laplace_hist[i+1];
00209         surface_area[i] += surface_area[i+1];
00210       }
00211 
00212     cout << "Writing laplacian weighted histogram to file..." << endl;
00213 
00214     FILE *fp1, *fp2;
00215     
00216     fp1=fopen("lp_hist16.dat","w");
00217     fp2=fopen("lp_area_hist16.dat","w");
00218     
00219     // write header
00220     for (int i=0; i<256*256; i++)
00221       {
00222         fprintf(fp1, "%d %d\n", i, (int)laplace_hist[i]);
00223         if (surface_area[i] != 0)
00224           fprintf(fp2, "%d %f\n", i, double(laplace_hist[i])/double(surface_area[i]));
00225       }
00226         
00227     fclose(fp1);
00228     fclose(fp2);
00229 }
00230 
00232 bool readFreZ(vu11122 &volume, const vuString &filemask, 
00233                      int startID, int endID, int incID)
00234 {
00235     char filename[2048];
00236     if(endID<startID || startID<0) return false;
00237     sprintf(filename,filemask,startID);
00238     vuVHImage img(filename);
00239     if(!img.magicMatch()) return false;
00240     if(img.getWidth()>0 && img.getHeight()>0)
00241     {
00242         volume.m_Dim1Size = img.getWidth();
00243         volume.m_Dim2Size = img.getHeight();
00244         volume.m_Dim3Size = (endID-startID)/incID + 1;
00245         endID = startID + (volume.m_Dim3Size-1)*incID;
00246         volume.m_DataSize = volume.m_Dim1Size*
00247             volume.m_Dim2Size*volume.m_Dim3Size*2;
00248 
00249         volume.m_Spacing = 1;
00250         
00251         volume.m_Dim1Origin = 0;
00252         volume.m_Dim2Origin = 0;
00253         volume.m_Dim3Origin = 0;
00254         volume.m_Data = new byte[volume.m_DataSize];
00255 
00256 //      cout << volume.m_Dim1Size << "x" 
00257 //           << volume.m_Dim2Size << "x" 
00258 //           << volume.m_Dim3Size << endl;
00259 
00260         int sliceID, nslice;
00261         for(sliceID = startID, nslice=0; sliceID<=endID; 
00262             sliceID+=incID, nslice++)
00263         {
00264             sprintf(filename,filemask,sliceID);
00265             if(!img.loadSlice(filename)) return false;
00266             memcpy(&volume.m_Data[volume.m_Dim1Size*volume.m_Dim2Size*2*nslice], 
00267                    img.getData(), volume.m_Dim1Size*volume.m_Dim2Size*2);
00268         }
00269     }   
00270     return true;
00271 }
00272 
00273 bool vu11122::createHistogram(vuHistogram& hist) const
00274 {
00275     if(hist.getType() == vuHistogram::TYPE_INTENSITY) {
00276         hist.reset();
00277         const word *dat = (word*)m_Data;
00278         dword p;
00279         for(p=0; p<m_Dim1Size*m_Dim2Size*m_Dim3Size; p++, dat++)
00280             hist.recordIntensity(*dat);
00281         return true;
00282     } else return false;
00283 }
00284 
00285 void vu11122::remap(const vuMap& map)
00286 {
00287     dword i;
00288     word *dat = (word*)m_Data;
00289     for(i=m_Dim1Size*m_Dim2Size*m_Dim3Size; i>0; i--, dat++)
00290         *dat = map[*dat];
00291 }
00292 

Generated on Wed Dec 15 21:20:27 2004 for vuVolume by  doxygen 1.3.9.1