Xmipp  v3.23.11-Nereus
Classes | Functions
Micrograph Downsample
Collaboration diagram for Micrograph Downsample:

Classes

class  ProgTransformDownsample
 

Functions

void downsampleKernel (const ImageGeneric &M, double step, ImageGeneric &Mp)
 
void downsampleFourier (const ImageGeneric &M, double step, ImageGeneric &Mp, int nThreads)
 
void downsampleSmooth (const ImageGeneric &M, ImageGeneric &Mp)
 

Detailed Description

Function Documentation

◆ downsampleFourier()

void downsampleFourier ( const ImageGeneric M,
double  step,
ImageGeneric Mp,
int  nThreads 
)

Downsample a micrograph in Fourier space. The input and output micrographs must be already open.

Definition at line 202 of file transform_downsample.cpp.

203 {
204  size_t Ydim, Xdim, Ypdim, Xpdim;
205  M().getDimensions(Xdim, Ydim);
206  Mp().getDimensions(Xpdim, Ypdim);
207 
208  // Read the micrograph in memory as doubles
210  Mmem.setMmap(true);
211  Mmem.resizeNoCopy(Ydim,Xdim);
213  M().getImage(Mmem);
214 
215  // Perform the Fourier transform
216  FourierTransformer transformerM;
217  transformerM.setThreadsNumber(nThreads);
218  transformerM.FourierTransform(Mmem, MmemFourier, false);
219 
220  // Create space for the downsampled image and its Fourier transform
221  MultidimArray<double> Mpmem(Ypdim,Xpdim);
222  MultidimArray<std::complex<double> > MpmemFourier;
223  FourierTransformer transformerMp;
224  transformerMp.setThreadsNumber(nThreads);
225  transformerMp.setReal(Mpmem);
226  transformerMp.getFourierAlias(MpmemFourier);
227 
228  int ihalf=YSIZE(MpmemFourier)/2+1;
229  for (int i=0; i<ihalf; i++)
230  for (size_t j=0; j<XSIZE(MpmemFourier); j++)
231  A2D_ELEM(MpmemFourier,i,j)=A2D_ELEM(MmemFourier,i,j);
232  for (size_t i=ihalf; i<YSIZE(MpmemFourier); i++)
233  {
234  size_t ip=YSIZE(MmemFourier)-YSIZE(MpmemFourier)+i;
235  for (size_t j=0; j<XSIZE(MpmemFourier); j++)
236  A2D_ELEM(MpmemFourier,i,j)=A2D_ELEM(MmemFourier,ip,j);
237  }
238 
239  // Transform data
240  transformerMp.inverseFourierTransform();
241 
242  // Find minimun and range in output data
243  double omin=0.,omax=0.;
244  Mpmem.computeDoubleMinMax(omin,omax);
245  double orange = omax - omin;
246  double a = (pow(2.0, Mp.getDatatypeDepth()) - 1.0) / orange;
247  double b = -omin;
248  double scale=1;
249  if (M.getDatatype() != DT_Float)
250  scale = (pow(2.0, Mp.getDatatypeDepth()) - 1.0) /
251  (pow(2.0, M.getDatatypeDepth()) - 1.0);
252  else if (M.getDatatype() == DT_Float)
253  scale = 1;
254 
255  // Copy back data
256  if (Mp.datatype!=DT_Float)
258  Mp.setPixel(i, j, a*(A2D_ELEM(Mpmem,i,j)*scale + b));
259  else
261  Mp.setPixel(i, j, A2D_ELEM(Mpmem,i,j));
262 }
#define YSIZE(v)
#define A2D_ELEM(v, i, j)
void setPixel(unsigned long n, int k, int i, int j, double value) const
void inverseFourierTransform()
Definition: xmipp_fftw.cpp:329
void setThreadsNumber(int tNumber)
Definition: xmipp_fftw.h:119
void resizeNoCopy(const MultidimArray< T1 > &v)
#define i
DataType getDatatype() const
#define FOR_ALL_ELEMENTS_IN_ARRAY2D(m)
doublereal * b
void setReal(MultidimArray< double > &img)
Definition: xmipp_fftw.cpp:129
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
void setMmap(bool mmap)
#define XSIZE(v)
void FourierTransform(T &v, T1 &V, bool getCopy=true)
Definition: xmipp_fftw.h:166
#define j
void getFourierAlias(T &V)
Definition: xmipp_fftw.h:207
int getDatatypeDepth() const
doublereal * a

◆ downsampleKernel()

void downsampleKernel ( const ImageGeneric M,
double  step,
ImageGeneric Mp 
)

Downsample a micrograph using a rectangular kernel. The input and output micrographs must be already open.

Definition at line 114 of file transform_downsample.cpp.

