00001 #include "2B.h"
00002 #include "vuVHImage.h"
00003 #include <stdio.h>
00004 #include <string.h>
00005
00006
00007
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
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
00045
00046
00048 bool vu11122::read(FILE *file)
00049 {
00050 int ret = 0;
00051 dword size = 0;
00052 int len = 0;
00053
00054
00055 bool success = vu1112::read(file);
00056 if (!success) return false;
00057
00058
00059 char dataName[64];
00060 ret = fscanf(file,"SCALARS %s ",dataName);
00061 if (ret != 1) return setInvalidFormatError();
00062
00063 m_DataName = dataName;
00064
00065
00066 fscanf(file,"word LOOKUP_TABLE default%n",&len);
00067 if ((len < 25) || (fgetc(file) != '\n')) return setInvalidFormatError();
00068
00069
00070 if (m_DataSize != (m_Dim1Size * m_Dim2Size * m_Dim3Size*2))
00071 return setInvalidFormatError();
00072
00073
00074 m_Data = new byte[m_DataSize];
00075
00076
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
00092 if (size != m_DataSize) return setInvalidFormatError();
00093
00094 return true;
00095 }
00096
00097
00098
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
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
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
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
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
00257
00258
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