Esempio n. 1
0
def RotateImage(img, deltaPhi):
    mt = img.memType
    img.MoveToGPU()
    img.ReIm2AmPh()

    piBy4 = np.pi / 4
    deltaPhiRad = deltaPhi * np.pi / 180.0
    rMax = np.sqrt((img.width / 2.0) ** 2 + (img.height / 2.0) ** 2)
    if (deltaPhiRad // piBy4 + 1) % 2:
        angle = piBy4 - (deltaPhiRad % piBy4)
    else:
        angle = deltaPhiRad % piBy4
    rotWidth = int(np.ceil(2 * rMax * np.cos(angle)))
    rotHeight = rotWidth
    imgRotated = Image(rotHeight, rotWidth, img.cmpRepr, img.memType)
    filled = cuda.to_device(np.zeros(imgRotated.amPh.am.shape, dtype=np.int32))

    # rotation

    blockDim, gridDim = ccfg.DetermineCudaConfigNew(img.amPh.am.shape)
    RotateImage_dev[gridDim, blockDim](img.amPh.am, imgRotated.amPh.am, filled, deltaPhiRad)
    imgRotated.MoveToGPU()
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(imgRotated.amPh.am.shape)
    InterpolateMissingPixels_dev[gridDim, blockDim](imgRotated.amPh.am, filled)

    imgRotated = CreateImageExpFromImage(imgRotated)
    img.ChangeMemoryType(mt)
    return imgRotated
Esempio n. 2
0
def MultAmPhMatrices(ap1, ap2):
    blockDim, gridDim = ccfg.DetermineCudaConfig(ap1.am.shape[0])
    apRes = ComplexAmPhMatrix(ap1.am.shape[0], ap1.am.shape[1],
                              ComplexAmPhMatrix.mem['GPU'])
    MultAmPhMatrices_dev[gridDim, blockDim](ap1.am, ap1.ph, ap2.am, ap2.ph,
                                            apRes.am, apRes.ph)
    return apRes
Esempio n. 3
0
def ConjugateAmPhMatrix(ap):
    blockDim, gridDim = ccfg.DetermineCudaConfig(ap.am.shape[0])
    apConj = ComplexAmPhMatrix(ap.am.shape[0], ap.am.shape[1],
                               ComplexAmPhMatrix.mem['GPU'])
    ConjugateAmPhMatrix_dev[gridDim, blockDim](ap.am, ap.ph, apConj.am,
                                               apConj.ph)
    return apConj
Esempio n. 4
0
def InsertAperture(img, ap_diameter):
    img_dim = img.amPh.am.shape[0]
    blockDim, gridDim = ccfg.DetermineCudaConfig(img_dim)
    img.MoveToGPU()
    img_with_aperature = imsup.CopyImage(img)
    ap_radius = ap_diameter // 2
    InsertAperture_dev[gridDim, blockDim](img_with_aperature.amPh.am, img_with_aperature.amPh.ph, img_dim, ap_radius)
    return img_with_aperature
Esempio n. 5
0
def MagnifyImage(img, factor):
    img.MoveToGPU()
    img.ReIm2AmPh()
    magHeight = int(factor * img.height)
    magWidth = int(factor * img.width)
    imgScaled = Image(magHeight, magWidth, img.cmpRepr, img.memType)
    filled = cuda.to_device(np.zeros(imgScaled.amPh.am.shape, dtype=np.int32))

    # magnification

    blockDim, gridDim = ccfg.DetermineCudaConfigNew(img.amPh.am.shape)
    MagnifyImage_dev[gridDim, blockDim](img.amPh.am, imgScaled.amPh.am, filled, factor)

    imgScaled.MoveToGPU()
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(imgScaled.amPh.am.shape)
    InterpolateMissingPixels_dev[gridDim, blockDim](imgScaled.amPh.am, filled)

    return imgScaled
Esempio n. 6
0
def CalcTransferFunction(imgDim, pxDim, defocusChange):
    blockDim, gridDim = ccfg.DetermineCudaConfig(imgDim)
    ctf = imsup.Image(imgDim, imgDim, imsup.Image.cmp['CAP'],
                      imsup.Image.mem['GPU'])
    ctfCoeff = np.pi * const.ewfLambda * defocusChange
    CalcTransferFunction_dev[gridDim, blockDim](ctf.amPh.am, ctf.amPh.ph,
                                                imgDim, pxDim, ctfCoeff)
    ctf.defocus = defocusChange
    return ctf
Esempio n. 7
0
def PasteROIToImage(img, roi, roiOrig):
    dt = img.cmpRepr
    img.AmPh2ReIm()
    imgNew = Image(img.height, img.width, Image.cmp['CRI'], Image.mem['GPU'])
    imgNew.reIm = img.reIm
    roiOrig_d = cuda.to_device(np.array(roiOrig))
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(roi.reIm.shape)
    PasteROIToImage_dev[gridDim, blockDim](imgNew.reIm, roi.reIm, roiOrig_d)
    img.ChangeComplexRepr(dt)
    return imgNew
Esempio n. 8
0
 def AmPh2ReIm(self):
     if self.cmpRepr == self.cmp['CRI']:
         return
     mt = self.memType
     self.MoveToGPU()
     blockDim, gridDim = ccfg.DetermineCudaConfigNew((self.height, self.width))
     AmPh2ReIm_dev[gridDim, blockDim](self.amPh.am, self.amPh.ph, self.reIm)
     self.cmpRepr = self.cmp['CRI']
     if mt == self.mem['CPU']:
         self.MoveToCPU()
Esempio n. 9
0
def ShiftImageAmpBuffer(img, shift):
    img.shift = [x + dx for x, dx in zip(img.shift, shift)]
    fillValue = np.max(img.amPh.am)
    img.MoveToGPU()
    imgShifted = imsup.Image(img.height, img.width, imsup.Image.cmp['CAP'],
                             imsup.Image.mem['GPU'])
    shift_d = cuda.to_device(np.array(img.shift))
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(img.buffer.shape)
    ShiftImage_dev[gridDim, blockDim](img.amPh.am, imgShifted.amPh.am, shift_d,
                                      fillValue)
    img.buffer.copy_to_device(imgShifted.amPh.am)
    img.MoveToCPU()
Esempio n. 10
0
def FFT2Diff(fft):
    mt = fft.memType
    dt = fft.cmpRepr
    fft.MoveToGPU()
    fft.AmPh2ReIm()
    diff = imsup.Image(fft.height, fft.width, imsup.Image.cmp['CRI'],
                       imsup.Image.mem['GPU'])
    blockDim, gridDim = ccfg.DetermineCudaConfig(fft.width)
    FFT2Diff_dev[gridDim, blockDim](fft.reIm, diff.reIm, fft.width)
    diff.defocus = fft.defocus
    fft.ChangeComplexRepr(dt)
    fft.ChangeMemoryType(mt)
    return diff
Esempio n. 11
0
def calc_dists_from_ellipse(data, ellipse):
    dists_d = cuda.to_device(np.zeros(data.shape, dtype=np.float32))
    # zero_fix można uwzględnić w F1_d, F2_d zamiast w kernelu
    F1_d = cuda.to_device(np.array(ellipse.F1).astype(np.float32))
    F2_d = cuda.to_device(np.array(ellipse.F2).astype(np.float32))

    blockDim, gridDim = ccfg.DetermineCudaConfigNew(data.shape)
    calc_dists_from_ellipse_dev[gridDim, blockDim](dists_d, F1_d, F2_d)

    dists = dists_d.copy_to_host()
    dists = np.abs(dists - ellipse.s)

    return dists
Esempio n. 12
0
def CropImageROICoords(img, coords):
    roiHeight = coords[3] - coords[1]
    roiWidth = coords[2] - coords[0]
    dt = img.cmpRepr
    img.AmPh2ReIm()
    roi = Image(roiHeight, roiWidth, img.cmpRepr, Image.mem['GPU'])
    topLeft_d = cuda.to_device(np.array(coords[:2], dtype=np.int32))
    blockDim, gridDim = ccfg.DetermineCudaConfigNew((roiHeight, roiWidth))
    CropImageROICoords_dev[gridDim, blockDim](img.reIm, roi.reIm, topLeft_d)
    img.ChangeComplexRepr(dt)
    roi.ChangeComplexRepr(dt)
    roi.defocus = img.defocus           # !!!
    roi.numInSeries = img.numInSeries   # !!!
    return roi
Esempio n. 13
0
def CropImageROI(img, roiOrig, roiDims, isOrigTopLeft):
    dt = img.cmpRepr
    img.AmPh2ReIm()
    roi = Image(roiDims[0], roiDims[1], img.cmpRepr, Image.mem['GPU'])
    roiOrig_d = cuda.to_device(np.array(roiOrig))
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(roiDims)
    if isOrigTopLeft:
        CropImageROITopLeft_dev[gridDim, blockDim](img.reIm, roi.reIm, roiOrig_d)
    else:
        CropImageROIMid_dev[gridDim, blockDim](img.reIm, roi.reIm, roiOrig_d)
    img.ChangeComplexRepr(dt)
    roi.ChangeComplexRepr(dt)
    roi.defocus = img.defocus   # !!!
    return roi
Esempio n. 14
0
def crop_am_ph_roi(img, coords):
    mt = img.memType
    img.MoveToGPU()

    roi_h = coords[3] - coords[1]
    roi_w = coords[2] - coords[0]
    roi = ImageExp(roi_h, roi_w, img.cmpRepr, img.memType)
    top_left_d = cuda.to_device(np.array(coords[:2], dtype=np.int32))

    block_dim, grid_dim = ccfg.DetermineCudaConfigNew((roi_h, roi_w))
    CropImageROICoords_dev[grid_dim, block_dim](img.amPh.am, roi.amPh.am, top_left_d)
    CropImageROICoords_dev[grid_dim, block_dim](img.amPh.ph, roi.amPh.ph, top_left_d)

    img.ChangeMemoryType(mt)
    roi.ChangeMemoryType(mt)
    return roi
Esempio n. 15
0
def ShiftImage(img, shift):
    mt = img.memType
    dt = img.cmpRepr
    img.MoveToGPU()
    img.AmPh2ReIm()

    imgShifted = imsup.Image(img.height, img.width, img.cmpRepr, img.memType)
    shift_d = cuda.to_device(np.array(shift))
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(img.reIm.shape)
    ShiftImage_dev[gridDim, blockDim](img.reIm, imgShifted.reIm, shift_d, 0.0)

    img.ChangeComplexRepr(dt)
    img.ChangeMemoryType(mt)
    imgShifted.ChangeComplexRepr(dt)
    imgShifted.ChangeMemoryType(mt)
    return imgShifted
Esempio n. 16
0
def PasteROIToImageTopLeft(img, roi, roiTopLeft, spot=False):
    img.MoveToGPU()
    roi.MoveToGPU()
    dt = img.cmpRepr
    imgNew = CopyImage(img)
    imgNew.AmPh2ReIm()
    roi.AmPh2ReIm()

    roiOrig = np.array(roiTopLeft) + np.array(roi.reIm.shape) // 2      # !!!
    roiOrig_d = cuda.to_device(roiOrig)
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(roi.reIm.shape)
    if not spot:
        PasteROIToImage_dev[gridDim, blockDim](imgNew.reIm, roi.reIm, roiOrig_d)
    else:
        PasteSpotToImage_dev[gridDim, blockDim](imgNew.reIm, roi.reIm, roiOrig_d)
    imgNew.ChangeComplexRepr(dt)
    return imgNew
Esempio n. 17
0
def calc_ctf(img_dim, px_dim, defocus, Cs=const.Cs, A1=ab.PolarComplex(const.A1_amp, const.A1_phs),
             df_spread=const.df_spread, conv_angle=const.conv_angle, A1_dir=1):
    df_coeff = np.pi * const.ewfLambda * defocus
    Cs_coeff = 0.5 * np.pi * (const.ewfLambda ** 3) * Cs
    Cs_spat_coeff = Cs * const.ewfLambda ** 2
    conv_ang_coeff = (np.pi * conv_angle) ** 2
    df_spread_coeff = 0.5 * np.pi * const.ewfLambda * df_spread
    A1_re_coeff = A1_dir * np.pi * const.ewfLambda * A1.real()
    A1_im_coeff = A1_dir * 2 * np.pi * const.ewfLambda * A1.imag()

    block_dim, grid_dim = ccfg.DetermineCudaConfig(img_dim)
    ctf = imsup.ImageExp(img_dim, img_dim, imsup.Image.cmp['CAP'], imsup.Image.mem['GPU'])
    calc_ctf_dev[grid_dim, block_dim](ctf.amPh.am, ctf.amPh.ph, img_dim, px_dim, defocus, df_coeff, Cs_coeff, A1_re_coeff,
                                      A1_im_coeff, Cs_spat_coeff, conv_ang_coeff, df_spread_coeff)
    ctf.defocus = defocus
    ctf.MoveToCPU()
    return ctf
Esempio n. 18
0
def FindMinInImage(img):
    dimSize = img.width
    arrReduced = img.amPh.am
    blockDim, gridDim = ccfg.DetermineCudaConfig(dimSize // 2)
    while dimSize > 2:
        dimSize //= 2
        # arrReducedNew = cuda.device_array((dimSize, dimSize), dtype=np.float32)
        arrReducedNew = cuda.to_device(
            np.zeros((dimSize, dimSize), dtype=np.float32))
        ReduceArrayToFindMin_dev[gridDim, blockDim](arrReduced, arrReducedNew)
        arrReduced = arrReducedNew
        if gridDim[0] > 1:
            gridDim = [gridDim[0] // 2] * 2
        else:
            blockDim = [blockDim[0] // 2] * 2
    imgMin = np.min(arrReduced.copy_to_host())
    # imgMin = arrReduced.copy_to_host()[0, 0]
    return imgMin
Esempio n. 19
0
def shift_am_ph_image(img, shift):
    mt = img.memType
    img.MoveToGPU()

    img_shifted = imsup.ImageWithBuffer(img.height, img.width, img.cmpRepr,
                                        img.memType)
    shift_d = cuda.to_device(np.array(shift))

    blockDim, gridDim = ccfg.DetermineCudaConfigNew(img.amPh.am.shape)
    ShiftImage_dev[gridDim, blockDim](img.amPh.am, img_shifted.amPh.am,
                                      shift_d, 0.0)
    ShiftImage_dev[gridDim, blockDim](img.amPh.ph, img_shifted.amPh.ph,
                                      shift_d, 0.0)

    img.ChangeMemoryType(mt)
    img_shifted.ChangeMemoryType(mt)
    if img.cos_phase is not None:
        img_shifted.update_cos_phase()
    return img_shifted
Esempio n. 20
0
def ShiftImage(img, shift):
    dt = img.cmpRepr
    img.AmPh2ReIm()
    imgShifted = imsup.Image(img.height, img.width, img.cmpRepr,
                             imsup.Image.mem['GPU'])
    shift_d = cuda.to_device(np.array(shift))
    blockDim, gridDim = ccfg.DetermineCudaConfigNew(img.reIm.shape)
    ShiftImage_dev[gridDim, blockDim](img.reIm, imgShifted.reIm, shift_d, 0.0)
    img.ChangeComplexRepr(dt)
    imgShifted.ChangeComplexRepr(dt)

    # imgShifted.prev = img.prev
    # imgShifted.next = img.next
    # if imgShifted.prev is not None:
    #     imgShifted.prev.next = imgShifted
    # if imgShifted.next is not None:
    #     imgShifted.next.prev = imgShifted

    # print('Image was shifted by ({0}, {1}) px'.format(shift[1], shift[0]))
    return imgShifted
Esempio n. 21
0
def run_iwfr(imgs_to_iwfr, n_iters):
    ewf_dir = 'results/ewf/'
    amp_name = 'amp'
    phs_name = 'phs'
    amp_path_base = '{0}{1}_00.png'.format(ewf_dir, amp_name)
    phs_path_base = '{0}{1}_00.png'.format(ewf_dir, phs_name)

    print('Starting IWFR...')
    exit_wave = imsup.copy_am_ph_image(imgs_to_iwfr[0])

    for i in range(0, n_iters):
        print('Iteration no {0}...'.format(i+1))
        imgs_to_iwfr, exit_wave = run_iteration_of_iwfr(imgs_to_iwfr)
        ewf_amp_path = amp_path_base.replace('00', '0{0}'.format(i+1) if i < 10 else '{0}'.format(i+1))
        ewf_phs_path = phs_path_base.replace('00', '0{0}'.format(i+1) if i < 10 else '{0}'.format(i+1))
        imsup.SaveAmpImage(exit_wave, ewf_amp_path)
        imsup.SavePhaseImage(exit_wave, ewf_phs_path)
        ccfg.GetGPUMemoryUsed()

    print('All done')
    return exit_wave
Esempio n. 22
0
from numba import cuda
import Constants as const
import CudaConfig as ccfg
import GUI as gui

cuda.select_device(0)
dev = cuda.get_current_device()
print('CUDA device in use: ' + dev.name.decode())

ccfg.GetGPUFreeMemory()
ccfg.GetGPUMemoryUsed()

gui.RunEwrWindow(const.gridDim)
Esempio n. 23
0
def AddTwoArrays(arr1, arr2):
    blockDim, gridDim = ccfg.DetermineCudaConfig(arr1.shape[0])
    # arrSum = cuda.device_array(arr1.shape, dtype=arr1.dtype)
    arrSum = cuda.to_device(np.zeros(arr1.shape, dtype=arr1.dtype))
    AddTwoArrays_dev[gridDim, blockDim](arr1, arr2, arrSum)
    return arrSum
Esempio n. 24
0
def CalcSqrtOfArray(arr):
    blockDim, gridDim = ccfg.DetermineCudaConfig(arr.shape[0])
    arrSqrt = cuda.device_array(arr.shape, dtype=arr.dtype)
    CalcSqrtOfArray_dev[gridDim, blockDim](arr, arrSqrt)
    return arrSqrt
Esempio n. 25
0
def MultArrayByScalar(arr, scalar):
    blockDim, gridDim = ccfg.DetermineCudaConfig(arr.shape[0])
    # arrRes = cuda.device_array(arr.shape, dtype=arr.dtype)
    MultArrayByScalar_dev[gridDim, blockDim](arr, scalar)
    # arr = cuda.to_device(arrRes)
    return arr
Esempio n. 26
0
def AddArrayToArray(arr1, arr2):
    blockDim, gridDim = ccfg.DetermineCudaConfig(arr1.shape[0])
    AddArrayToArray_dev[gridDim, blockDim](arr1, arr2)
    return arr1
Esempio n. 27
0
def cos_dev_wrapper(arr):
    blockDim, gridDim = ccfg.DetermineCudaConfig(arr.shape[0])
    cos_arr = cuda.to_device(np.zeros(arr.shape, dtype=np.float32))
    cos_dev[gridDim, blockDim](arr, cos_arr)
    return cos_arr
Esempio n. 28
0
def PerformIWFR(images, N):
    imgHeight, imgWidth = images[0].height, images[0].width
    ewfResultsDir = 'results/ewf/'
    ewfAmName = 'am'
    ewfPhName = 'ph'
    # backCTFunctions = []
    # forwCTFunctions = []

    print('Starting IWFR...')

    # storing contrast transfer functions

    # for img in images:
    #     # print(imgWidth, img.px_dim, -img.defocus)
    #     ctf = CalcTransferFunction(imgWidth, img.px_dim, -img.defocus)
    #     ctf.AmPh2ReIm()
    #     # ctf.reIm = ccc.Diff2FFT(ctf.reIm)
    #     backCTFunctions.append(ctf)
    #
    #     ctf = CalcTransferFunction(imgWidth, img.px_dim, img.defocus)
    #     ctf.AmPh2ReIm()
    #     # ctf.reIm = ccc.Diff2FFT(ctf.reIm)
    #     forwCTFunctions.append(ctf)

    # start IWFR procedure

    exitWave = imsup.Image(imgHeight, imgWidth, imsup.Image.cmp['CRI'],
                           imsup.Image.mem['GPU'])

    for i in range(0, N):
        print('Iteration no {0}...'.format(i + 1))
        imsup.ClearImageData(exitWave)

        # backpropagation (to in-focus plane)
        ccfg.GetGPUMemoryUsed()  # !!!

        for img, idx in zip(images, range(0, len(images))):
            # img = PropagateWave(img, backCTFunctions[idx])    # faster, but uses more memory
            img = PropagateToFocus(img)  # slower, but uses less memory
            img.AmPh2ReIm()
            exitWave.reIm = arrsup.AddTwoArrays(exitWave.reIm, img.reIm)

        exitWave.reIm = arrsup.MultArrayByScalar(exitWave.reIm,
                                                 1 / len(images))

        ewfAmPath = ewfResultsDir + ewfAmName + str(i + 1) + '.png'
        ewfPhPath = ewfAmPath.replace(ewfAmName, ewfPhName)
        ewfAmplPhPath = ewfPhPath.replace(ewfPhName, ewfPhName + 'Ampl')
        imsup.SaveAmpImage(exitWave, ewfAmPath)
        imsup.SavePhaseImage(exitWave, ewfPhPath)
        amplifExitPhase = FilterPhase(exitWave)
        imsup.SavePhaseImage(amplifExitPhase, ewfAmplPhPath)

        # forward propagation (to the original focus plane)
        ccfg.GetGPUMemoryUsed()  # !!!

        for img, idx in zip(images, range(0, len(images))):
            # images[idx] = PropagateWave(exitWave, forwCTFunctions[idx])
            images[idx] = PropagateBackToDefocus(exitWave, img.defocus)
            images[idx].amPh.am = img.amPh.am  # restore original amplitude

    print('All done')

    return exitWave