115 {
116  auto istep=(int)step;
117  MultidimArray<double> kernel;
118  kernel.resizeNoCopy(istep,istep);
119  kernel.initConstant(1.0/MULTIDIM_SIZE(kernel));
120 
121  size_t Ydim, Xdim, Ypdim, Xpdim;
122  M().getDimensions(Xdim, Ydim);
123  Mp().getDimensions(Xpdim, Ypdim);
124 
125  // Look for input/output ranges
126  double a = 1;
127  double b = 0;
128  double scale = 1;
129  size_t ii, jj, i2, j2, i, j, y, x;
130  if (Mp.getDatatype() != DT_Float)
131  {
132  double imin, imax;
133  double omin=0., omax=0.;
134  imin=imax=M.getPixel(0,0);
135  bool ofirst = true;
136 
137  if (M.getDatatype() != DT_Float)
138  scale = (pow(2.0, Mp.getDatatypeDepth()) - 1.0) /
139  (pow(2.0, M.getDatatypeDepth()) - 1.0);
140  else if (M.getDatatype() == DT_Float)
141  scale = 1;
142  for (ii = 0, y = 0; y < Ydim && ii < Ypdim; y += istep, ++ii)
143  for (jj = 0, x = 0; x < Xdim && jj < Xpdim; x += istep, ++jj)
144  {
145  double pixval = 0;
146  for (i=0, i2=y; i<YSIZE(kernel) && i2<Ydim; ++i, ++i2)
147  for (j=0, j2=x; j<XSIZE(kernel) && j2<Xdim; ++j, ++j2)
148  {
149  double aux=M.getPixel(i2, j2);
150  imin = XMIPP_MIN(imin, aux);
151  imax = XMIPP_MAX(imax, aux);
152  pixval += A2D_ELEM(kernel,i, j) * aux;
153  }
154  pixval *= scale;
155  if (ofirst)
156  {
157  omin = omax = pixval;
158  ofirst = false;
159  }
160  else
161  {
162  omin = XMIPP_MIN(omin, pixval);
163  omax = XMIPP_MAX(omax, pixval);
164  }
165  }
166 
167  // Compute range transformation
168  double irange = imax - imin;
169  double orange = omax - omin;
170 
171  if (M.getDatatype() != DT_Float)
172  {
173  a = scale * irange / orange;
174  b = -omin;
175  }
176  else if (Mp.getDatatype() != DT_Float)
177  {
178  a = (pow(2.0, Mp.getDatatypeDepth()) - 1.0) / orange;
179  scale = 1;
180  b = -omin;
181  }
182  }
183 
184  // Really downsample
185  for (ii = 0, y = 0; y < Ydim && ii < Ypdim; y += istep, ++ii)
186  for (jj = 0, x = 0; x < Xdim && jj < Xpdim; x += istep, ++jj)
187  {
188  double pixval = 0;
189  for (i=0, i2=y; i<YSIZE(kernel) && i2<Ydim; ++i, ++i2)
190  for (j=0, j2=x; j<XSIZE(kernel)&& j2<Xdim; ++j, ++j2)
191  pixval += A2D_ELEM(kernel,i, j) * M.getPixel(i2, j2);
192  if (ii < Ypdim && jj < Xpdim)
193  {
194  if (Mp.datatype != DT_Float)
195  Mp.setPixel(ii, jj, floor(a*(pixval*scale + b)));
196  else
197  Mp.setPixel(ii, jj, pixval);
198  }
199  }
200 }
#define YSIZE(v)
#define A2D_ELEM(v, i, j)
void setPixel(unsigned long n, int k, int i, int j, double value) const
#define XMIPP_MAX(x, y)
Definition: xmipp_macros.h:193
__host__ __device__ float2 floor(const float2 v)
#define MULTIDIM_SIZE(v)
void resizeNoCopy(const MultidimArray< T1 > &v)
static double * y
void initConstant(T val)
doublereal * x
#define i
DataType getDatatype() const
doublereal * b
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
#define XSIZE(v)
double getPixel(unsigned long n, int k, int i, int j) const
#define XMIPP_MIN(x, y)
Definition: xmipp_macros.h:181
#define j
int getDatatypeDepth() const
doublereal * a

◆ downsampleSmooth()

void downsampleSmooth ( const ImageGeneric M,
ImageGeneric Mp 
)

Downsample a micrograph using smooth and color dithering. The input and output micrographs must be already open.

Definition at line 264 of file transform_downsample.cpp.

265 {
266  if (Mp.datatype!=DT_UChar)
267  REPORT_ERROR(ERR_ARG_INCORRECT,formatString("Smooth downsampling is only valid for 8 bit images. \n"
268  "Choose a supporting 8bit file format different from %s",Mp.image->name().c_str()));
269 
270  size_t Ydim, Xdim, Ypdim, Xpdim;
271  M().getDimensions(Xdim, Ydim);
272  Mp().getDimensions(Xpdim, Ypdim);
273  byte *inputImage=nullptr;
275  if (M.datatype==DT_UChar)
276  M().getArrayPointer(inputImage);
277  else
278  {
279  Maux.setMmap(true);
280  M().getImage(Maux);
281  inputImage=MULTIDIM_ARRAY(Maux);
282  }
283  unsigned char *outputImage;
284  Mp().getArrayPointer(outputImage);
285  SmoothResize(inputImage,outputImage, Xdim, Ydim, Xpdim, Ypdim);
286 }
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
#define MULTIDIM_ARRAY(v)
const FileName & name() const
void SmoothResize(byte *picSrc8, byte *destpic8, size_t swide, size_t shigh, size_t dwide, size_t dhigh)
Definition: xvsmooth.cpp:93
void getDimensions(size_t &Xdim, size_t &Ydim, size_t &Zdim, size_t &Ndim) const
Incorrect argument received.
Definition: xmipp_error.h:113
void setMmap(bool mmap)
ImageBase * image
unsigned char byte
Definition: xvsmooth.cpp:73
String formatString(const char *format,...)