Example #1
2
def detect_features(image):
    """
    Computer Vision 600.461/661 Assignment 2
    Args:
    	image (numpy.ndarray): The input image to detect features on. Note: this is NOT the image name or image path.
    Returns:
    	pixel_coords (list of tuples): A list of (row,col) tuples of detected feature locations in the image
    """  
    
    pixel_coords = list()
  
    # Compute Gaussian derivatives at each pixel
    (m, n) = image.shape
    Ix = np.zeros((m, n))
    Iy = np.zeros((m, n))
    sigma = 3
    filters.gaussian_filter(image, (sigma, sigma), (0, 1), Ix)
    filters.gaussian_filter(image, (sigma, sigma), (1, 0), Iy)
    
    A = Ix * Ix
    B = Ix * Iy
    C = Iy * Iy
    
    R = np.zeros((m, n))
    r = 3 # Gaussian window radius
    k = 0.05

    # Compute corner response function R
    for j in xrange(r, n-r-1):
        for i in xrange(r, m-r-1):
            # Make a Gaussian window around each pixel
            a = np.sum(A[i-r:i+r+1, j-r:j+r+1])
            b = np.sum(B[i-r:i+r+1, j-r:j+r+1])
            c = np.sum(C[i-r:i+r+1, j-r:j+r+1])

            # Compute second moment matrix H in a 
            # H = [[a, b],[b, c]]

            # Compute eigenvalues of H and calculate response
            # [l1, l2] = np.linalg.eigvals(H)
            # R[i][j] = l1 * l2 - k * (l1 + l2)**2
    
            # Alternately, R = det(H) - k * trace(H)^2 (faster)
            R[i][j] = a * c - b * b  - k * (a + c)**2

    # Normalize R map 
    min_R = np.min(R)
    R = (R - min_R) * 10.0 / (np.max(R) - min_R)

    # Print R map
    # plt.axis('off')
    # plt.imshow(R)
    # plt.show()
    
    # Find local maxima of response function
    radius = 5
    thres = np.mean(R) * 1.2
    pixel_coords = nonmaxsuppts(R, radius, thres)

    return pixel_coords
Example #2
0
def compute_gradmaps(binary, scale, gauss=False):
    """
    Use gradient filtering to find baselines

    Args:
        binary (numpy.array):
        scale (float):
        gauss (bool): Use gaussian instead of uniform filtering

    Returns:
        (bottom, top, boxmap)
    """
    # use gradient filtering to find baselines
    logger.debug('Computing gradient maps')
    boxmap = compute_boxmap(binary, scale)
    cleaned = boxmap*binary
    if gauss:
        grad = gaussian_filter(1.0*cleaned, (0.3*scale, 6*scale), order=(1, 0))
    else:
        grad = gaussian_filter(1.0*cleaned, (max(4, 0.3*scale),
                                             scale), order=(1, 0))
        grad = uniform_filter(grad, (1, 6*scale))
    bottom = norm_max((grad < 0)*(-grad))
    top = norm_max((grad > 0)*grad)
    return bottom, top, boxmap
Example #3
0
File: words.py Project: caoym/odr
def separate_words_from_image(src):
    '''
    从单行文本图片中切割出每一个字
    :param src:
    :return:
    '''
    '''figure()
    subplot(211)
    imshow(src)
    subplot(212)
    imshow(tmp)
    show()'''
    orisum = src.sum(axis=0)/255.0
    sum = filters.gaussian_filter(orisum,8)
    sep = get_separaters_from_image(sum,filters.gaussian_filter(orisum,2))

    words = []
    pos = 0
    h = len(src)
    for i in sep:
        #words += [[i[0],0,i[1]-i[0],h]]
        word = src[:,i[0]:i[1]]
        x,y,w,h = bounding_box(word)
        words.append([i[0]+x,y,w,h])
        #if word is not None:
       #     words += [word]
    return words
Example #4
0
def nlbin(im, threshold=0.5, zoom=0.5, escale=1.0, border=0.1, perc=80,
          range=20, low=5, high=90):
    """
    Performs binarization using non-linear processing.

    Args:
        im (PIL.Image):
        threshold (float):
        zoom (float): Zoom for background page estimation
        escale (float): Scale for estimating a mask over the text region
        border (float): Ignore this much of the border
        perc (int): Percentage for filters
        range (int): Range for filters
        low (int): Percentile for black estimation
        high (int): Percentile for white estimation

    Returns:
        PIL.Image containing the binarized image
    """
    if im.mode == '1':
        return im
    raw = pil2array(im)
    # rescale image to between -1 or 0 and 1
    raw = raw/np.float(np.iinfo(raw.dtype).max)
    if raw.ndim == 3:
        raw = np.mean(raw, 2)
    # perform image normalization
    if np.amax(raw) == np.amin(raw):
        raise KrakenInputException('Image is empty')
    image = raw-np.amin(raw)
    image /= np.amax(image)

    m = interpolation.zoom(image, zoom)
    m = filters.percentile_filter(m, perc, size=(range, 2))
    m = filters.percentile_filter(m, perc, size=(2, range))
    m = interpolation.zoom(m, 1.0/zoom)
    w, h = np.minimum(np.array(image.shape), np.array(m.shape))
    flat = np.clip(image[:w, :h]-m[:w, :h]+1, 0, 1)

    # estimate low and high thresholds
    d0, d1 = flat.shape
    o0, o1 = int(border*d0), int(border*d1)
    est = flat[o0:d0-o0, o1:d1-o1]
    # by default, we use only regions that contain
    # significant variance; this makes the percentile
    # based low and high estimates more reliable
    v = est-filters.gaussian_filter(est, escale*20.0)
    v = filters.gaussian_filter(v**2, escale*20.0)**0.5
    v = (v > 0.3*np.amax(v))
    v = morphology.binary_dilation(v, structure=np.ones((escale*50, 1)))
    v = morphology.binary_dilation(v, structure=np.ones((1, escale*50)))
    est = est[v]
    lo = np.percentile(est.ravel(), low)
    hi = np.percentile(est.ravel(), high)

    flat -= lo
    flat /= (hi-lo)
    flat = np.clip(flat, 0, 1)
    bin = np.array(255*(flat > threshold), 'B')
    return array2pil(bin)
Example #5
0
 def get_observability_map(self, x, y, threshold=40, filter_sigma=3, max_pxval=180):
     """
     Returns an observability map (an image of the sky)
     
     :param x: x coordinates of detected stars
     :param y: y coordinates of detected stars
     :param threshold: distance threshold in px of stars such that we have observations
     :param filter_sigma: sigma of the Gaussian kernel, default=2 
     :param max_pxval: px value above which the visibility is considered to be 0, default=170
     
     :return: an observability map with the same dimension as the input image.
     """
     logger.debug("Creating an observability map...")
     observability = copy.copy(self.im_masked) * 0.
     
     if len(x) > 0:
         notnans = np.where(np.isnan(self.im_masked) == False)
         notnans = list(zip(notnans[0], notnans[1]))
         pts = np.array([x,y]).T
         tree = cKDTree(pts)    
         for nx, ny in notnans:
             obs = len(tree.query_ball_point((ny,nx), threshold))
             if obs > 2 : observability[nx,ny] = 1. 
             elif obs >= 1 : observability[nx,ny] = 0.5
         observability[filters.gaussian_filter(np.nan_to_num(self.im_masked), 10) > max_pxval] = 0
         observability = filters.gaussian_filter(observability, filter_sigma)
     
     self.observability_map = observability.T
     return observability
Example #6
0
def gkern2(kern_shape, sigma, show_image=False):
    """Returns a 2D Gaussian kernel array. 
    size is kernlen, gaussian is centered 
    in the middle and std is 'nsig' units"""

    # create nxn zeros
    inp = np.zeros((kern_shape[0], kern_shape[0]))
    # set element at the middle to one, a dirac delta
    inp[kern_shape[0]//2, kern_shape[1]//2] = 1
    # gaussian-smooth the dirac, resulting in a gaussian filter mask
    aux =  fi.gaussian_filter(inp, sigma[0]/2)
    aux*=aux
    aux = aux/np.max(aux)
    aux1 = aux[:,kern_shape[0]//2]
    aux =  fi.gaussian_filter(inp, sigma[1]/2)
    aux = aux/np.max(aux)
    aux2 = aux[kern_shape[0]//2,:]
    #print np.max(aux)
    aux = sg.convolve(aux1.reshape(1,kern_shape[0]),aux2.reshape(kern_shape[0],1))
    
    #aux[aux<0.1]=0
    print aux.shape
    print "Remember to always check how is the kernel!!!"
    if show_image:
        plt.imshow(aux)
        plt.show()
    return aux
Example #7
0
def toneMap(im, targetBase=100, detailAmp=3, useBila=False, maxLum = .99):
    lum, chrom = lumiChromi(im)
    h,w = im.shape[0:2]
    min = numpy.min(lum[lum>0])
    assert min>0 and targetBase>0
    
    lum[lum<=0] = min
    lum_log = numpy.log10(lum)
    sigmaS = getSigma(im)
    
    if useBila:
        sigmaR = .4
        bila = bilaGrid(lum_log[:,:,0], sigmaS, sigmaR)
        base = bila.doit(lum_log)
    else:
        base = numpy.zeros((h,w,3))
        gaussian_filter(lum_log, [sigmaS, sigmaS, 0], output=base)
        
    detail = lum_log - base  
    large_range = numpy.max(base)-numpy.min(base)
    
    scaled_base = (log10(targetBase)/large_range)*(base - numpy.max(base))
    
    log_lum = detail*detailAmp + scaled_base
    
    lum = numpy.power(log_lum, 10)
    return lum*chrom
    def set_filters(self):

        # create filters
        self.filters_conv = self.get_random_filtersconv(self.n_filters)
        # self.fbstochastic = self.get_stochastic_filters(self.n_filters)

        self.filters_norm = []
        self.filters_pooling = []

        aux = np.zeros(self.shape_norm[0])
        aux[(aux.shape[0] - 1) / 2, (aux.shape[1] - 1) / 2] = 1
        gf = gaussian_filter(aux, sigma=1).astype(np.float32)

        # gf.shape = gf.shape+(1,1)
        # self.filters_norm.append(gf)
        for n_layer in range(len(self.n_filters)):
            aux = np.zeros(self.shape_norm[n_layer])
            aux[(aux.shape[0] - 1) / 2, (aux.shape[1] - 1) / 2] = 1
            gf = gaussian_filter(aux, sigma=1).astype(np.float32)
            gf.shape = gf.shape + (1,)
            gf = np.repeat(gf, self.n_filters[n_layer], axis=2)
            # gf = np.repeat(gf,self.n_filters[n_layer],axis=3)
            self.filters_norm.append(gf)
            self.filters_pooling.append(np.ones(self.shape_pool[n_layer], dtype=np.float32))

        self.n_layers = len(self.n_filters)
Example #9
0
	def our_track_points(self):
		if self.features != []:
			self.step() #move to the next frame - surprising too eh!

		#load the images and create grayscale
		self.image = cv2.imread(self.imnames[self.current_frame])
		self.gray = cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)

		#reshape to fit input format
		tmp = float32(self.features).reshape(-1, 1, 2)
		tmpf = []

		tmpf=[]
		ims1 = filters.gaussian_filter(self.prev_gray,self.sigma)
		ims2 = filters.gaussian_filter(self.gray,self.sigma)
		for elem in tmp:
			inner = []
			inner = self.lk(ims1,ims2,elem[0][0],elem[0][1],winsize)
			tmpf.append(inner)

		tmp = array(tmp).reshape((-1,2))
		for i,f in enumerate(tmp):
			self.tracks[i].append(f)
		
		for i in range(len(tmpf)):
			self.features[i][0] = tmp[i][0]+tmpf[i][0]
			self.features[i][1] = tmp[i][1]+tmpf[i][1]

		self.prev_gray = self.gray
    def propagateBelief(self):
        delta_t = rospy.get_time() - self.t_last_update

        d_t = self.d + self.v_current*delta_t*np.sin(self.phi)
        phi_t = self.phi + self.w_current*delta_t

        p_beliefRV = np.zeros(self.beliefRV.shape)

        for i in range(self.beliefRV.shape[0]):
            for j in range(self.beliefRV.shape[1]):
                if self.beliefRV[i,j] > 0:
                    if d_t[i,j] > self.d_max or d_t[i,j] < self.d_min or phi_t[i,j] < self.phi_min or phi_t[i,j] > self.phi_max:
                        continue
                    i_new = floor((d_t[i,j] - self.d_min)/self.delta_d)
                    j_new = floor((phi_t[i,j] - self.phi_min)/self.delta_phi)
                    p_beliefRV[i_new,j_new] += self.beliefRV[i,j]

        s_beliefRV = np.zeros(self.beliefRV.shape)
        gaussian_filter(100*p_beliefRV, self.cov_mask, output=s_beliefRV, mode='constant')

        if np.sum(s_beliefRV) == 0:
            return
        self.beliefRV = s_beliefRV/np.sum(s_beliefRV)

    	#bridge = CvBridge()
        #prop_img = bridge.cv2_to_imgmsg((255*self.beliefRV).astype('uint8'), "mono8")
        #self.pub_prop_img.publish(prop_img)
                
        return
Example #11
0
def gaussian_blur(infile, outfile, sigma):
    from scipy.ndimage.filters import gaussian_filter
    if type(sigma) is str:
        sigma = ast.literal_eval(sigma)
    in_nii = nib.load(infile)

    in_arr = in_nii.get_data()
    out_arr = np.zeros_like(in_arr)
    if len(in_arr.shape) == 5:
        assert in_arr.shape[3] == 1
        assert in_arr.shape[4] == 3
        # Warp: blur x,y,z separately
        for i in xrange(3):
            gaussian_filter(
                    in_arr[:,:,:,0,i],
                    sigma=sigma,
                    output=out_arr[:,:,:,0,i])
    elif len(in_arr.shape) == 3:
            gaussian_filter(
                    in_arr[:,:,:],
                    sigma=sigma,
                    output=out_arr[:,:,:])

    out_nii = nib.Nifti1Image(out_arr, header=in_nii.get_header(), affine=in_nii.get_affine())
    out_nii.to_filename(outfile)
Example #12
0
def compute_colseps_conv(binary, scale=1.0, minheight=10, maxcolseps=2):
    """Find column separators by convolution and thresholding.

    Args:
        binary (numpy.array):
        scale (float):
        minheight (int):
        maxcolseps (int):

    Returns:
        Separators
    """

    h, w = binary.shape
    # find vertical whitespace by thresholding
    smoothed = gaussian_filter(1.0*binary, (scale, scale*0.5))
    smoothed = uniform_filter(smoothed, (5.0*scale, 1))
    thresh = (smoothed < np.amax(smoothed)*0.1)
    # find column edges by filtering
    grad = gaussian_filter(1.0*binary, (scale, scale*0.5), order=(0, 1))
    grad = uniform_filter(grad, (10.0*scale, 1))
    grad = (grad > 0.5*np.amax(grad))
    # combine edges and whitespace
    seps = np.minimum(thresh, maximum_filter(grad, (int(scale), int(5*scale))))
    seps = maximum_filter(seps, (int(2*scale), 1))
    # select only the biggest column separators
    seps = morph.select_regions(seps, sl.dim0, min=minheight*scale,
                                nbest=maxcolseps+1)
    return seps
Example #13
0
def ingaramo_deconvolve(n_iterations=100):
    pass

    print "Deconvolving noisy object..."

    for i in range(n_iterations):
        print " Iteration", i

        for t in range(num_timepoints):
            #
            # Take the estimated true image and apply the PSF
            #
            blurred_estimate[t, :, :] = gaussian_filter(signal_range[t] * estimate, sigma=sigma_range[t])
        #
        # Compute correction factor
        #
        correction_factor = np.divide(measurement, blurred_estimate)

        print " Blurring correction ratio..."
        for t in range(num_timepoints):
            #
            # Update the correction factor
            #
            correction_factor[t, :, :] = gaussian_filter(signal_range[t] * correction_factor[t, :, :], sigma=sigma_range[t])

        estimate = np.multiply(estimate, correction_factor.mean(axis=0))

        # Save the evolution of the estimate
        estimate_history[i+1, :, :] = estimate


    print "Done deconvolving"
def detect_features(image):
	"""
	Computer Vision 600.461/661 Assignment 2
	Args:
		image (numpy.ndarray): The input image to detect features on. Note: this is NOT the image name or image path.
	Returns:
		pixel_coords (list of tuples): A list of (row,col) tuples of detected feature locations in the image
	"""

	harris_threshold = 0.5

	sobel_vertical_kernel = [[-1, 0, 1],
                         [-2, 0, 2],
                         [-1, 0, 1]
                        ]

	sobel_horizontal_kernel = np.rot90(sobel_vertical_kernel)

	I_x = convolve2d(image, sobel_vertical_kernel, mode='same', boundary='symm')
	I_y = convolve2d(image, sobel_horizontal_kernel, mode='same', boundary='symm')

	I_xx = I_x * I_x
	I_yy = I_y * I_y
	I_xy = I_x * I_y

	I_xx = gaussian_filter(I_xx, 3)
	I_yy = gaussian_filter(I_yy, 3)
	I_xy = gaussian_filter(I_xy, 3)

	R = (I_xx * I_yy - I_xy**2) - K*(I_xx + I_yy)**2

	corners = nonmaxsuppts(R, 5, harris_threshold)

	return corners
Example #15
0
    def loadImage(self, fname):
        self._imageFilename = fname
        self.templateBox((0,0,0,0))
        self._boxes = []
        self._currentBox = None
        logging.info("Load image %s" % fname)

        self._image = array(Image.open(fname).convert('L'), dtype='f')/255
        (h,w) = shape(self._image)
        self._imageSize = (w,h)
        im1 = filters.gaussian_filter(self._image, 2)
        im2 = filters.gaussian_filter(self._image, 3)
        im4 = filters.gaussian_filter(self._image, 4)
        im8 = filters.gaussian_filter(self._image, 5)

        features = []
        features.append(im1)
        features.append(im2)
        features.append(im4)
        features.append(im8)
        features.append(filters.gaussian_laplace(self._image, 2))
        features.append(filters.gaussian_laplace(self._image, 3))
        features.append(filters.gaussian_laplace(self._image, 4))
        features.append(filters.gaussian_laplace(self._image, 5))
        features.append(filters.sobel(im4, 0))
        features.append(filters.sobel(im8, 0))
        features.append(filters.sobel(im4, 1))
        features.append(filters.sobel(im8, 1))
        self._features = dstack(features)
def elastic_distortion(ex, size=28, alpha=8, sigma=3):

	Xdis = np.random.uniform(-1,1,(size*size)).reshape((size,size))
	Ydis = np.random.uniform(-1,1,(size*size)).reshape((size,size))

	Xdis = gaussian_filter(Xdis, sigma=sigma, mode="constant")
	Ydis = gaussian_filter(Ydis, sigma=sigma, mode="constant")
	Xdis = (Xdis/ np.linalg.norm(Xdis)) * alpha
	Ydis = (Ydis/ np.linalg.norm(Ydis)) * alpha
	ex_new = np.zeros((size,size))
	k=0
	for i in range(size):
		for j in range(size):
			s=0
			xp, scale_x = divmod(Xdis[i, j] + i, 1)
			yp, scale_y = divmod(Ydis[i, j] +j,1)
			xp, yp = int(xp), int(yp)
			try:
				ex_yp_xp=ex[yp,xp] 
			except Exception, e:
				ex_yp_xp = 0
				s += 1
			try:
				ex_yp_xp1 = ex[yp, xp+ 1]
			except Exception, e:
				ex_yp_xp1 = 0
				s += 1
			try:
			 	ex_yp1_xp1 = ex[yp+1, xp+ 1]
			except Exception, e:
				ex_yp1_xp1 = 0
				s += 1
def chi_profs(bulge_prof, disk_prof, mask, weight, resid, hrad, 
              smoothed = False, smooth_scale = 2.0):
    galprof = bulge_prof + disk_prof
    if smoothed:
        resid = filters.gaussian_filter(resid**2, smooth_scale)
        weight = filters.gaussian_filter(weight**2, smooth_scale)
    else:
        resid = resid**2
        weight = weight**2

        
    new_mask = np.where(galprof > np.max(galprof)/100.0, 1,0)    
    galprof = image_info(galprof, mask=new_mask)
    profile = image_info(resid/weight, mask = mask, x_ctr = galprof.x_ctr, y_ctr = galprof.y_ctr, ell = galprof.ba, pa= galprof.pa, zoom =-1 )
    profile.profile()

    rads = np.array(profile.rads)*0.396/hrad
    profs = np.array(profile.prof)
    cum_profs = np.array(profile.aperflux)/np.array(profile.included_pix)
    
    cum_profs = np.extract(rads>0, cum_profs)
    profs = np.extract(rads>0, profs)
    rads = np.extract(rads>0, rads)

    x = np.arange(0.1, 4.0,0.1)
    s = interp.InterpolatedUnivariateSpline(rads,cum_profs)
    ynew = s(x)
    
    return x, ynew 
Example #18
0
def plane_sweep_gauss(im_l, im_r, start, steps, wid):
  '''Find disparity image using normalized cross-correlation with Gaussian
  weighted neighborhoods.'''

  m, n = im_l.shape  # Must match im_r.shape.

  mean_l = numpy.zeros(im_l.shape)
  mean_r = numpy.zeros(im_l.shape)
  s = numpy.zeros(im_l.shape)
  s_l = numpy.zeros(im_l.shape)
  s_r = numpy.zeros(im_l.shape)

  dmaps = numpy.zeros((m, n, steps))

  filters.gaussian_filter(im_l, wid, 0, mean_l)
  filters.gaussian_filter(im_r, wid, 0, mean_r)

  norm_l = im_l - mean_l
  norm_r = im_r - mean_r

  for disp in range(steps):
    filters.gaussian_filter(numpy.roll(norm_l, -disp - start) *
                            norm_r, wid, 0, s)
    filters.gaussian_filter(numpy.roll(norm_l, -disp - start) *
                            numpy.roll(norm_l, -disp - start), wid, 0, s_l)
    filters.gaussian_filter(norm_r * norm_r, wid, 0, s_r)

    dmaps[:, :, disp] = s / numpy.sqrt(s_l * s_r)

  return numpy.argmax(dmaps, axis=2)
Example #19
0
    def change_resolution(self, resolution, sigma, order=1):
        """
        change image's resolution

        Parameters
        ----------
        resolution : int
            how much to magnify
            if resolution is 2, the shape of the image will be halved
        sigma : float
            standard deviation of gaussian filter for smoothing
        order : int
            order of interpolation

        Returns
        -------
        img : ScalarImage
            zoomed scalar image
        """
        if resolution != 1:
            blurred_data = gaussian_filter(self.data, sigma)
            ratio = [1 / float(resolution)] * self.ndim
            data = zoom(blurred_data, ratio, order=order)
        elif resolution == 1:
            data = gaussian_filter(self.data, sigma)
        img = ScalarImage(data=data)
        return img
Example #20
0
def elastic_transform(image, alpha, sigma, alpha_affine, random_state=None):
    """Elastic deformation of images as described in [Simard2003]_ (with modifications).
    .. [Simard2003] Simard, Steinkraus and Platt, "Best Practices for
         Convolutional Neural Networks applied to Visual Document Analysis", in
         Proc. of the International Conference on Document Analysis and
         Recognition, 2003.

     Based on https://gist.github.com/erniejunior/601cdf56d2b424757de5
    """
    if random_state is None:
        random_state = np.random.RandomState(None)

    shape = image.shape
    shape_size = shape[:2]
    
    # Random affine
    center_square = np.float32(shape_size) // 2
    square_size = min(shape_size) // 3
    pts1 = np.float32([center_square + square_size, [center_square[0]+square_size, center_square[1]-square_size], center_square - square_size])
    pts2 = pts1 + random_state.uniform(-alpha_affine, alpha_affine, size=pts1.shape).astype(np.float32)
    M = cv2.getAffineTransform(pts1, pts2)
    image = cv2.warpAffine(image, M, shape_size[::-1], borderMode=cv2.BORDER_REFLECT_101)

    dx = gaussian_filter((random_state.rand(*shape) * 2 - 1), sigma) * alpha
    dy = gaussian_filter((random_state.rand(*shape) * 2 - 1), sigma) * alpha
    dz = np.zeros_like(dx)

    x, y, z = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]), np.arange(shape[2]))
    indices = np.reshape(y+dy, (-1, 1)), np.reshape(x+dx, (-1, 1)), np.reshape(z, (-1, 1))

    return map_coordinates(image, indices, order=1, mode='reflect').reshape(shape)
Example #21
0
def elastic_transform(image, gt, alpha, sigma, random_state=None):
    """
    :param image: image
    :param gt: ground truth
    :param alpha: deformation coefficient (high alpha -> strong deformation)
    :param sigma: std of the gaussian filter. (high sigma -> smooth deformation)
    :param random_state:
    :return: deformation of the pair [image,mask]
    """

    if random_state is None:
        random_state = np.random.RandomState(None)

    shape = image.shape

    d = 4
    sub_shape = (shape[0]/d, shape[0]/d)

    deformations_x = random_state.rand(*sub_shape) * 2 - 1
    deformations_y = random_state.rand(*sub_shape) * 2 - 1

    deformations_x = np.repeat(np.repeat(deformations_x, d, axis=1), d, axis = 0)
    deformations_y = np.repeat(np.repeat(deformations_y, d, axis=1), d, axis = 0)

    dx = gaussian_filter(deformations_x, sigma, mode="constant", cval=0) * alpha
    dy = gaussian_filter(deformations_y, sigma, mode="constant", cval=0) * alpha

    x, y = np.meshgrid(np.arange(shape[0]), np.arange(shape[1]))
    indices = np.reshape(y+dy, (-1, 1)), np.reshape(x+dx, (-1, 1))

    elastic_image = map_coordinates(image, indices, order=1).reshape(shape)
    elastic_gt = map_coordinates(gt, indices, order=1).reshape(shape)
    elastic_gt = preprocessing.binarize(np.array(elastic_gt), threshold=0.5)

    return [elastic_image, elastic_gt]
Example #22
0
	def generateData(self):
		image = self.getInput(0).getData()
		
		image = image.astype(numpy.float32)
	
		# compute derivatives in x
		Ix = filters.gaussian_filter1d(image, self.sigmaD, 0, 0)
		Ix = filters.gaussian_filter1d(Ix, self.sigmaD, 1, 1)
	
		# compute derivatives in y
		Iy = filters.gaussian_filter1d(image, self.sigmaD, 1, 0)
		Iy = filters.gaussian_filter1d(Iy, self.sigmaD, 0, 1)
	
		# compute components of the structure tensor
		# 2nd derivative in x
		Ixx = filters.gaussian_filter(Ix**2, self.sigmaI, 0)
		# 2nd derivative in y
		Iyy = filters.gaussian_filter(Iy**2, self.sigmaI, 0)
		# IxIy
		Ixy = filters.gaussian_filter(Ix * Iy, self.sigmaI, 0)
		
		self.getOutput(0).setData(Ix)
		self.getOutput(1).setData(Iy)
		self.getOutput(2).setData(Ixx)
		self.getOutput(3).setData(Iyy)
		self.getOutput(4).setData(Ixy)
Example #23
0
	def svm(self):
		img = self.training_set[0]
		img.image_data = gaussian_filter(img.image_data, 15)
		# img_average = numpy.average(img.image_data)
		training_set = self.generate_feature(img)
		img = self.training_set[1]
		img.image_data = gaussian_filter(img.image_data, 15)
		test_set = self.generate_feature(img)

		pca = PCA(n_components = 20)
		pca.fit([item[0] for item in training_set]+[item[0] for item in test_set])
		pca_training = pca.transform([item[0] for item in training_set])
		# for img in training_set:
		# 	print_image(img[0].reshape(2*self.MAT_SIZE[0]+1,2*self.MAT_SIZE[1]+1), '{}_fig_{}_{}.png'.format(img[1], img[2][0], img[2][1]))
		# training_set = training_set.map(lambda x: (x[0]-img_average, x[1]))
		model = svm.SVC()
		# model = tree.DecisionTreeClassifier()
		model.fit(pca_training,numpy.array([item[1] for item in training_set]))

		training_result = model.predict(pca_training)
		hit = 0
		for index, tag in enumerate(training_result):
			if tag == training_set[index][1]:
				hit += 1
		print(float(hit) / float(len(training_set)))

		pca_test = pca.transform([item[0] for item in test_set])
		# test_set = test_set.map(lambda x: (x[0]-img_average, x[1]))
		predicted = model.predict(pca_test)

		hit = 0
		for index, tag in enumerate(predicted):
			if tag == test_set[index][1]:
				hit += 1
		print(float(hit) / float(len(test_set)))
def computeCurvature(xPos, yPos, time, sigmaVal):
    from scipy.ndimage.filters import gaussian_filter

    nPts = len(xPos)

    # Compute first and second derivatives of x and y w.r.t. to t
    dxdt = np.zeros(nPts)
    dydt = np.zeros(nPts)

    # Smooth position and partial derivatives with gaussian kernel before taking numerical derivative
    sigma = sigmaVal
    x_filt = gaussian_filter(xPos, sigma, mode='reflect')
    y_filt = gaussian_filter(yPos, sigma, mode='reflect')

    dxdt[1:] = np.diff(x_filt)/np.diff(time)
    dydt[1:] = np.diff(y_filt)/np.diff(time)

    ddxdt = np.zeros(nPts)
    ddydt = np.zeros(nPts)

    sigma = sigmaVal
    dxdt_filt = gaussian_filter(dxdt, sigma, mode='reflect')
    dydt_filt = gaussian_filter(dydt, sigma, mode='reflect')

    ddxdt[1:] = np.diff(dxdt_filt)/np.diff(time)
    ddydt[1:] = np.diff(dydt_filt)/np.diff(time)

    # Compute and return curvature
    curvature = (dxdt*ddydt - dydt*ddxdt) / (dxdt*dxdt + dydt*dydt)**(3.0/2.0)

    return curvature
def polarCurvature(theta, objdist):

    from scipy.ndimage.filters import gaussian_filter

    # unwrap theta before taking derivatives
    # thetaU = np.copy(theta)
    # thetaU[~np.isnan(theta)] = np.unwrap(theta[~np.isnan(theta)],discont=np.pi)

    # first derivatives of the distance and angle
    d_theta = np.hstack((0, np.diff(theta)))
    d_theta[d_theta > np.pi] -= 2*np.pi
    d_theta[d_theta <= -np.pi] += 2*np.pi
    d_theta[np.where(np.isnan(d_theta))[0]] = 0

    # filter derivatives
    sigma = 2
    d_theta_filt = gaussian_filter(d_theta, sigma, mode='reflect')

    d_objdist = np.hstack((0, np.diff(objdist)))/d_theta_filt

    d_objdist_filt = gaussian_filter(d_objdist, sigma, mode='reflect')

    # second derivative
    dd_objdist = np.hstack((0, np.diff(d_objdist_filt)))/d_theta_filt

    # compute curvature
    polarCurv = (objdist**2 + 2*(d_objdist**2) - objdist*dd_objdist)/(np.sqrt(objdist**2 + d_objdist**2)**3)

    return polarCurv, d_theta, d_objdist
    def generateData(self):
        inpt = self.getInput().getData().astype(numpy.float32)

        gI1 = filters.gaussian_filter(inpt, 1.2, 0)
        gI2 = filters.gaussian_filter(inpt, 2.0, 0)
        output = gI2 - gI1
        self.getOutput().setData(output)
def smoothGeometry(landFraction, floatingFraction, bed, draft, filterSigma):
  import scipy.ndimage.filters as filters

  # Smoothing is performed using only the topography in the portion of the grid that is ocean.
  # This prevents the kink in the ice draft across the grounding line or regions of bare bedrock
  # from influencing the smoothed topography.  (Parts of the Ross ice shelf near the Trans-Antarctic
  # Mountains are particularly troublesome if topogrpahy is smoothed across the grounding line.)

  # Unlike in POP, the calving front is smoothed as well because MPAS-O does not support a
  # sheer calving face

  threshold = 0.01 # we won't normalize bed topography or ice draft where the mask is below this threshold

  oceanFraction = 1. - landFraction
  smoothedMask = filters.gaussian_filter(oceanFraction,filterSigma,mode='constant',cval=0.)
  mask = smoothedMask > threshold

  draft = filters.gaussian_filter(draft*oceanFraction,filterSigma,mode='constant',cval=0.)
  draft[mask] /= smoothedMask[mask]
  bed = filters.gaussian_filter(bed*oceanFraction,filterSigma,mode='constant',cval=0.)
  bed[mask] /= smoothedMask[mask]

  smoothedDraftMask = filters.gaussian_filter(floatingFraction,filterSigma,mode='constant',cval=0.)
  smoothedDraftMask[mask] /= smoothedMask[mask]

  return (bed,draft,smoothedDraftMask)
Example #28
0
def smoothen_image(image_obj, sigma):
    image = gaussian_filter(image_obj.image, sigma=sigma, order=0)
    image_obj.image = image

    gray_image = gaussian_filter(image_obj.gray_image, sigma=sigma, order=0)
    image_obj.gray_image = gray_image

    return image_obj
Example #29
0
def gaussian_filter(X, M=8, axis=0):
    """Gaussian filter along the first axis of the feature matrix X."""
    for i in range(X.shape[axis]):
        if axis == 1:
            X[:, i] = filters.gaussian_filter(X[:, i], sigma=M / 2.)
        elif axis == 0:
            X[i, :] = filters.gaussian_filter(X[i, :], sigma=M / 2.)
    return X
def compute_curvature(input_filepath, alpha, beta, method, new_centerlines, compute_original, region_of_interest,
                      region_points):
    """
    Primary collection of methods for computing curvature of a centerline.
    Five methods are currently implemented:
    1) VMTK - Factor variance (vmtkfactor)
    2) VMTK - Iteration variance (vmtkit)
    3) Discrete derivatives (disc)
    4) B-splines (spline)

    Args:
        input_filepath (str): Path to case folder.
        alpha (float): Extension / Compression factor in vertical direction.
        beta (float): Extension / Compression factor in horizontal direction.
        method (str): Method used to compute angle.
        new_centerlines (vtkPolyData): New centerline.
        compute_original (bool): Computes old curvature value if True.
        region_of_interest (str): Method for setting the region of interest ['manual' | 'commandline' | 'landmarking']
        region_points (list): If region_of_interest is 'commandline', this a flatten list of the start and endpoint

    Returns:
        new_maxcurv (float): Maximum curvature within the manipulated region of interest.
    Returns:
        old_maxcurv (float): Maximum curvature within the original region of interest.
    """
    # Input filename
    base_path = get_path_names(input_filepath)

    # Centerline filename
    centerline_path = base_path + "_centerline.vtp"

    # Clean and capp / uncapp surface
    surface, capped_surface = prepare_surface(base_path, input_filepath)

    # Extract old centerline
    if not path.exists(centerline_path):
        # Compute centerlines
        inlet, outlets = get_inlet_and_outlet_centers(surface, base_path)

        print("-- Compute centerlines and Voronoi diagram")
        centerlines, _, _ = compute_centerlines(inlet, outlets, centerline_path, capped_surface, resampling=0.1,
                                                smooth=False, base_path=base_path)
    else:
        centerlines = read_polydata(centerline_path)

    # Get region of interest
    point_path = base_path + "_anterior_bend.particles"
    if region_of_interest == "landmarking":
        if not path.exists(point_path):
            raise RuntimeError(("The given .particles file: %s does not exist. Please run" +
                                " landmarking with automated_landmarking.py first.") % point_path)
        region_points = np.loadtxt(point_path)
    else:
        _, _, _, region_points, _ = get_line_to_change(capped_surface, centerlines,
                                                       region_of_interest, "bend", region_points, 0)
        region_points = [[region_points[3 * i], region_points[3 * i + 1], region_points[3 * i + 2]]
                         for i in range(len(region_points) // 3)]
    p1 = region_points[0]
    p2 = region_points[1]

    if new_centerlines is None:
        print("-- Maniuplating centerline manually")
        centerlines, new_centerlines = get_new_centerlines(centerlines, region_points, alpha, beta, p1, p2)

    # Extract centerline points and ids
    new_centerline = extract_single_line(new_centerlines, 0)
    centerline = extract_single_line(centerlines, 0)
    new_locator = get_vtk_point_locator(new_centerline)
    old_locator = get_vtk_point_locator(centerline)
    id1 = old_locator.FindClosestPoint(p1)
    id2 = old_locator.FindClosestPoint(p2)
    id1_new = new_locator.FindClosestPoint(p1)
    id2_new = new_locator.FindClosestPoint(p2)

    # 1) VMTK - Factor variance
    if method == "vmtkfactor":
        factor = 0.5
        line_fac = vmtk_compute_geometric_features(new_centerline, smooth=True, iterations=100, factor=factor)
        curv_fac = get_point_data_array("Curvature", line_fac)
        new_curvature = gaussian_filter(curv_fac, 5)

        if compute_original:
            line_fac = vmtk_compute_geometric_features(centerline, smooth=True, iterations=100, factor=factor)
            curv_fac = get_point_data_array("Curvature", line_fac)
            curvature = gaussian_filter(curv_fac, 5)

    # 2) VMTK - Iteration variance
    elif method == "vmtkit":
        it = 150
        line_it = vmtk_compute_geometric_features(new_centerline, smooth=True, iterations=it, factor=1.0)
        curv_it = get_point_data_array("Curvature", line_it)
        new_curvature = gaussian_filter(curv_it, 5)

        if compute_original:
            line_it = vmtk_compute_geometric_features(centerline, smooth=True, iterations=it, factor=1.0)
            curv_it = get_point_data_array("Curvature", line_it)
            curvature = gaussian_filter(curv_it, 5)

    # 3) Splines
    elif method == "spline":
        nknots = 50
        _, siphon_curv = compute_splined_centerline(new_centerline, get_curv=True, isline=True, nknots=nknots)
        new_curvature = gaussian_filter(siphon_curv, 5)

        if compute_original:
            _, siphon_curv = compute_splined_centerline(centerline, get_curv=True, isline=True, nknots=nknots)
            curvature = gaussian_filter(siphon_curv, 5)

    # 4) Default: Discrete derivatives
    elif method == "disc":
        neigh = 20
        _, curv_di = compute_discrete_derivatives(new_centerline, neigh=neigh)
        new_curvature = gaussian_filter(curv_di, 5)

        if compute_original:
            _, curv_di = compute_discrete_derivatives(centerline, neigh=neigh)
            curvature = gaussian_filter(curv_di, 5)

    old_maxcurv = max(curvature[id1 + 10:id2 - 10]) if compute_original else None
    new_maxcurv = max(new_curvature[id1_new + 10:id2_new - 10])

    return new_maxcurv, old_maxcurv
Example #31
0
ap.add_argument("-d",
                "--min_distance",
                required=True,
                type=int,
                help="min distance in peak_local_max function")
args = vars(ap.parse_args())

# load the mask image_mask and perform pyramid mean shift filtering
image_mask = cv2.imread(args["image_mask"])

# apply meanshif filering
shifted = cv2.pyrMeanShiftFiltering(image_mask, 21, 51)
shifted_gray = cv2.cvtColor(shifted, cv2.COLOR_BGR2GRAY)

# apply gaussican filtering to smooth the edges
blurred = gaussian_filter(shifted_gray, sigma=args["sigma"])

# convert the mean shift image_mask to grayscale, then apply Otsu's thresholding
mask_output = cv2.threshold(blurred, 0, 255,
                            cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

from skimage import morphology
from skimage.morphology import disk
#from skimage.segmentation import clear_border

# remove artifacts connected to image border
#cleared = mask_output.copy()
#im_bw_cleared = clear_border(cleared)

im_bw_cleared = morphology.remove_small_objects(mask_output, min_size=350)
Example #32
0
    def train_model(self, image_dir, nb_images=50000, nb_epochs=1):
        datagen = ImageDataGenerator(rescale=1. / 255)
        img_width = self.img_width * 4
        img_height = self.img_height * 4

        early_stop = False
        iteration = 0
        prev_improvement = -1

        print("Training SR ResNet network")
        for i in range(nb_epochs):
            print()
            print("Epoch : %d" % (i + 1))

            for x in datagen.flow_from_directory(image_dir,
                                                 class_mode=None,
                                                 batch_size=self.batch_size,
                                                 target_size=(img_width,
                                                              img_height)):

                try:
                    t1 = time.time()

                    # resize images
                    x_temp = x.copy()
                    x_temp = x_temp.transpose((0, 2, 3, 1))

                    x_generator = np.empty(
                        (self.batch_size, self.img_width, self.img_height, 3))

                    for j in range(self.batch_size):
                        img = gaussian_filter(x_temp[j], sigma=0.5)
                        img = imresize(img, (self.img_width, self.img_height))
                        x_generator[j, :, :, :] = img

                    x_generator = x_generator.transpose((0, 3, 1, 2))

                    if iteration % 50 == 0 and iteration != 0:
                        print("Random Validation image..")
                        output_image_batch = self.model.predict_on_batch(
                            x_generator)

                        average_psnr = 0.0
                        for x_i in range(self.batch_size):
                            average_psnr += psnr(
                                x[x_i],
                                np.clip(output_image_batch[x_i] * 255, 0, 255)
                                / 255.)

                        average_psnr /= self.batch_size

                        iteration += self.batch_size
                        t2 = time.time()

                        print(
                            "Time required : %0.2f. Average validation PSNR over %d samples = %0.2f"
                            % (t2 - t1, self.batch_size, average_psnr))

                        for x_i in range(self.batch_size):
                            real_path = base_val_images_path + "epoch_%d_iteration_%d_num_%d_real_.png" % \
                                                               (i + 1, iteration, x_i + 1)

                            generated_path = base_val_images_path + \
                                             "epoch_%d_iteration_%d_num_%d_generated.png" % (i + 1,
                                                                                            iteration,
                                                                                            x_i + 1)

                            val_x = x[x_i].copy() * 255.
                            val_x = val_x.transpose((1, 2, 0))
                            val_x = np.clip(val_x, 0, 255).astype('uint8')

                            output_image = output_image_batch[x_i] * 255
                            output_image = output_image.transpose((1, 2, 0))
                            output_image = np.clip(output_image, 0,
                                                   255).astype('uint8')

                            imsave(real_path, val_x)
                            imsave(generated_path, output_image)
                        '''
                        Don't train of validation images for now.

                        Note that if nb_epochs > 1, there is a chance that
                        validation images may be used for training purposes as well.

                        In that case, this isn't strictly a validation measure, instead of
                        just a check to see what the network has learned.
                        '''
                        continue

                    hist = self.model.fit(x_generator,
                                          x,
                                          batch_size=self.batch_size,
                                          nb_epoch=1,
                                          verbose=0)
                    psnr_loss_val = hist.history['PSNRLoss'][0]

                    if prev_improvement == -1:
                        prev_improvement = psnr_loss_val

                    improvement = (prev_improvement -
                                   psnr_loss_val) / prev_improvement * 100
                    prev_improvement = psnr_loss_val

                    iteration += self.batch_size
                    t2 = time.time()

                    print(
                        "Iter : %d / %d | Improvement : %0.2f percent | Time required : %0.2f seconds | "
                        "PSNR : %0.3f" % (iteration, nb_images, improvement,
                                          t2 - t1, psnr_loss_val))

                    if iteration % 1000 == 0 and iteration != 0:
                        self.model.save_weights(self.weights_path,
                                                overwrite=True)

                    if iteration >= nb_images:
                        break

                except KeyboardInterrupt:
                    print("Keyboard interrupt detected. Stopping early.")
                    early_stop = True
                    break

            iteration = 0

            if early_stop:
                break

        print("Finished training SRGAN network. Saving model weights.")
Example #33
0
def get_finding_chart(
    source_ra,
    source_dec,
    source_name,
    image_source='desi',
    output_format='pdf',
    imsize=3.0,
    tick_offset=0.02,
    tick_length=0.03,
    fallback_image_source='dss',
    **offset_star_kwargs,
):
    """Create a finder chart suitable for spectroscopic observations of
       the source

    Parameters
    ----------
    source_ra : float
        Right ascension (J2000) of the source
    source_dec : float
        Declination (J2000) of the source
    source_name : str
        Name of the source
    image_source : {'desi', 'dss', 'ztfref'}, optional
        Survey where the image comes from "desi", "dss", "ztfref"
        (more to be added)
    output_format : str, optional
        "pdf" of "png" -- determines the format of the returned finder
    imsize : float, optional
        Requested image size (on a size) in arcmin. Should be between 2-15.
    tick_offset : float, optional
        How far off the each source should the tick mark be made? (in arcsec)
    tick_length : float, optional
        How long should the tick mark be made? (in arcsec)
    fallback_image_source : str, optional
        Where what `image_source` should we fall back to if the
        one requested fails
    **offset_star_kwargs : dict, optional
        Other parameters passed to `get_nearby_offset_stars`

    Returns
    -------
    dict
        success : bool
            Whether the request was successful or not, returning
            a sensible error in 'reason'
        name : str
            suggested filename based on `source_name` and `output_format`
        data : str
            binary encoded data for the image (to be streamed)
        reason : str
            If not successful, a reason is returned.
    """
    if (imsize < 2.0) or (imsize > 15):
        return {
            'success': False,
            'reason': 'Requested `imsize` out of range',
            'data': '',
            'name': '',
        }

    if image_source not in source_image_parameters:
        return {
            'success': False,
            'reason': f'image source {image_source} not in list',
            'data': '',
            'name': '',
        }

    matplotlib.use("Agg")
    fig = plt.figure(figsize=(11, 8.5), constrained_layout=False)
    widths = [2.6, 1]
    heights = [2.6, 1]
    spec = fig.add_gridspec(
        ncols=2,
        nrows=2,
        width_ratios=widths,
        height_ratios=heights,
        left=0.05,
        right=0.95,
    )

    # how wide on the side will the image be? 256 as default
    npixels = source_image_parameters[image_source].get("npixels", 256)
    # set the pixelscale in arcsec (typically about 1 arcsec/pixel)
    pixscale = 60 * imsize / npixels

    hdu = fits_image(source_ra,
                     source_dec,
                     imsize=imsize,
                     image_source=image_source)

    # skeleton WCS - this is the field that the user requested
    wcs = WCS(naxis=2)

    # set the headers of the WCS.
    # The center of the image is the reference point (source_ra, source_dec):
    wcs.wcs.crpix = [npixels / 2, npixels / 2]
    wcs.wcs.crval = [source_ra, source_dec]

    # create the pixel scale and orientation North up, East left
    # pixelscale is in degrees, established in the tangent plane
    # to the reference point
    wcs.wcs.cd = np.array([[-pixscale / 3600, 0], [0, pixscale / 3600]])
    wcs.wcs.ctype = ["RA---TAN", "DEC--TAN"]

    if hdu is not None:
        im = hdu.data

        # replace the nans with medians
        im[np.isnan(im)] = np.nanmedian(im)
        if source_image_parameters[image_source].get("reproject", False):
            # project image to the skeleton WCS solution
            log("Reprojecting image to requested position and orientation")
            im, _ = reproject_adaptive(hdu, wcs, shape_out=(npixels, npixels))
        else:
            wcs = WCS(hdu.header)

        if source_image_parameters[image_source].get("smooth", False):
            im = gaussian_filter(
                hdu.data,
                source_image_parameters[image_source]["smooth"] / pixscale)

        norm = ImageNormalize(im, interval=ZScaleInterval())
        watermark = source_image_parameters[image_source]["str"]

    else:
        # if we got back a blank image, try to fallback on another survey
        # and return the results from that call
        if fallback_image_source is not None:
            if fallback_image_source != image_source:
                log(f"Falling back on image source {fallback_image_source}")
                return get_finding_chart(
                    source_ra,
                    source_dec,
                    source_name,
                    image_source=fallback_image_source,
                    output_format=output_format,
                    imsize=imsize,
                    tick_offset=tick_offset,
                    tick_length=tick_length,
                    fallback_image_source=None,
                    **offset_star_kwargs,
                )

        # we dont have an image here, so let's create a dummy one
        # so we can still plot
        im = np.zeros((npixels, npixels))
        norm = None
        watermark = None

    # add the images in the top left corner
    ax = fig.add_subplot(spec[0, 0], projection=wcs)
    ax_text = fig.add_subplot(spec[0, 1])
    ax_text.axis('off')
    ax_starlist = fig.add_subplot(spec[1, 0:])
    ax_starlist.axis('off')

    ax.imshow(im, origin='lower', norm=norm, cmap='gray_r')
    ax.set_autoscale_on(False)
    ax.grid(color='white', ls='dotted')
    ax.set_xlabel(r'$\alpha$ (J2000)', fontsize='large')
    ax.set_ylabel(r'$\delta$ (J2000)', fontsize='large')
    obstime = offset_star_kwargs.get("obstime",
                                     datetime.datetime.utcnow().isoformat())
    ax.set_title(f'{source_name} Finder ({obstime})',
                 fontsize='large',
                 fontweight='bold')

    star_list, _, _, _ = get_nearby_offset_stars(source_ra, source_dec,
                                                 source_name,
                                                 **offset_star_kwargs)

    if not isinstance(star_list, list) or len(star_list) == 0:
        return {
            'success': False,
            'reason': 'failure to get star list',
            'data': '',
            'name': '',
        }

    ncolors = len(star_list)
    colors = sns.color_palette("colorblind", ncolors)

    start_text = [-0.35, 0.99]
    starlist_str = (
        "# Note: spacing in starlist many not copy/paste correctly in PDF\n" +
        f"#       you can get starlist directly from" +
        f" /api/sources/{source_name}/offsets?" +
        f"facility={offset_star_kwargs.get('facility', 'Keck')}\n" +
        "\n".join([x["str"] for x in star_list]))

    # add the starlist
    ax_starlist.text(
        0,
        0.50,
        starlist_str,
        fontsize="x-small",
        family='monospace',
        transform=ax_starlist.transAxes,
    )

    # add the watermark for the survey
    props = dict(boxstyle='round', facecolor='gray', alpha=0.5)

    if watermark is not None:
        ax.text(
            0.035,
            0.035,
            watermark,
            horizontalalignment='left',
            verticalalignment='center',
            transform=ax.transAxes,
            fontsize='medium',
            fontweight='bold',
            color="yellow",
            alpha=0.5,
            bbox=props,
        )

    ax.text(
        0.95,
        0.035,
        f"{imsize}\u2032 \u00D7 {imsize}\u2032",  # size'x size'
        horizontalalignment='right',
        verticalalignment='center',
        transform=ax.transAxes,
        fontsize='medium',
        fontweight='bold',
        color="yellow",
        alpha=0.5,
        bbox=props,
    )

    # compass rose
    # rose_center_pixel = ax.transAxes.transform((0.04, 0.95))
    rose_center = pixel_to_skycoord(int(npixels * 0.1), int(npixels * 0.9),
                                    wcs)
    props = dict(boxstyle='round', facecolor='gray', alpha=0.5)

    for ang, label, off in [(0, "N", 0.01), (90, "E", 0.03)]:
        position_angle = ang * u.deg
        separation = (0.05 * imsize * 60) * u.arcsec  # 5%
        p2 = rose_center.directional_offset_by(position_angle, separation)
        ax.plot(
            [rose_center.ra.value, p2.ra.value],
            [rose_center.dec.value, p2.dec.value],
            transform=ax.get_transform('world'),
            color="gold",
            linewidth=2,
        )

        # label N and E
        position_angle = (ang + 15) * u.deg
        separation = ((0.05 + off) * imsize * 60) * u.arcsec
        p2 = rose_center.directional_offset_by(position_angle, separation)
        ax.text(
            p2.ra.value,
            p2.dec.value,
            label,
            color="gold",
            transform=ax.get_transform('world'),
            fontsize='large',
            fontweight='bold',
        )

    for i, star in enumerate(star_list):

        c1 = SkyCoord(star["ra"] * u.deg, star["dec"] * u.deg, frame='icrs')

        # mark up the right side of the page with position and offset info
        name_title = star["name"]
        if star.get("mag") is not None:
            name_title += f", mag={star.get('mag'):.2f}"
        ax_text.text(
            start_text[0],
            start_text[1] - i / ncolors,
            name_title,
            ha='left',
            va='top',
            fontsize='large',
            fontweight='bold',
            transform=ax_text.transAxes,
            color=colors[i],
        )
        source_text = f"  {star['ra']:.5f} {star['dec']:.5f}\n"
        source_text += f"  {c1.to_string('hmsdms')}\n"
        if (star.get("dras") is not None) and (star.get("ddecs") is not None):
            source_text += f'  {star.get("dras")} {star.get("ddecs")} to {source_name}'
        ax_text.text(
            start_text[0],
            start_text[1] - i / ncolors - 0.06,
            source_text,
            ha='left',
            va='top',
            fontsize='large',
            transform=ax_text.transAxes,
            color=colors[i],
        )

        # work on making marks where the stars are
        for ang in [0, 90]:
            position_angle = ang * u.deg
            separation = (tick_offset * imsize * 60) * u.arcsec
            p1 = c1.directional_offset_by(position_angle, separation)
            separation = (tick_offset + tick_length) * imsize * 60 * u.arcsec
            p2 = c1.directional_offset_by(position_angle, separation)
            ax.plot(
                [p1.ra.value, p2.ra.value],
                [p1.dec.value, p2.dec.value],
                transform=ax.get_transform('world'),
                color=colors[i],
                linewidth=3 if imsize <= 4 else 2,
            )
        if star["name"].find("_off") != -1:
            # this is an offset star
            text = star["name"].split("_off")[-1]
            position_angle = 14 * u.deg
            separation = (tick_offset +
                          tick_length * 1.6) * imsize * 60 * u.arcsec
            p1 = c1.directional_offset_by(position_angle, separation)
            ax.text(
                p1.ra.value,
                p1.dec.value,
                text,
                color=colors[i],
                transform=ax.get_transform('world'),
                fontsize='large',
                fontweight='bold',
            )

    buf = io.BytesIO()
    fig.savefig(buf, format=output_format)
    buf.seek(0)

    return {
        "success": True,
        "name": f"finder_{source_name}.{output_format}",
        "data": buf.read(),
        "reason": "",
    }
Example #34
0
def LEstr(datafile=None):
    """ Plot streamlines """

    nm = "LE_Stream.LEstr: "

    if datafile == None:
        try:
            datafile = argv[1]
        except IndexError:
            raise IOError(nm + "Need an input file!")

    ## Analysis options
    for i in range(0, len(datafile)):
        if datafile[i] == "b":
            b = float(datafile[i + 1:i + 4])
            break
    for i in range(0, len(datafile)):
        if datafile[i] == "X": j = i
        if datafile[i] == "s" and datafile[i + 1] == "1":
            X = float(datafile[j + 1:i])
            break

    ## Output options
    saveplot = True
    showplot = False
    outfile = os.path.split(datafile)[0] + "/stream_" + os.path.split(
        datafile)[1][0:-4]

    t0 = time.time()
    ## Read eta (yy), xHO (x1) points from file
    yy, x1 = np.loadtxt(datafile, delimiter=" ", skiprows=1)[:, 1:3].T
    print nm + "Reading data", round(time.time() - t0, 1), "seconds"
    coords = zip(x1, yy)

    ## Set up grid of points in x-y
    gridsize = 20
    #x = np.linspace(-2*X,2*X, gridsize);	y = np.linspace(-2*b,2*b, gridsize)
    x = np.linspace(-15, 15, gridsize)
    y = np.linspace(-1.5, 1.5, gridsize)
    xi, yi = np.meshgrid(x, y)
    #print xi;return

    ## Calculate speeds (1D arrays)
    vx1 = np.diff(x1)
    vx1 = np.append(np.array(vx1[0]), vx1)
    vyy = np.diff(yy)
    vyy = np.append(np.array(vyy[0]), vyy)
    vyy /= 100  ## HACK TO RE-SCALE ETA -- MESSY!
    v1 = np.sqrt(vx1**2 + vyy**2)
    del x1, yy

    t0 = time.time()
    ## Interpolate data onto grid
    gvx11 = griddata(coords, vx1, (xi, yi), method='nearest')
    gvyy1 = griddata(coords, vyy, (xi, yi), method='nearest')
    gv1 = griddata(coords, v1, (xi, yi), method='nearest')
    print nm + "Gridding data", round(time.time() - t0, 1), "seconds"
    del coords

    if saveplot or showplot:
        ## Subplots for 1 and 2
        fig, ax1 = plt.subplots(1, 1)
        fig.suptitle(outfile)
        fig.set_facecolor("white")

        ## Smooth data
        smooth = 2
        gvyy1 = gaussian_filter(gvyy1, smooth)
        gvx11 = gaussian_filter(gvx11, smooth)
        gv1 = gaussian_filter(gv1, smooth)
        ## Line widths
        lw1 = 3.0 * gv1 / gv1.max()

        t0 = time.time()
        ## Make plots
        fs = 25
        ax1.contourf(xi, yi, gv1, 4, alpha=0.4)
        ax1.streamplot(x, y, gvx11, gvyy1, linewidth=lw1, cmap=plt.cm.jet)
        #ax1.plot([-X,-X],[-2*b,2*b],"k--",linewidth=2);ax1.plot([X,X],[-2*b,2*b],"k--",linewidth=2)
        ax1.plot([-X, -X], [-1.5, 1.5], "k--", linewidth=2)
        ax1.plot([X, X], [-1.5, 1.5], "k--", linewidth=2)
        ax1.set_xlabel("$x$", fontsize=fs)
        ax1.set_ylabel("$\eta$", fontsize=fs)
        print nm + "Plotting", round(time.time() - t0, 1), "seconds"
        ## NEED: colorbar

        if saveplot:
            fig.savefig(outfile + "TEST.png",
                        facecolor=fig.get_facecolor(),
                        edgecolor="none")
            print nm + "Plot saved", outfile + ".png"
        if showplot:
            plt.show()

    return
Example #35
0
def LoadImage(fname) :
    img = misc.imread(fname, flatten = True) # Grayscale
    img = gaussian_filter(img, 1, mode='nearest')
    img = (img[::-1, :])  / 255.
    img = np.swapaxes(img, 0,1 )
    return tensor( 1 - img )
Example #36
0
xgrid = np.arange(xmin, xmax, xres)
ygrid = np.arange(ymax, ymin, yres)
X, Y = np.meshgrid(xgrid, ygrid)

origin = [gt[0], gt[3]]
ext = GetExtent(gt, cols, rows)

src_srs = osr.SpatialReference()
src_srs.ImportFromWkt(ds.GetProjection())
tgt_srs = src_srs.CloneGeogCS()

geo_ext = ReprojectCoords(ext, src_srs, tgt_srs)

npRaster = gdal.Dataset.ReadAsArray(ds)
blurred = gaussian_filter(npRaster, sigma=4)
rasterFinal = 'C:\\data\\GIS\\blur.tif'
array2raster(rasterFinal, origin, xres, yres, blurred)

ds = None

# create a grid of xy coordinates in the original projection
xy_source = np.mgrid[xmin:xmax + xres:xres, ymax + yres:ymin:yres]

xx, yy = convertXY(xy_source, src_srs, tgt_srs)

# plot the data (first layer)
im1 = plt.pcolormesh(xgrid, ygrid, blurred)

# annotate
#plt.drawcountries()
Example #37
0
    def _apply_(self, *image):
        res = ()
        n_img = 0
        for img in image:
            shape = img.shape
            shape_size = shape[:2]
            if not hasattr(self, "M"):
                alpha = img.shape[1] * self.params["alpha"]
                alpha_affine = img.shape[1] * self.params["alpha_affine"]
                sigma = img.shape[1] * self.params["sigma"]
                # Random affine
                center_square = np.float32(shape_size) // 2
                square_size = min(shape_size) // 3
                random_state = np.random.RandomState(None)

                pts1 = np.float32([
                    center_square + square_size,
                    [
                        center_square[0] + square_size,
                        center_square[1] - square_size
                    ], center_square - square_size
                ])
                pts2 = pts1 + \
                    random_state.uniform(-alpha_affine, alpha_affine,
                                         size=pts1.shape).astype(np.float32)
                self.M = cv2.getAffineTransform(pts1, pts2)
                self.dx = gaussian_filter(
                    (random_state.rand(*shape) * 2 - 1), sigma) * alpha
                self.dy = gaussian_filter(
                    (random_state.rand(*shape) * 2 - 1), sigma) * alpha
            if shape[0:2] == self.dx.shape[0:2]:
                if len(shape) == 3:
                    x, y, z = np.meshgrid(np.arange(shape[1]),
                                          np.arange(shape[0]),
                                          np.arange(shape[2]),
                                          indexing='ij')
                    indices = np.reshape(x + self.dx, (-1, 1)), np.reshape(
                        y + self.dy, (-1, 1)), np.reshape(z, (-1, 1))
                elif len(shape) == 2:
                    x, y = np.meshgrid(np.arange(shape[1]),
                                       np.arange(shape[0]),
                                       indexing='ij')
                    if len(self.dx.shape) == 3:
                        indices = np.reshape(x + np.mean(self.dx, axis=2),
                                             (-1, 1)), np.reshape(
                                                 y + np.mean(self.dy, axis=2),
                                                 (-1, 1))
                    else:
                        indices = np.reshape(x + self.dx, (-1, 1)), np.reshape(
                            y + self.dy, (-1, 1))
                else:
                    print "Error"
            elif shape[0] > self.dx.shape[0]:
                print "not possible"
            else:
                offset = (self.dx.shape[0] - shape[0]) / 2
                if len(shape) == 3:
                    x, y, z = np.meshgrid(np.arange(shape[1]),
                                          np.arange(shape[0]),
                                          np.arange(shape[2]),
                                          indexing='ij')
                    indices = np.reshape(
                        x + self.dx[offset:-offset, offset:-offset],
                        (-1, 1)), np.reshape(
                            y + self.dy[offset:-offset, offset:-offset],
                            (-1, 1)), np.reshape(z, (-1, 1))
                elif len(shape) == 2:
                    x, y = np.meshgrid(np.arange(shape[1]),
                                       np.arange(shape[0]),
                                       indexing='ij')
                    if len(self.dx.shape) == 3:
                        indices = np.reshape(
                            x +
                            np.mean(self.dx[offset:-offset, offset:-offset],
                                    axis=2), (-1, 1)), np.reshape(
                                        y + np.mean(self.dy[offset:-offset,
                                                            offset:-offset],
                                                    axis=2), (-1, 1))
                    else:
                        indices = np.reshape(
                            x + self.dx[offset:-offset, offset:-offset],
                            (-1, 1)), np.reshape(
                                y + self.dy[offset:-offset, offset:-offset],
                                (-1, 1))
                else:
                    print "Error"
            if n_img == 1:
                order = 0
                flags = cv2.INTER_NEAREST
            else:
                order = 1
                flags = cv2.INTER_LINEAR
            img = cv2.warpAffine(img,
                                 self.M,
                                 shape_size[::-1],
                                 flags=flags,
                                 borderMode=cv2.BORDER_REFLECT_101)

            sub_res = map_coordinates(img,
                                      indices,
                                      order=order,
                                      mode='reflect').reshape(shape)
            sub_res = self.OutputType(sub_res)
            res += (sub_res, )
            n_img += 1
        return res
Example #38
0
def evaluate(upsampling_factor, residual_blocks, feature_size,
             checkpoint_dir_restore, path_volumes, nn, subpixel_NN, img_height,
             img_width, img_depth):

    # dataset & variables
    traindataset = Train_dataset(1)
    iterations = math.ceil(
        (len(traindataset.subject_list) *
         0.2))  # 817 subjects total. De 0 a 654 training. De 654 a 817 test.
    print(len(traindataset.subject_list))
    print(iterations)
    totalpsnr = 0
    totalssim = 0
    array_psnr = np.empty(iterations)
    array_ssim = np.empty(iterations)
    batch_size = 1
    div_patches = 4
    num_patches = traindataset.num_patches

    # define model
    t_input_gen = tf.placeholder('float32', [1, None, None, None, 1],
                                 name='t_image_input_to_SRGAN_generator')
    srgan_network = generator(input_gen=t_input_gen,
                              kernel=3,
                              nb=residual_blocks,
                              upscaling_factor=upsampling_factor,
                              feature_size=feature_size,
                              subpixel_NN=subpixel_NN,
                              img_height=img_height,
                              img_width=img_width,
                              img_depth=img_depth,
                              nn=nn,
                              is_train=False,
                              reuse=False)

    # restore g
    sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                            log_device_placement=False))

    saver = tf.train.Saver(
        tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="SRGAN_g"))
    saver.restore(sess, tf.train.latest_checkpoint(checkpoint_dir_restore))

    for i in range(0, iterations):
        # extract volumes
        xt_total = traindataset.data_true(
            654 + i)  # [[self.batch_size, 224, 224, 152]]
        xt_mask = traindataset.mask(654 + i)
        xg_generated = np.empty([1, 224, 224, 152, 1])
        normfactor = (np.amax(xt_total[0])) / 2
        x_generator = ((xt_total[0] - normfactor) / normfactor)
        res = 1 / upsampling_factor
        x_generator = x_generator[:, :, :, np.newaxis]
        x_generator = zoom(x_generator, [res, res, res, 1])
        x_generator = gaussian_filter(x_generator, sigma=1)
        xg_generated[0] = sess.run(srgan_network.outputs,
                                   {t_input_gen: x_generator[np.newaxis, :]})
        xg_generated[0] = ((xg_generated[0] + 1) * normfactor)
        volume_real = xt_total[0]
        volume_real = volume_real[:, :, :, np.newaxis]
        volume_generated = xg_generated[0]
        volume_mask = aggregate(xt_mask)
        # compute metrics
        max_gen = np.amax(volume_generated)
        max_real = np.amax(volume_real)
        if max_gen > max_real:
            val_max = max_gen
        else:
            val_max = max_real
        min_gen = np.amin(volume_generated)
        min_real = np.amin(volume_real)
        if min_gen < min_real:
            val_min = min_gen
        else:
            val_min = min_real
        val_psnr = psnr(np.multiply(volume_real, volume_mask),
                        np.multiply(volume_generated, volume_mask),
                        dynamic_range=val_max - val_min)
        array_psnr[i] = val_psnr

        totalpsnr += val_psnr
        val_ssim = ssim(np.multiply(volume_real, volume_mask),
                        np.multiply(volume_generated, volume_mask),
                        dynamic_range=val_max - val_min,
                        multichannel=True)
        array_ssim[i] = val_ssim
        totalssim += val_ssim
        print(val_psnr)
        print(val_ssim)
        # save volumes
        filename_gen = os.path.join(path_volumes, str(i) + 'gen.nii.gz')
        img_volume_gen = nib.Nifti1Image(volume_generated, np.eye(4))
        img_volume_gen.to_filename(filename_gen)
        filename_real = os.path.join(path_volumes, str(i) + 'real.nii.gz')
        img_volume_real = nib.Nifti1Image(volume_real, np.eye(4))
        img_volume_real.to_filename(filename_real)

    print('{}{}'.format('Mean PSNR: ', array_psnr.mean()))
    print('{}{}'.format('Mean SSIM: ', array_ssim.mean()))
    print('{}{}'.format('Variance PSNR: ', array_psnr.var()))
    print('{}{}'.format('Variance SSIM: ', array_ssim.var()))
    print('{}{}'.format('Max PSNR: ', array_psnr.max()))
    print('{}{}'.format('Min PSNR: ', array_psnr.min()))
    print('{}{}'.format('Max SSIM: ', array_ssim.max()))
    print('{}{}'.format('Min SSIM: ', array_ssim.min()))
Example #39
0
    def constant_cylinder(self,
                          radius,
                          dvp=-5.0,
                          dvs=-5.0,
                          drho=-1.0,
                          start_depth=100.0,
                          **kwargs):
        '''
      generates a cylindrical anomaly with constant perturbation in Vp, Vs, and density
      use this *after* running 'velocity_conversion'
      args-----------------------------------------------------------------------
      #   radius: radius of cylinder in km
      #   dvp: vp perturbation in %
      #   dvs: vs perturbation in %
      #   rho: density perturbation in %
      #   start_depth: starting depth of cylinder

      #kwargs--------------------------------------------------------------------
      sigma_blur: sigma for gaussian smoothing (default = 3.0)
      '''
        self.dvp_rel = np.zeros((self.npts_rad, self.npts_theta))
        self.dvs_rel = np.zeros((self.npts_rad, self.npts_theta))
        self.drho_rel = np.zeros((self.npts_rad, self.npts_theta))
        self.dvp_abs = np.zeros((self.npts_rad, self.npts_theta))
        self.dvs_abs = np.zeros((self.npts_rad, self.npts_theta))
        self.drho_abs = np.zeros((self.npts_rad, self.npts_theta))
        sigma_blur = kwargs.get('sigma_blur', 3.0)
        sigma_blur_vert = kwargs.get('sigma_blur_vert', 0.5)

        #T_ref = self.T_adiabat[::-1]
        #T_here = np.zeros((self.npts_rad,self.npts_theta))

        for i in range(0, self.npts_rad):
            km_per_degree = self.rad_km[i] * 2 * np.pi / 360.0

            #get 1d values
            vp_here = self.vp1d[::-1][i]
            vs_here = self.vs1d[::-1][i]
            rho_here = self.rho1d[::-1][i]

            #calculate absolute values of perturbations
            dvp_abs = vp_here * (dvp / 100.0)
            dvs_abs = vs_here * (dvs / 100.0)
            drho_abs = rho_here * (drho / 100000.0)

            for j in range(0, self.npts_theta):

                cyl_th_here = radius / km_per_degree
                th_here = self.theta[j]
                depth_here = 6371.0 - self.rad_km[i]

                if th_here <= cyl_th_here and depth_here > start_depth:
                    self.dvp_abs[(self.npts_rad - 1) - i, j] += dvp_abs
                    self.dvs_abs[(self.npts_rad - 1) - i, j] += dvs_abs
                    self.drho_abs[(self.npts_rad - 1) - i, j] += drho_abs
                    self.dvp_rel[(self.npts_rad - 1) - i, j] += dvp
                    self.dvs_rel[(self.npts_rad - 1) - i, j] += dvs
                    self.drho_rel[(self.npts_rad - 1) - i, j] += drho

        self.dvp_abs = gaussian_filter(self.dvp_abs,
                                       sigma=[sigma_blur_vert, sigma_blur])
        self.dvs_abs = gaussian_filter(self.dvs_abs,
                                       sigma=[sigma_blur_vert, sigma_blur])
        self.drho_abs = gaussian_filter(self.drho_abs,
                                        sigma=[sigma_blur_vert, sigma_blur])
        self.dvp_rel = gaussian_filter(self.dvp_rel,
                                       sigma=[sigma_blur_vert, sigma_blur])
        self.dvs_rel = gaussian_filter(self.dvs_rel,
                                       sigma=[sigma_blur_vert, sigma_blur])
        self.drho_rel = gaussian_filter(self.drho_rel,
                                        sigma=[sigma_blur_vert, sigma_blur])
Example #40
0
from PIL import Image
from numpy import *
from scipy.ndimage import filters

im = array(Image.open('for_learn.jpeg').convert('L'))
im_blur_5 = filters.gaussian_filter(im, 5)
im_blur_10 = filters.gaussian_filter(im, 10)

# Image.fromarray(im_blur_5).save('./photo/im_blur_5.jpg')
# Image.fromarray(im_blur_10).save('./photo/im_blur_10.jpg')
Example #41
0
    def __call__(self, oriImg):
        scale_search = [0.5, 1.0, 1.5, 2.0]
        #scale_search = [0.5]
        boxsize = 368
        stride = 8
        padValue = 128
        thre1 = 0.1
        thre2 = 0.05
        multiplier = [x * boxsize / oriImg.shape[0] for x in scale_search]
        heatmap_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 19))
        paf_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], 38))

        for m in range(len(multiplier)):
            scale = multiplier[m]
            imageToTest = cv2.resize(oriImg, (0, 0),
                                     fx=scale,
                                     fy=scale,
                                     interpolation=cv2.INTER_CUBIC)
            imageToTest_padded, pad = util.padRightDownCorner(
                imageToTest, stride, padValue)
            im = np.transpose(
                np.float32(imageToTest_padded[:, :, :, np.newaxis]),
                (3, 2, 0, 1)) / 256 - 0.5
            im = np.ascontiguousarray(im)

            data = torch.from_numpy(im).float()
            if torch.cuda.is_available():
                data = data.cuda()
            # data = data.permute([2, 0, 1]).unsqueeze(0).float()
            with torch.no_grad():
                Mconv7_stage6_L1, Mconv7_stage6_L2 = self.model(data)
            Mconv7_stage6_L1 = Mconv7_stage6_L1.cpu().numpy()
            Mconv7_stage6_L2 = Mconv7_stage6_L2.cpu().numpy()

            # extract outputs, resize, and remove padding
            # heatmap = np.transpose(np.squeeze(net.blobs[output_blobs.keys()[1]].data), (1, 2, 0))  # output 1 is heatmaps
            heatmap = np.transpose(np.squeeze(Mconv7_stage6_L2),
                                   (1, 2, 0))  # output 1 is heatmaps
            heatmap = cv2.resize(heatmap, (0, 0),
                                 fx=stride,
                                 fy=stride,
                                 interpolation=cv2.INTER_CUBIC)
            heatmap = heatmap[:imageToTest_padded.shape[0] -
                              pad[2], :imageToTest_padded.shape[1] - pad[3], :]
            heatmap = cv2.resize(heatmap, (oriImg.shape[1], oriImg.shape[0]),
                                 interpolation=cv2.INTER_CUBIC)

            # paf = np.transpose(np.squeeze(net.blobs[output_blobs.keys()[0]].data), (1, 2, 0))  # output 0 is PAFs
            paf = np.transpose(np.squeeze(Mconv7_stage6_L1),
                               (1, 2, 0))  # output 0 is PAFs
            paf = cv2.resize(paf, (0, 0),
                             fx=stride,
                             fy=stride,
                             interpolation=cv2.INTER_CUBIC)
            paf = paf[:imageToTest_padded.shape[0] -
                      pad[2], :imageToTest_padded.shape[1] - pad[3], :]
            paf = cv2.resize(paf, (oriImg.shape[1], oriImg.shape[0]),
                             interpolation=cv2.INTER_CUBIC)

            heatmap_avg += heatmap_avg + heatmap / len(multiplier)
            paf_avg += +paf / len(multiplier)

        all_peaks = []
        peak_counter = 0

        for part in range(18):
            map_ori = heatmap_avg[:, :, part]
            one_heatmap = gaussian_filter(map_ori, sigma=3)

            map_left = np.zeros(one_heatmap.shape)
            map_left[1:, :] = one_heatmap[:-1, :]
            map_right = np.zeros(one_heatmap.shape)
            map_right[:-1, :] = one_heatmap[1:, :]
            map_up = np.zeros(one_heatmap.shape)
            map_up[:, 1:] = one_heatmap[:, :-1]
            map_down = np.zeros(one_heatmap.shape)
            map_down[:, :-1] = one_heatmap[:, 1:]

            peaks_binary = np.logical_and.reduce(
                (one_heatmap >= map_left, one_heatmap >= map_right,
                 one_heatmap >= map_up, one_heatmap >= map_down,
                 one_heatmap > thre1))
            peaks = list(
                zip(np.nonzero(peaks_binary)[1],
                    np.nonzero(peaks_binary)[0]))  # note reverse
            peaks_with_score = [x + (map_ori[x[1], x[0]], ) for x in peaks]
            peak_id = range(peak_counter, peak_counter + len(peaks))
            peaks_with_score_and_id = [
                peaks_with_score[i] + (peak_id[i], )
                for i in range(len(peak_id))
            ]

            all_peaks.append(peaks_with_score_and_id)
            peak_counter += len(peaks)

        # find connection in the specified sequence, center 29 is in the position 15
        limbSeq = [[2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], \
                   [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], \
                   [1, 16], [16, 18], [3, 17], [6, 18]]
        # the middle joints heatmap correpondence
        mapIdx = [[31, 32], [39, 40], [33, 34], [35, 36], [41, 42], [43, 44], [19, 20], [21, 22], \
                  [23, 24], [25, 26], [27, 28], [29, 30], [47, 48], [49, 50], [53, 54], [51, 52], \
                  [55, 56], [37, 38], [45, 46]]

        connection_all = []
        special_k = []
        mid_num = 10

        for k in range(len(mapIdx)):
            score_mid = paf_avg[:, :, [x - 19 for x in mapIdx[k]]]
            candA = all_peaks[limbSeq[k][0] - 1]
            candB = all_peaks[limbSeq[k][1] - 1]
            nA = len(candA)
            nB = len(candB)
            indexA, indexB = limbSeq[k]
            if (nA != 0 and nB != 0):
                connection_candidate = []
                for i in range(nA):
                    for j in range(nB):
                        vec = np.subtract(candB[j][:2], candA[i][:2])
                        norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
                        vec = np.divide(vec, norm)

                        startend = list(zip(np.linspace(candA[i][0], candB[j][0], num=mid_num), \
                                            np.linspace(candA[i][1], candB[j][1], num=mid_num)))

                        vec_x = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 0] \
                                          for I in range(len(startend))])
                        vec_y = np.array([score_mid[int(round(startend[I][1])), int(round(startend[I][0])), 1] \
                                          for I in range(len(startend))])

                        score_midpts = np.multiply(
                            vec_x, vec[0]) + np.multiply(vec_y, vec[1])
                        score_with_dist_prior = sum(score_midpts) / len(
                            score_midpts) + min(
                                0.5 * oriImg.shape[0] / norm - 1, 0)
                        criterion1 = len(np.nonzero(
                            score_midpts > thre2)[0]) > 0.8 * len(score_midpts)
                        criterion2 = score_with_dist_prior > 0
                        if criterion1 and criterion2:
                            connection_candidate.append([
                                i, j, score_with_dist_prior,
                                score_with_dist_prior + candA[i][2] +
                                candB[j][2]
                            ])

                connection_candidate = sorted(connection_candidate,
                                              key=lambda x: x[2],
                                              reverse=True)
                connection = np.zeros((0, 5))
                for c in range(len(connection_candidate)):
                    i, j, s = connection_candidate[c][0:3]
                    if (i not in connection[:, 3]
                            and j not in connection[:, 4]):
                        connection = np.vstack(
                            [connection, [candA[i][3], candB[j][3], s, i, j]])
                        if (len(connection) >= min(nA, nB)):
                            break

                connection_all.append(connection)
            else:
                special_k.append(k)
                connection_all.append([])

        # last number in each row is the total parts number of that person
        # the second last number in each row is the score of the overall configuration
        subset = -1 * np.ones((0, 20))
        candidate = np.array(
            [item for sublist in all_peaks for item in sublist])

        for k in range(len(mapIdx)):
            if k not in special_k:
                partAs = connection_all[k][:, 0]
                partBs = connection_all[k][:, 1]
                indexA, indexB = np.array(limbSeq[k]) - 1

                for i in range(len(connection_all[k])):  # = 1:size(temp,1)
                    found = 0
                    subset_idx = [-1, -1]
                    for j in range(len(subset)):  # 1:size(subset,1):
                        if subset[j][indexA] == partAs[i] or subset[j][
                                indexB] == partBs[i]:
                            subset_idx[found] = j
                            found += 1

                    if found == 1:
                        j = subset_idx[0]
                        if subset[j][indexB] != partBs[i]:
                            subset[j][indexB] = partBs[i]
                            subset[j][-1] += 1
                            subset[j][-2] += candidate[
                                partBs[i].astype(int),
                                2] + connection_all[k][i][2]
                    elif found == 2:  # if found 2 and disjoint, merge them
                        j1, j2 = subset_idx
                        membership = ((subset[j1] >= 0).astype(int) +
                                      (subset[j2] >= 0).astype(int))[:-2]
                        if len(np.nonzero(membership == 2)[0]) == 0:  # merge
                            subset[j1][:-2] += (subset[j2][:-2] + 1)
                            subset[j1][-2:] += subset[j2][-2:]
                            subset[j1][-2] += connection_all[k][i][2]
                            subset = np.delete(subset, j2, 0)
                        else:  # as like found == 1
                            subset[j1][indexB] = partBs[i]
                            subset[j1][-1] += 1
                            subset[j1][-2] += candidate[
                                partBs[i].astype(int),
                                2] + connection_all[k][i][2]

                    # if find no partA in the subset, create a new subset
                    elif not found and k < 17:
                        row = -1 * np.ones(20)
                        row[indexA] = partAs[i]
                        row[indexB] = partBs[i]
                        row[-1] = 2
                        row[-2] = sum(
                            candidate[connection_all[k][i, :2].astype(int),
                                      2]) + connection_all[k][i][2]
                        subset = np.vstack([subset, row])
        # delete some rows of subset which has few parts occur
        deleteIdx = []
        for i in range(len(subset)):
            if subset[i][-1] < 4 or subset[i][-2] / subset[i][-1] < 0.4:
                deleteIdx.append(i)
        subset = np.delete(subset, deleteIdx, axis=0)

        # subset: n*20 array, 0-17 is the index in candidate, 18 is the total score, 19 is the total parts
        # candidate: x, y, score, id
        return candidate, subset
Example #42
0
def nonMaximumSuppression(param,
                          heatmaps,
                          upsampFactor=1.,
                          bool_refine_center=True,
                          bool_gaussian_filt=False):
    """
    NonMaximaSuppression: find peaks (local maxima) in a set of grayscale images
    :param heatmaps: set of grayscale images on which to find local maxima (3d np.array,
    with dimensions image_height x image_width x num_heatmaps)
    :param upsampFactor: Size ratio between CPM heatmap output and the input image size.
    Eg: upsampFactor=16 if original image was 480x640 and heatmaps are 30x40xN
    :param bool_refine_center: Flag indicating whether:
     - False: Simply return the low-res peak found upscaled by upsampFactor (subject to grid-snap)
     - True: (Recommended, very accurate) Upsample a small patch around each low-res peak and
     fine-tune the location of the peak at the resolution of the original input image
    :param bool_gaussian_filt: Flag indicating whether to apply a 1d-GaussianFilter (smoothing)
    to each upsampled patch before fine-tuning the location of each peak.
    :return: a NUM_JOINTS x 4 np.array where each row represents a joint type (0=nose, 1=neck...)
    and the columns indicate the {x,y} position, the score (probability) and a unique id (counter)
    """
    # MODIFIED BY CARLOS: Instead of upsampling the heatmaps to heatmap_avg and
    # then performing NMS to find peaks, this step can be sped up by ~25-50x by:
    # (9-10ms [with GaussFilt] or 5-6ms [without GaussFilt] vs 250-280ms on RoG
    # 1. Perform NMS at (low-res) CPM's output resolution
    # 1.1. Find peaks using scipy.ndimage.filters.maximum_filter
    # 2. Once a peak is found, take a patch of 5x5 centered around the peak, upsample it, and
    # fine-tune the position of the actual maximum.
    #  '-> That's equivalent to having found the peak on heatmap_avg, but much faster because we only
    #      upsample and scan the 5x5 patch instead of the full (e.g.) 480x640

    joint_list_per_joint_type = []
    cnt_total_joints = 0
    # For every peak found, win_size specifies how many pixels in each
    # direction from the peak we take to obtain the patch that will be
    # upsampled. Eg: win_size=1 -> patch is 3x3; win_size=2 -> 5x5
    # (for BICUBIC interpolation to be accurate, win_size needs to be >=2!)

    win_size = 2
    for joint in range(NUM_JOINTS):
        map_orig = heatmaps[:, :, joint]
        peak_coords = find_peaks(param, map_orig)
        peaks = np.zeros((len(peak_coords), 4))

        for i, peak in enumerate(peak_coords):
            if bool_refine_center:
                x_min, y_min = np.maximum(0, peak - win_size)
                x_max, y_max = np.minimum(
                    np.array(map_orig.T.shape) - 1, peak + win_size)
                # Take a small patch around each peak and only upsample that
                # tiny region

                patch = map_orig[y_min:y_max + 1, x_min:x_max + 1]
                map_upsamp = cv2.resize(patch,
                                        None,
                                        fx=upsampFactor,
                                        fy=upsampFactor,
                                        interpolation=cv2.INTER_CUBIC)

                # Gaussian filtering takes an average of 0.8ms/peak (and there might be
                # more than one peak per joint!) -> For now, skip it (it's
                # accurate enough)
                map_upsamp = gaussian_filter(
                    map_upsamp, sigma=3) if bool_gaussian_filt else map_upsamp
                # Obtain the coordinates of the maximum value in the patch
                location_of_max = np.unravel_index(map_upsamp.argmax(),
                                                   map_upsamp.shape)
                # Remember that peaks indicates [x,y] -> need to reverse it for
                # [y,x]

                location_of_patch_center = compute_resized_coords(
                    peak[::-1] - [y_min, x_min], upsampFactor)
                # Calculate the offset wrt to the patch center where the actual
                # maximum is

                refined_center = (location_of_max - location_of_patch_center)
                peak_score = map_upsamp[location_of_max]
            else:
                refined_center = [0, 0]
                # Flip peak coordinates since they are [x,y] instead of [y,x]
                peak_score = map_orig[tuple(peak[::-1])]
            peaks[i, :] = tuple([
                int(round(x))
                for x in compute_resized_coords(peak_coords[i], upsampFactor) +
                refined_center[::-1]
            ]) + (peak_score, cnt_total_joints)
            cnt_total_joints += 1
        joint_list_per_joint_type.append(peaks)

    return joint_list_per_joint_type
def compute_angle(input_filepath, alpha, beta, method, new_centerlines,
                  region_of_interest, region_points, projection=False):
    """
    Primary collection of methods for computing the angle of a vessel bend.
    Three main methods are currently implemented:
    1) ODR methods: odrline
    2) Tracing point methods: maxcurv, smooth, discrete, frac, MISR
    3) Relative tracing point methods: plane, itplane, itplane_clip

    Args:
        input_filepath (str): Path to case folder.
        alpha (float): Extension / Compression factor in vertical direction.
        beta (float): Extension / Compression factor in horizontal direction.
        method (str): Method used to compute angle.
        new_centerlines (vtkPolyData): New centerline.
        region_of_interest (str): Method for setting the region of interest ['manual' | 'commandline' | 'landmarking']
        region_points (list): If region_of_interest is 'commandline', this a flatten list of the start and endpoint
        projection (bool): True / False for computing 2D / 3D angle.

    Returns:
        new_deg (float): New angle of a vessel bend from a manipulated centerline.
    Returns:
        deg (float): Old angle of a vessel bend from a manipulated centerline.
    """
    # Get base path
    base_path = get_path_names(input_filepath)

    # Centerline path
    centerline_path = base_path + "_centerline.vtp"

    # Clean and capp / uncapp surface
    surface, capped_surface = prepare_surface(base_path, input_filepath)

    # Extract old centerline
    if not path.exists(centerline_path):

        # Compute centerlines
        inlet, outlets = get_inlet_and_outlet_centers(surface, base_path)

        print("-- Compute centerlines and Voronoi diagram")
        centerlines, _, _ = compute_centerlines(inlet, outlets, centerline_path,
                                                capped_surface, resampling=0.1,
                                                smooth=False, base_path=base_path)
    else:
        centerlines = read_polydata(centerline_path)

    # Get region of interest
    point_path = base_path + "_anterior_bend.particles"
    if region_of_interest == "landmarking":
        if not path.exists(point_path):
            raise RuntimeError(("The given .particles file: %s does not exist. Please run" +
                                " landmarking with automated_landmarking.py first.") % point_path)
        region_points = np.loadtxt(point_path)
    else:
        _, _, _, region_points, _ = get_line_to_change(capped_surface, centerlines,
                                                       region_of_interest, "bend", region_points, 0)
        region_points = [[region_points[3 * i], region_points[3 * i + 1], region_points[3 * i + 2]]
                         for i in range(len(region_points) // 3)]
    p1 = region_points[0]
    p2 = region_points[1]

    if new_centerlines is None:
        centerlines, new_centerlines = get_new_centerlines(centerlines, region_points, alpha, beta, p1, p2)

    # Get new siphon and prepare
    id1, id2, moved_id1, moved_id2, moved_p1, moved_p2 = get_moved_siphon(new_centerlines, centerlines, p1, p2)

    # Extract region of interest
    siphon = extract_single_line(centerlines, 1, start_id=id1, end_id=id2)
    moved_siphon = extract_single_line(new_centerlines, 0, start_id=moved_id1, end_id=moved_id2)
    id1, id2 = 0, siphon.GetNumberOfPoints() - 1
    moved_id1, moved_id2 = 0, moved_siphon.GetNumberOfPoints() - 1

    if method in ["maxcurv", "odrline", "smooth", "frac"]:
        nknots = 11
        siphon_splined, siphon_curv = compute_splined_centerline(siphon, get_curv=True, isline=True, nknots=nknots,
                                                                 get_misr=False)

        _, moved_siphon_curv = compute_splined_centerline(moved_siphon, get_curv=True, isline=True, nknots=nknots,
                                                          get_misr=False)
        siphon_curv = resample(siphon_curv, siphon_splined.GetNumberOfPoints())
        cutcurv = siphon_curv[id1:id2]
        newcutcurv = moved_siphon_curv[moved_id1:moved_id2]

    if method == "discrete":
        # Smooth line with discrete derivatives
        neigh = 30
        _, curv_d = compute_discrete_derivatives(siphon, neigh=neigh)
        _, newcurv_d = compute_discrete_derivatives(moved_siphon, neigh=neigh)
        cutcurv_d = curv_d[id1:id2]
        newcutcurv_d = newcurv_d[moved_id1:moved_id2]

    if method == "MISR":
        # Map MISR values to old and new splined anterior bend
        anterior_bend = extract_single_line(centerlines, 0, start_id=id1, end_id=id2)
        m = anterior_bend.GetNumberOfPoints()
        m1 = moved_siphon.GetNumberOfPoints()
        misr_array = get_vtk_array(radiusArrayName, 1, m)
        newmisr_array = get_vtk_array(radiusArrayName, 1, m1)
        misr_list = []
        for i in range(m):
            misr = anterior_bend.GetPointData().GetArray(radiusArrayName).GetTuple(i)
            misr_list.append(misr[0])
            misr_array.SetTuple(i, misr)

        misr_list = resample(misr_list, m1)
        for i in range(m1):
            newmisr_array.SetTuple(i, (misr_list[i],))

        siphon.GetPointData().AddArray(misr_array)
        moved_siphon.GetPointData().AddArray(newmisr_array)

    # Get direction to the point furthest away (dx)
    direction = "vertical"
    clipping_points_vtk = vtk.vtkPoints()
    for point in [p1, p2]:
        clipping_points_vtk.InsertNextPoint(point)
    middle_points, _, dx = get_direction_parameters(extract_single_line(centerlines, 0), 0.1, direction,
                                                    clipping_points_vtk)

    # Find adjusted clipping points (and tracing points)
    if method == "plane":
        _, max_id = get_most_distant_point(dx, siphon)
        _, newmax_id = get_most_distant_point(dx, moved_siphon)

    elif method in ["itplane", "itplane_clip"]:
        _, max_id = get_most_distant_point(dx, siphon)
        _, newmax_id = get_most_distant_point(dx, moved_siphon)

        siphon = vmtk_compute_geometric_features(siphon, False)

        frenet_t1 = get_point_data_array("FrenetTangent", siphon, k=3)
        frenet_t2 = get_point_data_array("FrenetTangent", moved_siphon, k=3)

        p1_1, p1_id = get_closest_point(frenet_t1[-1], 0, max_id, p2, siphon)
        p2_2, p2_id = get_closest_point(frenet_t1[0], max_id, siphon.GetNumberOfPoints(), p1, siphon)

        newp1, np1_id = get_closest_point(frenet_t2[-1], 0, newmax_id, moved_p2, moved_siphon)
        newp2, np2_id = get_closest_point(frenet_t2[0], newmax_id,
                                          moved_siphon.GetNumberOfPoints(), moved_p1,
                                          moved_siphon)

        n1 = get_point_data_array("FrenetBinormal", siphon, k=3)[p1_id]
        n2 = get_point_data_array("FrenetBinormal", moved_siphon, k=3)[np1_id]

        dp = p1_1 - p2_2
        dnewp = newp1 - newp2

        normal = np.cross(dp, n1)
        newnormal = np.cross(dnewp, n2)

        _, max_id = get_most_distant_point(normal, siphon)
        _, newmax_id = get_most_distant_point(newnormal, moved_siphon)

    elif method == "maxcurv":
        max_id, _ = max(enumerate(cutcurv), key=operator.itemgetter(1))
        newmax_id, _ = max(enumerate(newcutcurv), key=operator.itemgetter(1))

    elif method == "smooth":
        allmaxcurv = argrelextrema(cutcurv, np.greater)[0]
        allnewmaxcurv = argrelextrema(newcutcurv, np.greater)[0]

        tmpcurv = cutcurv
        while len(allmaxcurv) > 2:
            tmpcurv = gaussian_filter(tmpcurv, 2)
            allmaxcurv = argrelextrema(tmpcurv, np.greater)[0]

        tmpnewcurv = newcutcurv
        while len(allnewmaxcurv) > 2:
            tmpnewcurv = gaussian_filter(tmpnewcurv, 2)
            allnewmaxcurv = argrelextrema(tmpnewcurv, np.greater)[0]

        max_id = allmaxcurv[0]
        newmax_id = allnewmaxcurv[0]

    elif method == "discrete":
        max_id, _ = max(enumerate(cutcurv_d), key=operator.itemgetter(1))
        newmax_id, _ = max(enumerate(newcutcurv_d), key=operator.itemgetter(1))

    elif method == "maxdist":
        norm_p1 = [la.norm(np.array(p1) - np.array(siphon.GetPoint(i))) for i in range(siphon.GetNumberOfPoints())]
        norm_p2 = [la.norm(np.array(p2) - np.array(siphon.GetPoint(i))) for i in
                   range(siphon.GetNumberOfPoints() - 1, -1, -1)]
        max_id = 0
        max_dist = 0
        for i, n1 in enumerate(norm_p1):
            for n2 in norm_p2:
                dist = n1 ** 2 + n2 ** 2
                if dist > max_dist:
                    max_dist = dist
                    max_id = i

        newnorm_p1 = [la.norm(np.array(moved_p1) - np.array(moved_siphon.GetPoint(i))) for i in
                      range(moved_siphon.GetNumberOfPoints())]
        newnorm_p2 = [la.norm(np.array(moved_p2) - np.array(moved_siphon.GetPoint(i))) for i in
                      range(moved_siphon.GetNumberOfPoints() - 1, -1, -1)]
        newmax_id = 0
        new_max_dist = 0
        for i, n1 in enumerate(newnorm_p1):
            for j, n2 in enumerate(newnorm_p2):
                dist = n1 ** 2 + n2 ** 2
                if dist > new_max_dist:
                    new_max_dist = dist
                    newmax_id = i

    # Compute angles based on the classic formula for
    # angle between vectors in 3D
    if method == "odrline":
        limits = ["cumulative", "sd"]
        for limit in limits:
            d1, d2, _ = odr_line(id1, id2, siphon_splined, siphon_curv, limit)
            newd1, newd2, _ = odr_line(moved_id1, moved_id2, moved_siphon, moved_siphon_curv, limit)

            deg = find_angle_odr(d1, d2, projection)
            new_deg = find_angle_odr(newd1, newd2, projection)

    elif method == "MISR":
        multiplier = 1.5
        n1 = siphon.GetNumberOfPoints()
        n2 = moved_siphon.GetNumberOfPoints()
        rad1 = siphon.GetPointData().GetArray(radiusArrayName).GetTuple1(0)
        rad2 = siphon.GetPointData().GetArray(radiusArrayName).GetTuple1(n1 - 1)
        newrad1 = moved_siphon.GetPointData().GetArray(radiusArrayName).GetTuple1(0)
        newrad2 = moved_siphon.GetPointData().GetArray(radiusArrayName).GetTuple1(n2 - 1)

        pa, _ = move_past_sphere(siphon, p1, rad1, 0, step=1, stop=n1 - 1, scale_factor=multiplier)
        pb, _ = move_past_sphere(siphon, p2, rad2, n1 - 1, step=-1, stop=0, scale_factor=multiplier)
        new_pa, _ = move_past_sphere(moved_siphon, moved_p1, newrad1, 0, step=1, stop=n2 - 1, scale_factor=multiplier)
        new_pb, _ = move_past_sphere(moved_siphon, moved_p2, newrad2, n2 - 1, step=-1, stop=0, scale_factor=multiplier)

        deg, l1, _ = find_angle(pa, pb, p1, p2, projection)
        new_deg, nl1, _ = find_angle(new_pa, new_pb, moved_p1, moved_p2, projection)

    else:
        if method == "frac":
            n_values = [5]
            left = [2]
            right = [3]
            i = 0
            dx = 1. / n_values[i]
            ida = int(id1 + (id2 - id1) * left[i] * dx)
            idb = int(id1 + (id2 - id1) * right[i] * dx)
            pa = siphon_splined.GetPoints().GetPoint(ida)
            pb = siphon_splined.GetPoints().GetPoint(idb)

            ida = int(moved_id1 + (moved_id2 - moved_id1) * left[i] * dx)
            idb = int(moved_id1 + (moved_id2 - moved_id1) * right[i] * dx)
            new_pa = moved_siphon.GetPoints().GetPoint(ida)
            new_pb = moved_siphon.GetPoints().GetPoint(idb)

            deg, l1, l2 = find_angle(pa, pb, p1, p2, projection)
            new_deg, nl1, nl2 = find_angle(new_pa, new_pb, moved_p1, moved_p2, projection)

        elif method in ["plane", "itplane", "itplane_clip", "maxcurv", "smooth",
                        "discrete", "maxdist"]:
            frac = 4. / 5.
            if method == "itplane_clip":
                id_mid = (p2_id - p1_id) / 2.
                new_id_mid = (np2_id - np1_id) / 2.
                if max_id > id_mid:
                    ida = int((max_id - p1_id) * frac)
                    idb = int((max_id - p1_id) * (1 + (1 - frac)))
                    pa = siphon.GetPoints().GetPoint(ida + p1_id)
                    pb = siphon.GetPoints().GetPoint(idb + p1_id)
                else:
                    idb = int((p2_id - max_id) * (1 + (1 - frac)))
                    ida = int((p2_id - max_id) * frac)
                    pa = siphon.GetPoints().GetPoint(ida)
                    pb = siphon.GetPoints().GetPoint(idb)

                if newmax_id > new_id_mid:
                    ida = int((newmax_id - np1_id) * frac)
                    idb = int((newmax_id - np1_id) * (1 + (1 - frac)))
                    new_pa = moved_siphon.GetPoints().GetPoint(ida + np1_id)
                    new_pb = moved_siphon.GetPoints().GetPoint(idb + np1_id)
                else:
                    ida = int((np2_id - newmax_id) * frac)
                    idb = int((np2_id - newmax_id) * (1 + (1 - frac)))
                    new_pa = moved_siphon.GetPoints().GetPoint(ida)
                    new_pb = moved_siphon.GetPoints().GetPoint(idb)

                deg, l1, l2 = find_angle(pa, pb, p1, p2, projection)
                new_deg, nl1, nl2 = find_angle(new_pa, new_pb, moved_p1, moved_p2, projection)

            else:
                ida = int(max_id * frac)
                idb = int(max_id * (1 + (1 - frac)))
                pa = siphon.GetPoints().GetPoint(ida)
                pb = siphon.GetPoints().GetPoint(idb)

                ida = int(newmax_id * frac)
                idb = int(newmax_id * (1 + (1 - frac)))
                new_pa = moved_siphon.GetPoints().GetPoint(ida)
                new_pb = moved_siphon.GetPoints().GetPoint(idb)

                deg, l1, l2 = find_angle(pa, pb, p1, p2, projection)
                new_deg, nl1, nl2 = find_angle(new_pa, new_pb, moved_p1, moved_p2, projection)

    return new_deg, deg
def gaussianblur(img, sigma):
	return filters.gaussian_filter(img,sigma)
def postprocess(mask_out, images_train, scribbles_train=None):
    '''
    Postprocesses predictions of CNN to create ground truths for recursion
    :param data: Data of this recursion - e.g. if given data file for recursion n,
                 It will set up ground truths to be random walked for recursion n
    :param images_train: Numpy array of training images
    :param scribbles_train: Numpy array of weakly annotated images
    :return:
'''

    #get labels present
    labels = np.unique(scribbles_train)
    labels = labels[labels != 0]

    # use full segmentation of random walker as upper bound
    if exp_config.rw_intersection:
        rw_segmentation = random_walker.segment(images_train,
                                                scribbles_train,
                                                threshold=0,
                                                beta=exp_config.rw_beta)
        mask = mask_out[:]
        mask_out = np.zeros_like(mask_out)
        for label in labels:
            indices = (rw_segmentation == label)
            indices &= (mask == label)
            mask_out[indices] = label

    #revert to original random walked data for 'bad' prediction
    if exp_config.rw_reversion:
        mask = mask_out[:]
        mask_out = np.zeros_like(mask_out)
        for img_id in range(exp_config.batch_size):
            for label in labels:
                if np.sum(mask[img_id, ...] == label) < np.sum(
                        scribbles_train[img_id, ...] == label):
                    #If the prediction has predicted less than the original scribble, revert to
                    #the scribble
                    mask_out[img_id, scribbles_train[img_id,
                                                     ...] == label] = label
                else:
                    mask_out[img_id, mask[img_id, ...] == label] = label

    #keep only largest cluster for output
    if exp_config.keep_largest_cluster:
        for img_id in range(exp_config.batch_size):
            mask_out[img_id,
                     ...] = image_utils.keep_largest_connected_components(
                         np.squeeze(mask_out[img_id, ...]))

    if exp_config.smooth_edges:
        labels = labels[labels != np.max(labels)]
        for img_id in range(exp_config.batch_size):
            mask = mask_out[img_id, ...]
            new_mask = np.zeros_like(mask)
            for label in labels:
                struct = (mask == label).astype(np.float)
                blurred_struct = gaussian_filter(
                    struct, sigma=exp_config.edge_smoother_sigma)
                # ax = fig.add_subplot(161 + label)
                blurred_struct[
                    blurred_struct >= exp_config.edge_smoother_threshold] = 1
                blurred_struct[
                    blurred_struct < exp_config.edge_smoother_threshold] = 0
                new_mask[blurred_struct != 0] = label
            mask_out[img_id, ...] = new_mask

    return mask_out
def apply_model(oriImg, model, multiplier,numPoints,roi_str):
    stride = 8
    roiPoint = roi_str.split('_')
    newImg = oriImg[int(roiPoint[0]):int(roiPoint[2]), int(roiPoint[1]):int(roiPoint[3])]

    height, width, _ = newImg.shape
    oriImg = newImg
    #height, width, _ = oriImg.shape
    #将图像转化成数组形式,类型是float32
    normed_img = np.array(oriImg, dtype=np.float32)
    #新建一个大小一样的0矩阵(图),另外这个图的通道数就是代预测点的个数
    heatmap_avg = np.zeros((oriImg.shape[0], oriImg.shape[1], numPoints), dtype=np.float32)
    #遍历尺度因数
    for m in range(len(multiplier)):
        scale = multiplier[m]
        imageToTest = cv2.resize(normed_img, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC)
        # imgToTest_padded, pad = util.padRightDownCorner(imageToTest, stride, 128)
        #将输入图片补全成标准大小(可能是384*384)
        imgToTest_padded, pad = util.padRightDownCorner(imageToTest, 32, 128)

        input_img = np.transpose(np.float32(imgToTest_padded[:, :, :, np.newaxis]),
                                 (3, 2, 0, 1)) / 255 - 0.5  # required shape (1, c, h, w)

        input_var = torch.autograd.Variable(torch.from_numpy(input_img).cuda())

        # get the features
        # heat1, heat2, heat3, heat4, heat5, heat6 = model(input_var)
        #怎么看是经历了几个阶段的特诊图
        heat = model(input_var)

        # get the heatmap
        heatmap = heat.data.cpu().numpy()
        heatmap = np.transpose(np.squeeze(heatmap), (1, 2, 0))  # (h, w, c)
        heatmap = cv2.resize(heatmap, (0, 0), fx=stride, fy=stride, interpolation=cv2.INTER_CUBIC)
        heatmap = heatmap[:imgToTest_padded.shape[0] - pad[2], :imgToTest_padded.shape[1] - pad[3], :]
        heatmap = cv2.resize(heatmap, (width, height), interpolation=cv2.INTER_CUBIC)
        heatmap_avg = heatmap_avg + heatmap / len(multiplier)

    all_peaks = []  # all of the possible points by classes.
    peak_counter = 0
    thre1 = 0.1
    for part in range(numPoints - 1):
        x_list = []
        y_list = []
        map_ori = heatmap_avg[:, :, part]
        map = gaussian_filter(map_ori, sigma=3)

        map_left = np.zeros(map.shape)
        map_left[1:, :] = map[:-1, :]
        map_right = np.zeros(map.shape)
        map_right[:-1, :] = map[1:, :]
        map_up = np.zeros(map.shape)
        map_up[:, 1:] = map[:, :-1]
        map_down = np.zeros(map.shape)
        map_down[:, :-1] = map[:, 1:]

        peaks_binary = np.logical_and.reduce(
            (map >= map_left, map >= map_right, map >= map_up, map >= map_down, map > thre1))
        peaks = list(zip(np.nonzero(peaks_binary)[1], np.nonzero(peaks_binary)[0])) # note reverse
        peaks_with_score = [x + (map_ori[x[1], x[0]],) for x in peaks]
        id = range(peak_counter, peak_counter + len(peaks))
        peaks_with_score_and_id = [peaks_with_score[i] + (id[i],) for i in range(len(id))]

        all_peaks.append(peaks_with_score_and_id)
        peak_counter += len(peaks)

    # sort by score
    for i in range(numPoints-1):
        all_peaks[i] = sorted(all_peaks[i], key=lambda ele : ele[2],reverse = True)

    keypoints = -1*np.ones((numPoints-1, 3))
    for i in range(numPoints-1):
        if len(all_peaks[i]) == 0:
            continue
        else:
            keypoints[i,0], keypoints[i,1], keypoints[i,2] = all_peaks[i][0][0], all_peaks[i][0][1], 1
    keypoints[:,0] =  keypoints[:,0] + int(roiPoint[1])
    keypoints[:,1] =  keypoints[:,1] + int(roiPoint[0])
    return  keypoints
Example #47
0
def AutoShift(Ref, Img, Delta = 50, shift=(0,0), step=5, gauss=5, mean=True, test=False, norm=False, normData=False):
    """Function to find the best shift between two images by using brute force
    It shift the two iumages and calculate a difference score between the two.
    The function will return the shift which gives the lowerst score (least difference)
    The score is the norm of the difference between the two images where all non-overlaping parts of the images
    due to the shifts are set to 0. The score is then normes by the effective area.
    In order to avoid the errors due to shot-noise, the images are gaussian blured.
  
    Delta: shifts between shift[0/1]-Delta and shift[0/1]+Delta will be tested
    step: The step between tested delta values
    gauss: For noisy image it is better to use a gaussian filter in order to improve the score accuracy.
           The value is the gaussian size.
    mean: If True, the mean value of each image are subtracted. This is prefered when the intensities of the two images does not match perfectly.
          Set it to False if you know that the intensities of your two images are identical
    Note: This function was developed as the maximum in FFT correlation does not seems to give very acurate
          result for images with low counts. If the shifts is expected to be big, the first guess shift can be calculated
          by FFT correlation. ie.:
          s = np.fft.fftshift( np.abs( np.fft.ifft2( np.fft.fft2(Reference) * np.conj(np.fft.fft2(Image)))))
          shift = [x-s.shape[i]/2 for i,x in enumerate(np.unravel_index(np.argmax(s), s.shape))]
    """
    assert Ref.shape[0] <= Img.shape[0]
    assert Ref.shape[1] <= Img.shape[1]
    if mean:
        Ref = Ref - np.mean(Ref)
        Img = Img - np.mean(Img)
    if normData:
       assert np.std(Ref)>0
       assert np.std(Img)>0
       Ref /= np.std(Ref)
       Img /= np.std(Img)
    # blur the images for score calculation
    if gauss in [0,None,False]:
        im1 = Ref
        im2 = Img
    else:
        im1 = gaussian_filter( Ref, gauss)
        im2 = gaussian_filter( Img, gauss)
        
    # the following two variables save the best score
    best = (0,0)
    Dbest = Ref.shape[0]*Ref.shape[1]*max(np.max(im2),np.max(im1))
    
    tested = np.zeros((int(2*Delta/step)+1,int(2*Delta/step)+1))
    # Sweep through all possible shifts (brute force)
    for iy,Dy in enumerate(np.arange(shift[1]-Delta, shift[1]+Delta+1, step)):
        dy = int(Dy)
        for ix,Dx in enumerate(np.arange(shift[0]-Delta, shift[0]+Delta+1, step)):
            dx = int(Dx)
            corr2 = ApplyShift(im2, (dx,dy))
            DSX = Img.shape[1] - Ref.shape[1]
            DSY = Img.shape[0] - Ref.shape[0]
            # Create a copy of the reference and erase parts which are not overlaping with img
            Or = np.copy(im1)
            if dy < 0:
                Or[:-dy, :] = 0
            elif DSY-dy < 0:
                Or[DSY-dy:, :] = 0
            if dx > 0:
                Or[:, :dx] = 0
            elif DSX+dx < 0:
                Or[:, dx+DSX:] = 0
            corr2 = corr2[:Ref.shape[0],:Ref.shape[1]]
            # calculate the score: absolute of the differendces normed by the overlaping area
            D = np.sum(np.abs( Or - corr2 ))
            if norm:
                D /= ((Ref.shape[0]-2*dy)*(Ref.shape[1]-2*dx))
            if test:
                tested[iy,ix] = D
            if D < Dbest:
                Dbest = D
                best = (dx,dy)
    if test:
        return best, Dbest, tested
    return best, Dbest
Example #48
0
import os
import numpy as np
from keras.models import load_model
from scipy.misc import imread, imresize
from scipy.ndimage.filters import gaussian_filter

model = load_model("saved_steps/weights-improvement-07-0.78.hdf5")
directory = "/home/alexander/PycharmProjects/car_detection/brand_image/validation/"

for path in os.listdir(directory):
    x = imread(directory + path)
    x = gaussian_filter(x, 3)
    x = imresize(x, (224, 224))
    x = np.reshape(x, [1, 224, 224, 3])
    x = x / 255
    print(path)
    print(
        sorted(list(enumerate(model.predict(x)[0].tolist())),
               key=lambda item: item[1])[-1][0])
    print(model.predict(x))
def plot(projection, x, y, z, args):
    lat, lon = get_latlon_coords(projection, x, y, z)
    if len(lat.shape) == 1:
        lat, lon = np.meshgrid(lat, lon)

    dataset_name = args.get('dataset')
    config = DatasetConfig(dataset_name)
    variable = args.get('variable')

    variable = variable.split(',')

    depth = args.get('depth')

    scale = args.get('scale')
    scale = [float(component) for component in scale.split(',')]

    time = args.get('time')

    data = []
    with open_dataset(config, variable=variable, timestamp=time) as dataset:

        for v in variable:
            data.append(dataset.get_area(
                np.array([lat, lon]),
                depth,
                time,
                v,
                args.get('interp'),
                args.get('radius'),
                args.get('neighbours')
            ))

        vc = config.variable[dataset.variables[variable[0]]]
        variable_name = vc.name
        variable_unit = vc.unit
        cmap = colormap.find_colormap(variable_name)

        if depth != 'bottom':
            depthm = dataset.depths[depth]
        else:
            depthm = 0

    if len(data) == 1:
        data = data[0]

    if len(data) == 2:
        data = np.sqrt(data[0] ** 2 + data[1] ** 2)
        cmap = colormap.colormaps.get('speed')

    data = data.transpose()
    xpx = x * 256
    ypx = y * 256

    # Mask out any topography if we're below the vector-tile threshold
    if z < 8:
        with Dataset(current_app.config['ETOPO_FILE'] % (projection, z), 'r') as dataset:
            bathymetry = dataset["z"][ypx:(ypx + 256), xpx:(xpx + 256)]

        bathymetry = gaussian_filter(bathymetry, 0.5)

        data[np.where(bathymetry > -depthm)] = np.ma.masked

    sm = matplotlib.cm.ScalarMappable(
        matplotlib.colors.Normalize(vmin=scale[0], vmax=scale[1]), cmap=cmap)

    img = sm.to_rgba(np.ma.masked_invalid(np.squeeze(data)))
    im = Image.fromarray((img * 255.0).astype(np.uint8))

    buf = BytesIO()
    im.save(buf, format='PNG', optimize=True)
    return buf
    if not (success1 and success2):
        continue

    else:
        image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
        image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)

        image1 = imresize(Image.fromarray(image1))
        image2 = imresize(Image.fromarray(image2))

        model_start_time = time.time()

        seg_map_left = model.run(image1)
        seg_map_left[seg_map_left > 0] = 255
        floatmap = seg_map_left.astype(np.float32) / 255.0
        blurmap = gaussian_filter(floatmap, sigma=3)
        cv2.imwrite("blurseg.png", blurmap * 255)

        model_ex_time = time.time() - model_start_time
        print(model_ex_time)

        resized_im_left = np.float32(image1)
        resized_im_right = np.float32(image2)

        print(resized_im_left.shape)
        print(resized_im_right.shape)

        resized_im_right = resized_im_right.copy()
        blurmap = blurmap[..., np.newaxis]

        frame = (resized_im_left * blurmap) + (resized_im_right *
Example #51
0
def MR_other(location, mode='sos_abs', sigma_thresh=4, gauss_sigma=3, gauss_filter=False):
    print("\n-> Constructing master residual...")
    residual_list = []
    masks = []
    median_list = []
    means = []
    residuals = glob.glob("%s/residuals/*_residual_.fits" % (location))
    mResidual = glob.glob("%s/residuals/*MR.fits" % (location))
    #fill all masked values with zero
    zeros_mask(location)
    if len(mResidual) == 0:
        if len(residuals) != 0:
            if fits.getval(residuals[0], 'WEIGHT') == 'Y':
                mask_value = 1
            else:
                mask_value = 0
            for r in residuals:
                hdu = fits.open(r)
                residual_list.append(hdu[0].data)
                median_list.append(np.median(hdu[0].data))
                masks.append(hdu[1].data)
                hdu.close()
            master_residual = np.zeros(residual_list[0].shape)
            master_mask = np.zeros(residual_list[0].shape)
            for i in tqdm(range(residual_list[0].shape[0])):
                for j in range(residual_list[0].shape[1]):
                    pixels = []
                    for res in range(len(residual_list)):
                        if masks[res][i,j] == mask_value:
                            pixels.append(residual_list[res][i,j])
                    if pixels != []:
                        if mode == 'sigma_clip':
                            MR_mask_pixel = mask_value
                            median = np.median(pixels)
                            stdev = np.std(pixels)
                            if np.max(pixels) >= (median + sigma_thresh*stdev):
                                MR_pixel = np.max(pixels)
                            elif np.min(pixels) <= (median - sigma_thresh*stdev):
                                MR_pixel = np.min(pixels) * -1
                            else:
                                MR_pixel = np.median(pixels)
                        elif mode == 'sos_abs':
                            pixels = np.array(pixels)
                            MR_pixel = np.sum(pixels*abs(pixels))
                            MR_mask_pixel = mask_value
                        elif mode == 'sos':
                            pixels = np.array(pixels)
                            MR_pixel = np.sum(pixels*pixels)
                            MR_mask_pixel = mask_value
                        else:
                            print("\n-> Error: Unrecognized mode\n-> Please use either 'sos', 'sos_abs', or 'sigma_clip'\n-> Exiting...")
                            sys.exit()
                    else:
                        MR_pixel = np.median(median_list)
                        MR_mask_pixel = (mask_value-1)*-1
                    master_residual[i,j] = MR_pixel
                    master_mask[i,j] = MR_mask_pixel                    
            template = glob.glob("%s/templates/*.fits" % (location))
            if len(template) == 1:
                temp_hdu = fits.open(template[0])
                temp_header = temp_hdu[0].header
                temp_hdu.close()
                if gauss_filter == True:
                    master_residual = gaussian_filter(master_residual, gauss_sigma)
                hduData = fits.PrimaryHDU(master_residual, header=temp_header)
                hduMask = fits.ImageHDU(master_mask)
                hduList = fits.HDUList([hduData, hduMask])
                hduList.writeto("%s/residuals/MR.fits" % (location), overwrite=True)
            else:
                print("-> Error: Problem with number of template images, couldn't complete master residual construction")
    elif len(mResidual) == 1:
        print("-> Master residual already exists...")
    else:
        print("-> Error: Problem with number of master residuals")
    return means
Example #52
0
def main():

    ps = PlotSequence('dr3-summary')

    #fns = glob('/project/projectdirs/cosmo/data/legacysurvey/dr3.1/sweep/3.1/sweep-*.fits')
    #fns = glob('/project/projectdirs/cosmo/data/legacysurvey/dr3.1/sweep/3.1/sweep-240p005-250p010.fits')
    fns = ['dr3.1/sweep/3.1/sweep-240p005-250p010.fits',
#           '/project/projectdirs/cosmo/data/legacysurvey/dr3.1/sweep/3.1/sweep-240p010-250p015.fits',
#           '/project/projectdirs/cosmo/data/legacysurvey/dr3.1/sweep/3.1/sweep-230p005-240p010.fits',
#           '/project/projectdirs/cosmo/data/legacysurvey/dr3.1/sweep/3.1/sweep-230p010-240p015.fits'
    ]

    plt.figure(2, figsize=(6,4))
    plt.subplots_adjust(left=0.1, bottom=0.15, right=0.98, top=0.98)
    plt.figure(1)


    TT = []
    for fn in fns:
        T = fits_table(fn)
        print(len(T), 'from', fn)
        TT.append(T)
    T = merge_tables(TT)
    del TT

    print('Types:', Counter(T.type))

    T.flux_g = T.decam_flux[:,1]
    T.flux_r = T.decam_flux[:,2]
    T.flux_z = T.decam_flux[:,4]
    T.flux_ivar_g = T.decam_flux_ivar[:,1]
    T.flux_ivar_r = T.decam_flux_ivar[:,2]
    T.flux_ivar_z = T.decam_flux_ivar[:,4]
    
    T.mag_g, T.magerr_g = NanoMaggies.fluxErrorsToMagErrors(T.flux_g, T.flux_ivar_g)
    T.mag_r, T.magerr_r = NanoMaggies.fluxErrorsToMagErrors(T.flux_r, T.flux_ivar_r)
    T.mag_z, T.magerr_z = NanoMaggies.fluxErrorsToMagErrors(T.flux_z, T.flux_ivar_z)

    T.deflux_g = T.flux_g / T.decam_mw_transmission[:,1]
    T.deflux_r = T.flux_r / T.decam_mw_transmission[:,2]
    T.deflux_z = T.flux_z / T.decam_mw_transmission[:,4]
    T.deflux_ivar_g = T.flux_ivar_g * T.decam_mw_transmission[:,1]**2
    T.deflux_ivar_r = T.flux_ivar_r * T.decam_mw_transmission[:,2]**2
    T.deflux_ivar_z = T.flux_ivar_z * T.decam_mw_transmission[:,4]**2

    T.demag_g, T.demagerr_g = NanoMaggies.fluxErrorsToMagErrors(T.deflux_g, T.deflux_ivar_g)
    T.demag_r, T.demagerr_r = NanoMaggies.fluxErrorsToMagErrors(T.deflux_r, T.deflux_ivar_r)
    T.demag_z, T.demagerr_z = NanoMaggies.fluxErrorsToMagErrors(T.deflux_z, T.deflux_ivar_z)

    T.typex = np.array([t[0] for t in T.type])


    T.mag_w1, T.magerr_w1 = NanoMaggies.fluxErrorsToMagErrors(
        T.wise_flux[:,0], T.wise_flux_ivar[:,0])
    T.mag_w2, T.magerr_w2 = NanoMaggies.fluxErrorsToMagErrors(
        T.wise_flux[:,1], T.wise_flux_ivar[:,1])
    tt = 'P'
    I2 = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) *
                        (T.flux_ivar_z > 0) *
                        (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
                        (T.magerr_g < 0.05) *
                        (T.magerr_r < 0.05) *
                        (T.magerr_z < 0.05) *
                        (T.typex == tt))
    print(len(I2), 'with < 0.05-mag errs and type PSF')
    plt.clf()
    plt.hist(T.mag_w1[I2], bins=100, range=[12,24], histtype='step', color='b')
    plt.hist(T.mag_w2[I2], bins=100, range=[12,24], histtype='step', color='g')
    plt.xlabel('WISE mag')
    ps.savefig()

    plt.clf()
    plt.hist(T.magerr_w1[I2], bins=100, range=[0,1], histtype='step', color='b')
    plt.hist(T.magerr_w2[I2], bins=100, range=[0,1], histtype='step', color='g')
    plt.xlabel('WISE mag errors')
    ps.savefig()

    I2 = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) *
                        (T.flux_ivar_z > 0) *
                        (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
                        (T.magerr_g < 0.05) *
                        (T.magerr_r < 0.05) *
                        (T.magerr_z < 0.05) *
                        (T.typex == tt) *
                        (T.magerr_w1 < 0.05))
    #(T.magerr_w2 < 0.1) *
    print(len(I2), 'with < 0.05-mag errs and type PSF and W1 errors < 0.1')

    Q1 = fits_table('dr3.1/external/survey-dr3-DR12Q.fits')
    Q2 = fits_table('dr3.1/external/DR12Q.fits', columns=['z_pipe'])
    Q1.add_columns_from(Q2)
    I = np.flatnonzero(Q1.objid >= 0)
    Q1.cut(I)
    print(len(Q1), 'sources with DR12Q matches')
    Q = Q1
    Q.typex = np.array([t[0] for t in Q.type])
    Q.mag_w1, Q.magerr_w1 = NanoMaggies.fluxErrorsToMagErrors(
        Q.wise_flux[:,0], Q.wise_flux_ivar[:,0])
    Q.mag_w2, Q.magerr_w2 = NanoMaggies.fluxErrorsToMagErrors(
        Q.wise_flux[:,1], Q.wise_flux_ivar[:,1])
    Q.flux_g = Q.decam_flux[:,1]
    Q.flux_r = Q.decam_flux[:,2]
    Q.flux_z = Q.decam_flux[:,4]
    Q.flux_ivar_g = Q.decam_flux_ivar[:,1]
    Q.flux_ivar_r = Q.decam_flux_ivar[:,2]
    Q.flux_ivar_z = Q.decam_flux_ivar[:,4]
    Q.deflux_g = Q.flux_g / Q.decam_mw_transmission[:,1]
    Q.deflux_r = Q.flux_r / Q.decam_mw_transmission[:,2]
    Q.deflux_z = Q.flux_z / Q.decam_mw_transmission[:,4]
    Q.deflux_ivar_g = Q.flux_ivar_g * Q.decam_mw_transmission[:,1]**2
    Q.deflux_ivar_r = Q.flux_ivar_r * Q.decam_mw_transmission[:,2]**2
    Q.deflux_ivar_z = Q.flux_ivar_z * Q.decam_mw_transmission[:,4]**2
    Q.demag_g, Q.demagerr_g = NanoMaggies.fluxErrorsToMagErrors(Q.deflux_g, Q.deflux_ivar_g)
    Q.demag_r, Q.demagerr_r = NanoMaggies.fluxErrorsToMagErrors(Q.deflux_r, Q.deflux_ivar_r)
    Q.demag_z, Q.demagerr_z = NanoMaggies.fluxErrorsToMagErrors(Q.deflux_z, Q.deflux_ivar_z)
    I = np.flatnonzero((Q.flux_ivar_g > 0) * (Q.flux_ivar_r > 0) *
                        (Q.flux_ivar_z > 0) *
                        (Q.flux_g > 0) * (Q.flux_r > 0) * (Q.flux_z > 0) *
                        (Q.demagerr_g < 0.05) *
                        (Q.demagerr_r < 0.05) *
                        (Q.demagerr_z < 0.05) *
                        (Q.typex == tt) *
                        (Q.magerr_w1 < 0.05))    
    Q.cut(I)
    print(len(Q), 'DR12Q-matched entries of type PSF with g,r,z,W1 errs < 0.05')
    
    plt.clf()
    loghist(T.demag_g[I2] - T.demag_r[I2], T.demag_z[I2] - T.mag_w1[I2],
             nbins=200, range=((-0.5,2.0),(-3,4)))
    plt.xlabel('g - r (mag)')
    plt.ylabel('z - W1 (mag)')
    ps.savefig()

    #Q.cut(np.argsort(Q.z_pipe))
    plt.clf()
    plt.scatter(Q.demag_g - Q.demag_r, Q.demag_z - Q.mag_w1, c=Q.z_pipe, s=5)
    plt.colorbar(label='QSO redshift')
    plt.xlabel('g - r (mag)')
    plt.ylabel('z - W1 (mag)')
    ps.savefig()

    plt.figure(2)
    from scipy.ndimage.filters import gaussian_filter
    import matplotlib.cm
    xlo,xhi,ylo,yhi = [-0.25, 1.75, -2.5, 2.5]
    plt.clf()
    H,xe,ye = loghist(T.demag_g[I2] - T.demag_r[I2], T.demag_z[I2] - T.mag_w1[I2],
                      nbins=(400,200), range=((xlo,xhi),(ylo,yhi)), imshowargs=dict(cmap='Greys'),
                      hot=False, docolorbar=False)
    I = np.flatnonzero(Q.z_pipe < 10.)
    QH,nil,nil = np.histogram2d(Q.demag_g[I] - Q.demag_r[I], Q.demag_z[I] - Q.mag_w1[I],
                       bins=200, range=((xlo,xhi),(ylo,yhi)))
    QH = gaussian_filter(QH.T, 3.)
    c = plt.contour(QH, 8, extent=[xe.min(), xe.max(), ye.min(), ye.max()], colors='k')
    plt.axis([xlo,xhi,ylo,yhi])
    plt.xlabel('g - r (mag)')
    plt.ylabel('z - W1 (mag)')

    mx,my,mz = [],[],[]
    # I = np.argsort(Q.z_pipe)
    # for i in range(len(Q)/1000):
    #     J = I[i*1000:][:1000]
    #     mx.append(np.median(Q.demag_g[J] - Q.demag_r[J]))
    #     my.append(np.median(Q.demag_z[J] - Q.mag_w1[J]))
    #     mz.append(np.median(Q.z_pipe[J]))
    # plt.scatter(mx,my, c=mz)
    # plt.colorbar(label='QSO Redshift')
    # ps.savefig()

        
    zvals = np.arange(0, 3.61, 0.1)
    for zlo,zhi in zip(zvals, zvals[1:]):
         J = np.flatnonzero((Q.z_pipe >= zlo) * (Q.z_pipe < zhi))
         mx.append(np.median(Q.demag_g[J] - Q.demag_r[J]))
         my.append(np.median(Q.demag_z[J] - Q.mag_w1[J]))
         mz.append(np.median(Q.z_pipe[J]))
    # plt.scatter(mx,my, c=mz, marker='o-')
    # plt.colorbar(label='QSO Redshift')
    for i in range(len(mx)-1):
        c = matplotlib.cm.viridis(0.8 * i / (len(mx)-1))
        plt.plot([mx[i], mx[i+1]], [my[i],my[i+1]], '-', color=c, lw=4)
    plt.savefig('qso-wise.png')
    plt.savefig('qso-wise.pdf')

    xlo,xhi,ylo,yhi = [-0.25, 1.75, -0.25, 2.5]
    plt.clf()
    H,xe,ye = loghist(T.demag_g[I2] - T.demag_r[I2], T.demag_r[I2] - T.demag_z[I2],
                      nbins=(400,200), range=((xlo,xhi),(ylo,yhi)), imshowargs=dict(cmap='Greys'),
                      hot=False, docolorbar=False)

    #I3 = np.random.permutation(I2)[:1000]
    #plt.plot(T.demag_g[I3] - T.demag_r[I3], T.demag_r[I3] - T.demag_z[I3], 'r.')
    
    I = np.flatnonzero(Q.z_pipe < 10.)
    QH,nil,nil = np.histogram2d(Q.demag_g[I] - Q.demag_r[I], Q.demag_r[I] - Q.demag_z[I],
                       bins=200, range=((xlo,xhi),(ylo,yhi)))
    QH = gaussian_filter(QH.T, 3.)
    c = plt.contour(QH, 8, extent=[xe.min(), xe.max(), ye.min(), ye.max()], colors='k')
    plt.axis([xlo,xhi,ylo,yhi])
    plt.xlabel('g - r (mag)')
    plt.ylabel('r - z (mag)')
    mx,my,mz = [],[],[]
    zvals = np.arange(0, 3.61, 0.1)
    for zlo,zhi in zip(zvals, zvals[1:]):
         J = np.flatnonzero((Q.z_pipe >= zlo) * (Q.z_pipe < zhi))
         mx.append(np.median(Q.demag_g[J] - Q.demag_r[J]))
         my.append(np.median(Q.demag_r[J] - Q.demag_z[J]))
         mz.append(np.median(Q.z_pipe[J]))
    for i in range(len(mx)-1):
        c = matplotlib.cm.viridis(0.8 * i / (len(mx)-1))
        plt.plot([mx[i], mx[i+1]], [my[i],my[i+1]], '-', color=c, lw=4)

    plt.savefig('qso-optical.png')
    plt.savefig('qso-optical.pdf')
    plt.figure(1)


    # I = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) * (T.flux_ivar_z > 0))
    # print(len(I), 'with g,r,z fluxes')
    # I = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) * (T.flux_ivar_z > 0) *
    #                    (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0))
    # print(len(I), 'with positive g,r,z fluxes')
    # I = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) * (T.flux_ivar_z > 0) *
    #                    (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
    #                    (T.magerr_g < 0.2) * (T.magerr_r < 0.2) * (T.magerr_z < 0.2))
    # print(len(I), 'with < 0.2-mag errs')
    # I = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) * (T.flux_ivar_z > 0) *
    #                    (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
    #                    (T.magerr_g < 0.1) * (T.magerr_r < 0.1) * (T.magerr_z < 0.1))
    # print(len(I), 'with < 0.1-mag errs')
    # 
    # I2 = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) * (T.flux_ivar_z > 0) *
    #                     (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
    #                     (T.magerr_g < 0.05) * (T.magerr_r < 0.05) * (T.magerr_z < 0.05))
    # print(len(I2), 'with < 0.05-mag errs')

    #ha = dict(nbins=200, range=((-0.5, 2.5), (-0.5, 2.5)))
    ha = dict(nbins=400, range=((-0.5, 2.5), (-0.5, 2.5)))
    plt.clf()
    #plothist(T.mag_g[I] - T.mag_r[I], T.mag_r[I] - T.mag_z[I], 200)
    #loghist(T.mag_g[I] - T.mag_r[I], T.mag_r[I] - T.mag_z[I], **ha)
    loghist(T.demag_g[I] - T.demag_r[I], T.demag_r[I] - T.demag_z[I], **ha)
    plt.xlabel('g - r (mag)')
    plt.ylabel('r - z (mag)')
    ps.savefig()

    hists = []
    hists2 = []
    for tt,name in [('P', 'PSF'), ('E', 'EXP'), ('D', 'DeV')]:
        I = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) *
                           (T.flux_ivar_z > 0) *
                           (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
                           (T.magerr_g < 0.1) * (T.magerr_r < 0.1) *(T.magerr_z < 0.1) *
                           (T.typex == tt))
        print(len(I), 'with < 0.1-mag errs and type', name)

        # plt.clf()
        # H,xe,ye = loghist(T.mag_g[I] - T.mag_r[I], T.mag_r[I] - T.mag_z[I], **ha)
        # plt.xlabel('g - r (mag)')
        # plt.ylabel('r - z (mag)')
        # plt.title('Type = %s' % name)
        # ps.savefig()

        plt.clf()
        H,xe,ye = loghist(T.demag_g[I] - T.demag_r[I], T.demag_r[I] - T.demag_z[I], **ha)

        # Keeping the dereddened color-color histograms
        hists.append(H.T)

        plt.xlabel('g - r (mag)')
        plt.ylabel('r - z (mag)')
        plt.title('Type = %s, dereddened' % name)
        ps.savefig()

        I2 = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) *
                            (T.flux_ivar_z > 0) *
                            (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
                            (T.magerr_g < 0.05) *
                            (T.magerr_r < 0.05) *
                            (T.magerr_z < 0.05) *
                            (T.typex == tt))
        print(len(I2), 'with < 0.05-mag errs and type', name)

        plt.clf()
        H,xe,ye = loghist(T.demag_g[I2] - T.demag_r[I2], T.demag_r[I2] - T.demag_z[I2], **ha)
        hists2.append(H.T)
        plt.xlabel('g - r (mag)')
        plt.ylabel('r - z (mag)')
        plt.title('Type = %s, dereddened, 5%% errs' % name)
        ps.savefig()

    for H in hists:
        H /= H.max()
    #for H in hists2:
    #    H /= H.max()
    #hists2 = [np.clip(H / np.percentile(H.ravel(), 99), 0, 1) for H in hists2]
    hists2 = [np.clip(H / np.percentile(H.ravel(), 99.9), 0, 1) for H in hists2]

    rgbmap = np.dstack((hists[2], hists[0], hists[1]))
    plt.clf()
    ((xlo,xhi),(ylo,yhi)) = ha['range']
    plt.imshow(rgbmap, interpolation='nearest', origin='lower', extent=[xlo,xhi,ylo,yhi])
    plt.axis([0,2,0,2])
    plt.xlabel('g - r (mag)')
    plt.ylabel('r - z (mag)')
    plt.title('Red: DeV, Blue: Exp, Green: PSF')
    ps.savefig()

    plt.clf()
    plt.imshow(np.sqrt(rgbmap), interpolation='nearest', origin='lower', extent=[xlo,xhi,ylo,yhi])
    plt.axis([0,2,0,2])
    plt.xlabel('g - r (mag)')
    plt.ylabel('r - z (mag)')
    plt.title('Red: DeV, Blue: Exp, Green: PSF')
    ps.savefig()

    # For a white-background plot, mix colors like paint
    for hr,hg,hb in [(hists[2], hists[0], hists[1]),
                     (hists2[2], hists2[0], hists2[1]),]:
        H,W = hr.shape
        for mapping in [lambda x: x]: #, lambda x: np.sqrt(x), lambda x: x**2]:
            red = np.ones((H,W,3))
            red[:,:,1] = 1 - mapping(hr)
            red[:,:,2] = 1 - mapping(hr)
            # in matplotlib, 'green'->(0, 0.5, 0)
            green = np.ones((H,W,3))
            green[:,:,0] = 1 - mapping(hg)
            green[:,:,1] = 1 - 0.5*mapping(hg)
            green[:,:,2] = 1 - mapping(hg)
            blue = np.ones((H,W,3))
            blue[:,:,0] = 1 - mapping(hb)
            blue[:,:,1] = 1 - mapping(hb)
            plt.clf()
            plt.imshow(red * green * blue, origin='lower', interpolation='nearest',
                       extent=[xlo,xhi,ylo,yhi], aspect='auto')
            plt.xlabel('g - r (mag)')
            plt.ylabel('r - z (mag)')
            plt.xticks(np.arange(0, 2.1, 0.5))
            plt.yticks(np.arange(0, 2.1, 0.5))
            plt.axis([-0.25,2,0,2])
            plt.title('Red: DeV, Blue: Exp, Green: PSF')
            ps.savefig()

            plt.figure(2)
            plt.clf()
            plt.imshow(red * green * blue, origin='lower', interpolation='nearest',
                       extent=[xlo,xhi,ylo,yhi], aspect='auto')
            plt.xlabel('g - r (mag)')
            plt.ylabel('r - z (mag)')
            plt.xticks(np.arange(0, 2.1, 0.5))
            plt.yticks(np.arange(0, 2.1, 0.5))
            plt.axis([0,2,-0.25,2])
            plt.text(0.7, 0.1, 'PSF', ha='center', va='center', color='k')
            plt.text(0.6, 0.7, 'EXP', ha='center', va='center', color='k')
            plt.text(1.5, 0.6, 'DEV', ha='center', va='center', color='k')
            plt.savefig('color-type.pdf')
            plt.figure(1)

    sys.exit(0)

            
    np.random.seed(42)

    T.gr = T.mag_g - T.mag_r
    T.rz = T.mag_r - T.mag_z

    for tt,name in [('P', 'PSF'), ('E', 'EXP'), ('D', 'DeV')]:
        I = np.flatnonzero((T.flux_ivar_g > 0) * (T.flux_ivar_r > 0) *
                           (T.flux_ivar_z > 0) *
                           (T.flux_g > 0) * (T.flux_r > 0) * (T.flux_z > 0) *
                           (T.magerr_g < 0.1) * (T.magerr_r < 0.1) *(T.magerr_z < 0.1) *
                           # Bright cut
                           (T.mag_r > 16.) *

                           # Contamination cut
                           (T.decam_fracflux[:,2] < 0.5) *

                           # Mag range cut
                           (T.mag_r > 19.) *
                           (T.mag_r < 20.) *
                           
                           (T.typex == tt))
        print(len(I), 'with < 0.1-mag errs and type', name)

        # plt.clf()
        # ha = dict(histtype='step', range=(16, 24), bins=100)
        # plt.hist(T.mag_g[I], color='g', **ha)
        # plt.hist(T.mag_r[I], color='r', **ha)
        # plt.hist(T.mag_z[I], color='m', **ha)
        # plt.title('Type %s' % name)
        # ps.savefig()

        J = np.random.permutation(I)

        if tt == 'D':
            J = J[T.shapedev_r[J] < 3.]

        J = J[:100]
        rzbin = np.argsort(T.rz[J])
        rzblock = (rzbin / 10).astype(int)
        K = np.lexsort((T.gr[J], rzblock))
        #print('sorted rzblock', rzblock[K])
        #print('sorted rzbin', rzbin[K])
        J = J[K]

        # plt.clf()
        # plt.hist(T.decam_fracflux[J,2], label='fracflux_r', histtype='step', bins=20)
        # plt.hist(T.decam_fracmasked[J,2], label='fracmasked_r', histtype='step', bins=20)
        # plt.legend()
        # plt.title('Type %s' % name)
        # ps.savefig()

        #print('fracflux r', T.decam_fracflux[J,2])
        #print('fracmasked r', T.decam_fracmasked[J,2])
        #print('anymasked r', T.decam_anymask[J,2])

        imgs = []
        imgrow = []
        stackrows = []
        for i in J:
            fn = 'cutouts/cutout_%.4f_%.4f.jpg' % (T.ra[i], T.dec[i])
            if not os.path.exists(fn):
                url = 'http://legacysurvey.org/viewer/jpeg-cutout/?layer=decals-dr3&pixscale=0.262&size=25&ra=%f&dec=%f' % (T.ra[i], T.dec[i])
                print('URL', url)
                cmd = 'wget -O %s.tmp "%s" && mv %s.tmp %s' % (fn, url, fn, fn)
                os.system(cmd)
            img = plt.imread(fn)
            #print('Image', img.shape)
            extra = ''
            if tt == 'D':
                extra = ', shapedev_r %.2f' % T.shapedev_r[i]
            elif tt == 'E':
                extra = ', shapeexp_r %.2f' % T.shapeexp_r[i]

            print(name, 'RA,Dec %.4f,%.4f, g/r/z %.2f, %.2f, %.2f, fracflux_r %.3f, fracmasked_r %.3f, anymasked_r %4i%s' % (
                T.ra[i], T.dec[i], T.mag_g[i], T.mag_r[i], T.mag_z[i],
                T.decam_fracflux[i,2], T.decam_fracmasked[i,2], T.decam_anymask[i,2], extra))

            imgrow.append(img)
            if len(imgrow) == 10:
                stack = np.hstack(imgrow)
                print('stacked row:', stack.shape)
                stackrows.append(stack)

                imgs.append(imgrow)
                imgrow = []


        stack = np.vstack(stackrows)
        print('Stack', stack.shape)
        plt.clf()
        plt.imshow(stack, interpolation='nearest', origin='lower')
        plt.xticks([])
        plt.yticks([])
        plt.title('Type %s' % name)
        ps.savefig()
        

    # Wrap-around at RA=300
    # rax = T.ra + (-360 * T.ra > 300.)
    # 
    # rabins = np.arange(-60., 300., 0.2)
    # decbins = np.arange(-20, 35, 0.2)
    # 
    # print('RA bins:', len(rabins))
    # print('Dec bins:', len(decbins))
    #
    # for name,cut in [(None, 'All sources'),
    #                  (T.type == 'PSF '), 'PSF'),
    #                  (T.type == 'SIMP'), 'SIMP'),
    #                  (T.type == 'DEV '), 'DEV'),
    #                  (T.type == 'EXP '), 'EXP'),
    #                  (T.type == 'COMP'), 'COMP'),
    #                  ]:
    #                  
    # H,xe,ye = np.histogram2d(T.ra, T.dec, bins=(rabins, decbins))
    # print('H shape', H.shape)
    # 
    # H = H.T
    # 
    # H /= (rabins[1:] - rabins[:-1])[np.newaxis, :]
    # H /= ((decbins[1:] - decbins[:-1]) * np.cos(np.deg2rad((decbins[1:] + decbins[:-1]) / 2.))))[:, np.newaxis]
    # 
    # plt.clf()
    # plt.imshow(H, extent=(rabins[0], rabins[-1], decbins[0], decbins[-1]), interpolation='nearest', origin='lower',
    #            vmin=0)
    # cbar = plt.colorbar()
    # cbar.set_label('Source density per square degree')
    # plt.xlim(rabins[-1], rabins[0])
    # plt.xlabel('RA (deg)')
    # plt.ylabel('Dec (deg)')
    # ps.savefig()



    '''
    for j in range(0, col - 1):
        Im_n60[i, j] = Im_n60[i, j] + np.random.uniform(0, 60)

# Imprimir imagen con ruido (0,60) en escala de grises
plt.figure()
plt.gray()
plt.imshow(Im_n60)
plt.title("Imagen con ruido (0,60)")

# MSE entre imagen original e imagen con filtro uniforme de 3 x 3 en escala de grises
Im_f1u = filters.uniform_filter(Im_n60, 3)
print("MSE para uniforme 3 x 3 con ruido (0,60): " +
      str(fun.my_mse(Im_f1u, Im_g)))

# MSE entre imagen original e imagen con filtro Gaussiano de 0.5 en escala de grises
Im_f1g = filters.gaussian_filter(Im_n60, 0.5)
print("MSE para gaussiano 1 con ruido (0,60): " +
      str(fun.my_mse(Im_f1g, Im_g)))

# Imprimir imagen con filtro uniforme 3 x 3 en escala de grises
plt.figure()
plt.gray()
plt.imshow(Im_f1u)
plt.title("Imagen con filtro uniforme de 3 x 3")

# Imprimir imagen con filtro Gaussiano 0.5 en escala de grises
plt.figure()
plt.gray()
plt.imshow(Im_f1u)
plt.title("Imagen con filtro Gaussiano 0.5")
Example #54
0
def optimize_image(layer_tensor,
                   image,
                   num_iterations=10,
                   step_size=3.0,
                   tile_size=400,
                   show_gradient=False):
    """
    Use gradient ascent to optimize an image so it maximizes the mean value of the given layer_tensor

    :param layer_tensor: Reference to a tensor that will be maximized.
    :param image: Input image used as the starting point.
    :param num_iterations: Number of optimization iterations to perform.
    :param step_size: Scale for each step of the gradient ascent.
    :param tile_size: Size of the tiles when calculating the gradient.
    :param show_gradient: Plot the gradient in each iterations.

    :return:
    """

    # Copy the image so we don't overwrite the original image.
    img = image.copy()

    print("Image before:")
    plot_image(img)

    print("Processing image:", end="")

    # Use TensorFlow to get the mathematical function for the
    # gradient of the given layer-tensor with regard to the
    # input image. This may cause TensorFlow to add the same
    # math-expressions to the graph each time this function is called.
    # It may use a lot of RAM and could be moved outside the function.

    gradient = model.get_gradient(layer_tensor)

    for i in range(num_iterations):
        # Calculate the value of the gradient.
        # This tells us how to change the image so as to
        # maximize the mean of the given layer-tensor.
        grad = tiled_gradient(gradient=gradient, image=img)

        # Blur the gradient with different amounts and add
        # them together. The blur amount is also increased
        # during the optimization. This was found to give
        # nice, smooth images. You can try and change the formulas.
        # The blur-amount is called sigma (0=no blur, 1=low blur, etc.)
        # We could call gaussian_filter(grad, sigma=(sigma, sigma, 0.0))
        # which would not blur the colour-channel. This tends to
        # give psychadelic / pastel colours in the resulting images.
        # When the colour-channel is also blurred the colours of the
        # input image are mostly retained in the output image.

        sigma = (i * 4.0) / num_iterations + 0.5
        grad_smooth1 = gaussian_filter(grad, sigma=sigma)
        grad_smooth2 = gaussian_filter(grad, sigma=sigma * 2)
        grad_smooth3 = gaussian_filter(grad, sigma=sigma * 0.5)
        grad = (grad_smooth1 + grad_smooth2 + grad_smooth3)

        # Scale the step-size according to the gradient-values.
        # This may not be necessary because the tiled-gradient
        # is already normalized

        step_size_scaled = step_size / (np.std(grad) + 1e-8)

        # Update the image by following the gradient.
        img += grad * step_size_scaled

        if show_gradient:
            # Print statistics for the gradient.
            msg = "Gradient min: {0:>9.6f}, max: {1:>9.6f}, stepsize: {2:>9.2f}"
            print(msg.format(grad.min(), grad.max(), step_size_scaled))

            # Plot the gradient.
            plot_gradient(grad)
        else:
            # Otherwise show a little progress-indicator.
            print(". ", end="")

    print()
    print("Image after:")
    plot_image(img)

    return img
def main(args):
    if len(args) != 5:
        print("Usage: runmodel.py infile prior [-o/-d] [outfile/outdir]")
        print(
            "If -o is specified, then all predictions are dumped to a hickle.")
        print(
            "Else, all predictions are dumped to images in the directory specified."
        )
        print(
            "If 'prior' is 'extract', then this program will instead extract an existing predictions hickle into the specified output directory."
        )
        return

    infile = args[1]
    prior = args[2]
    outopt = args[3]
    outfile = args[4]

    if prior == "extract":
        predictions = hickle.load(infile)
        if not os.path.exists(outfile):
            os.makedirs(outfile)

        for p in range(predictions.shape[0]):
            #arr=predictions[p]-np.min(predictions[p])
            #arr=np.abs(predictions[p])
            #arr=np.abs(predictions[p])
            # Scale the array:
            #print(arr.shape)
            #arr=arr/arr.max()
            #arr=arr*255.0
            im = misc.imresize(predictions[p], (480, 640)).astype("float32")
            im = im / im.max()
            im = filters.gaussian_filter(im, 8).astype("float32")
            # We should probably now normalize the image:
            #im=im/np.max(im)
            #im=softmax(im)
            print(im.max())
            print(im.min())
            im[im < im.mean()] = 0
            im = im / im.max()
            # Todo: consider thresholding the image to remove all noticable large regions of activation.
            #im=softmax(im)
            print(im.max())
            print(im.min())
            misc.imsave(os.path.join(outfile, "%d.png" % p), im)
            print("Done")
        return

    indata = hickle.load(infile)
    m = model.PredSaliencyModel(
        None, prior
    )  # Prior is passed as a filename and the first argument has yet to be defined.

    # Todo: figure out if "indata" is actually formatted correctly for this application.
    predictions = m.predict(indata)

    if outopt == '-o':
        print('predictions.shape:')
        print(predictions.shape)
        hickle.dump(predictions, outfile)
    else:
        predictions = predictions[
            0]  # IIRC, there's a useless first dimension in each model output.
        if not os.path.exists(outfile):
            os.makedirs(outfile)

        for p in range(predictions.shape[0]):
            misc.imsave(os.path.join(outfile, "%d.png" % p), predictions[p])
Example #56
0
def recursive_optimize(layer_tensor,
                       image,
                       num_repeats=4,
                       rescale_facotr=0.7,
                       blend=0.2,
                       num_iterations=10,
                       step_size=3.0,
                       tile_size=400):
    """
    Recursively blur and downscale the input image.
    Each downscaled image is run through the optimize_image()
    function to amplify the patterns that the Inception model sess.

    :param Input: Input image used as the starting point.
    :param num_repeats: Number of times to downscale the image.
    :param rescale_facotr: Downscaling factor for the image.
    :param blend: Factor for blending the original and processed images.

    Parameters passed to optimize_image()
    :param num_iterations: Number of optimization iterations to perform.
    :param step_size: Scale for each step of the gradient ascent.
    :param tile_size: Size of the tiles when calculating the gradient.
    :param layer_tensor: Reference to a tensor that will be maximized.

    :return:
    """

    # Do a recursive step?
    if num_repeats > 0:
        # Blur the input image to prevent artifacts when downscaling.
        # The blur amount is controlled by sigma. Note that the
        # colour-channel is not blurred as it would make the image grey.
        sigma = 0.5
        img_blur = gaussian_filter(image, sigma=(sigma, sigma, 0.0))

        # Downscale the image.
        img_downscaled = resize_image(image=img_blur, factor=rescale_facotr)

        # Recursive call to this function.
        # Subtract one from num_repeats and use the downscaled image.
        img_result = recursive_optimize(layer_tensor=layer_tensor,
                                        image=img_downscaled,
                                        num_repeats=num_repeats - 1,
                                        rescale_facotr=rescale_facotr,
                                        blend=blend,
                                        num_iterations=num_iterations,
                                        step_size=step_size,
                                        tile_size=tile_size)

        # Up scale the resulting image back to its original size
        img_upscaled = resize_image(image=img_result, size=image.shape)

        # Blend the original and precessed images.
        image = blend * image + (1.0 - blend) * img_upscaled

    print("Recursive level:", num_repeats)

    img_result = optimize_image(layer_tensor=layer_tensor,
                                image=image,
                                num_iterations=num_iterations,
                                step_size=step_size,
                                tile_size=tile_size)

    return img_result
Example #57
0
def train(upscaling_factor,
          residual_blocks,
          feature_size,
          path_prediction,
          checkpoint_dir,
          img_width,
          img_height,
          img_depth,
          subpixel_NN,
          nn,
          batch_size=1,
          div_patches=4,
          epochs=12):
    traindataset = Train_dataset(batch_size)
    iterations_train = math.ceil(
        (len(traindataset.subject_list) * 0.8) / batch_size)
    num_patches = traindataset.num_patches

    # ##========================== DEFINE MODEL ============================##
    t_input_gen = tf.placeholder(
        'float32',
        [int((batch_size * num_patches) / div_patches), None, None, None, 1],
        name='t_image_input_to_SRGAN_generator')
    t_target_image = tf.placeholder('float32', [
        int((batch_size * num_patches) / div_patches), img_width, img_height,
        img_depth, 1
    ],
                                    name='t_target_image')
    t_input_mask = tf.placeholder('float32', [
        int((batch_size * num_patches) / div_patches), img_width, img_height,
        img_depth, 1
    ],
                                  name='t_image_input_mask')
    ae_real_z = tf.placeholder(
        'float32',
        [int((batch_size * num_patches) / div_patches), 16, 16, 12, 30],
        name='ae_real_z')
    ae_fake_z = tf.placeholder(
        'float32',
        [int((batch_size * num_patches) / div_patches), 16, 16, 12, 30],
        name='ae_fake_z')

    net_gen = generator(input_gen=t_input_gen,
                        kernel=3,
                        nb=residual_blocks,
                        upscaling_factor=upscaling_factor,
                        img_height=img_height,
                        img_width=img_width,
                        img_depth=img_depth,
                        subpixel_NN=subpixel_NN,
                        nn=nn,
                        feature_size=feature_size,
                        is_train=True,
                        reuse=False)
    net_d, disc_out_real = discriminator(input_disc=t_target_image,
                                         kernel=3,
                                         is_train=True,
                                         reuse=False)
    _, disc_out_fake = discriminator(input_disc=net_gen.outputs,
                                     kernel=3,
                                     is_train=True,
                                     reuse=True)

    # test
    gen_test = generator(t_input_gen,
                         kernel=3,
                         nb=residual_blocks,
                         upscaling_factor=upscaling_factor,
                         img_height=img_height,
                         img_width=img_width,
                         img_depth=img_depth,
                         subpixel_NN=subpixel_NN,
                         nn=nn,
                         feature_size=feature_size,
                         is_train=True,
                         reuse=True)

    # autoencoder
    ae_out = autoencoder(x_auto=t_target_image)

    # ###========================== DEFINE TRAIN OPS ==========================###

    # use disc_out_real in both cases because shape will be equal in disc_out_real and disc_out_fake
    # if not, problems for not specifying input shape for generator

    if np.random.uniform() > 0.1:
        # give correct classifications
        y_gan_real = tf.ones_like(disc_out_real)
        y_gan_fake = tf.zeros_like(disc_out_real)
    else:
        # give wrong classifications (noisy labels)
        y_gan_real = tf.zeros_like(disc_out_real)
        y_gan_fake = tf.ones_like(disc_out_real)

    d_loss_real = tf.reduce_mean(tf.square(disc_out_real -
                                           smooth_gan_labels(y_gan_real)),
                                 name='d_loss_real')
    d_loss_fake = tf.reduce_mean(tf.square(disc_out_fake -
                                           smooth_gan_labels(y_gan_fake)),
                                 name='d_loss_fake')
    d_loss = d_loss_real + d_loss_fake

    # use disc_out_real in both cases because shape will be equal in disc_out_real and disc_out_fake
    # if not, problems for not specifying input shape for generator

    g_gan_loss = 10e-2 * tf.reduce_mean(
        tf.square(disc_out_fake -
                  smooth_gan_labels(tf.ones_like(disc_out_real))),
        name='g_loss_gan')
    mse_loss = tf.reduce_sum(tf.square(net_gen.outputs - t_target_image),
                             axis=[0, 1, 2, 3, 4],
                             name='g_loss_mse')

    dx_real = t_target_image[:, 1:, :, :, :] - t_target_image[:, :-1, :, :, :]
    dy_real = t_target_image[:, :, 1:, :, :] - t_target_image[:, :, :-1, :, :]
    dz_real = t_target_image[:, :, :, 1:, :] - t_target_image[:, :, :, :-1, :]
    dx_fake = net_gen.outputs[:,
                              1:, :, :, :] - net_gen.outputs[:, :-1, :, :, :]
    dy_fake = net_gen.outputs[:, :,
                              1:, :, :] - net_gen.outputs[:, :, :-1, :, :]
    dz_fake = net_gen.outputs[:, :, :,
                              1:, :] - net_gen.outputs[:, :, :, :-1, :]

    gd_loss = tf.reduce_sum(tf.square(tf.abs(dx_real) - tf.abs(dx_fake))) + \
              tf.reduce_sum(tf.square(tf.abs(dy_real) - tf.abs(dy_fake))) + \
              tf.reduce_sum(tf.square(tf.abs(dz_real) - tf.abs(dz_fake)))

    g_loss_mse = mse_loss + g_gan_loss + gd_loss

    g_loss_ae = 10e-2 * tf.reduce_sum(tf.square(ae_real_z - ae_fake_z),
                                      axis=[0, 1, 2, 3, 4],
                                      name='ae_loss') + g_gan_loss

    g_vars = tl.layers.get_variables_with_name('SRGAN_g', True, True)
    d_vars = tl.layers.get_variables_with_name('SRGAN_d', True, True)

    with tf.variable_scope('learning_rate'):
        #lr_v_g = tf.Variable(1e-5, trainable=False)
        lr_v_g = tf.Variable(1e-4, trainable=False)
        lr_v_d = tf.Variable(1e-4, trainable=False)
    global_step = tf.Variable(0, trainable=False)
    decay_rate = 0.5
    decay_steps = 4920  # every 2 epochs (more or less)
    learning_rate_g = tf.train.inverse_time_decay(lr_v_g,
                                                  global_step=global_step,
                                                  decay_rate=decay_rate,
                                                  decay_steps=decay_steps)
    learning_rate_d = tf.train.inverse_time_decay(lr_v_d,
                                                  global_step=global_step,
                                                  decay_rate=decay_rate,
                                                  decay_steps=decay_steps)

    # Optimizers
    g_optim_mse = tf.train.AdamOptimizer(learning_rate_d).minimize(
        g_loss_mse, var_list=g_vars)
    #Adagrad probado no va mejor que sin ae, si converge (5e-5, 1e-5)
    #Adam/RMSprop no converge (5e-5)
    #Adadelta probado no va mejor que sin ae, si converge (5e-5, 1e-4 va peor) va mejor sin lrdecay
    g_optim_ae = tf.train.AdagradOptimizer(5e-5).minimize(g_loss_ae,
                                                          var_list=g_vars)
    d_optim = tf.train.AdamOptimizer(learning_rate_d).minimize(d_loss,
                                                               var_list=d_vars)

    session = tf.Session()
    tl.layers.initialize_global_variables(session)

    session_ae = tf.Session()
    session_ae.run(tf.global_variables_initializer())
    var_list = list()

    for v in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES):
        if 'SRGAN' not in v.name and '9' not in v.name and 'learning_rate' not in v.name and 'beta' not in v.name:
            var_list.append(v)
    saver_ae = tf.train.Saver(var_list)
    saver_ae.restore(session_ae,
                     tf.train.latest_checkpoint(AUTOENCODER_CHECPOINTS))
    initialize_uninitialized_vars(session_ae)

    step = 0

    for j in range(0, epochs):
        for i in range(0, iterations_train):
            ###====================== LOAD DATA ===========================###
            xt_total = traindataset.patches_true(i)
            xm_total = traindataset.mask(i)
            for k in range(0, div_patches):
                print('{}'.format(k))
                xt = xt_total[k *
                              int((batch_size * num_patches) / div_patches):
                              (int((batch_size * num_patches) / div_patches) *
                               k) +
                              int((batch_size * num_patches) / div_patches)]
                xm = xm_total[k *
                              int((batch_size * num_patches) / div_patches):
                              (int((batch_size * num_patches) / div_patches) *
                               k) +
                              int((batch_size * num_patches) / div_patches)]

                # NORMALIZING
                for t in range(0, xt.shape[0]):
                    normfactor = (np.amax(xt[t])) / 2
                    if normfactor != 0:
                        xt[t] = ((xt[t] - normfactor) / normfactor)

                # RESIZING, don't normalize, XT already normalized
                x_generator = zoom(xt, [
                    1, (1 / upscaling_factor), (1 / upscaling_factor),
                    (1 / upscaling_factor), 1
                ])
                x_generator = gaussian_filter(x_generator, sigma=1)
                xgenin = x_generator

                ###========================= train SRGAN =========================###
                # update D
                errd, _ = session.run([d_loss, d_optim], {
                    t_target_image: xt,
                    t_input_gen: xgenin
                })

                if j < 4:
                    errg, errmse, errgan, errgd, _ = session.run(
                        [
                            g_loss_mse, mse_loss, g_gan_loss, gd_loss,
                            g_optim_mse
                        ], {
                            t_input_gen: xgenin,
                            t_target_image: xt,
                            t_input_mask: xm
                        })
                    print(
                        "Epoch [%2d/%2d] [%4d/%4d] [%4d/%4d]: d_loss: %.8f g_loss: %.8f (mse: %.6f gdl: %.6f adv: %.6f)"
                        % (j, epochs, i, iterations_train, k, div_patches - 1,
                           errd, errg, errmse, errgd, errgan))
                else:
                    # loss autoencoder
                    x_pred_ae = session.run(gen_test.outputs,
                                            {t_input_gen: xgenin})
                    ae_fake_z_val = session_ae.run(ae_out['z'],
                                                   {t_target_image: x_pred_ae})
                    ae_real_z_val = session_ae.run(ae_out['z'],
                                                   {t_target_image: xt})
                    # update G
                    errg, errgan, _ = session.run(
                        [g_loss_ae, g_gan_loss, g_optim_ae], {
                            t_input_gen: xgenin,
                            t_target_image: xt,
                            t_input_mask: xm,
                            ae_real_z: ae_real_z_val,
                            ae_fake_z: ae_fake_z_val
                        })

                    print(
                        "Epoch [%2d/%2d] [%4d/%4d] [%4d/%4d]: d_loss: %.8f g_loss: %.8f (adv: %.6f)"
                        % (j, epochs, i, iterations_train, k, div_patches - 1,
                           errd, errg, errgan))

                ###========================= evaluate & save model =========================###

                if k == 1 and i % 20 == 0:
                    if j == 0:
                        x_true_img = xt[0]
                        if normfactor != 0:
                            x_true_img = (
                                (x_true_img + 1) * normfactor)  # denormalize
                        img_pred = nib.Nifti1Image(x_true_img, np.eye(4))
                        img_pred.to_filename(
                            os.path.join(path_prediction,
                                         str(j) + str(i) + 'true.nii.gz'))

                        x_gen_img = xgenin[0]
                        if normfactor != 0:
                            x_gen_img = (
                                (x_gen_img + 1) * normfactor)  # denormalize
                        img_pred = nib.Nifti1Image(x_gen_img, np.eye(4))
                        img_pred.to_filename(
                            os.path.join(path_prediction,
                                         str(j) + str(i) + 'gen.nii.gz'))

                    x_pred = session.run(gen_test.outputs,
                                         {t_input_gen: xgenin})
                    x_pred_img = x_pred[0]
                    if normfactor != 0:
                        x_pred_img = (
                            (x_pred_img + 1) * normfactor)  # denormalize
                    img_pred = nib.Nifti1Image(x_pred_img, np.eye(4))
                    img_pred.to_filename(
                        os.path.join(path_prediction,
                                     str(j) + str(i) + '.nii.gz'))

                    # x_auto = session_ae.run(ae_out['y'], {t_target_image: xt})
                    # x_auto_img = x_auto[0]
                    # if normfactor != 0:
                    #     x_auto_img = ((x_auto_img + 1) * normfactor)  # denormalize
                    # img_pred = nib.Nifti1Image(x_auto_img, np.eye(4))
                    # img_pred.to_filename(
                    #     os.path.join(path_prediction, str(j) + str(i) + 'yayauto.nii.gz'))

        saver = tf.train.Saver()
        saver.save(sess=session, save_path=checkpoint_dir, global_step=step)
        print("Saved step: [%2d]" % step)
        step = step + 1
Example #58
0
    def draw(self) -> None:
        import numpy as np
        from scipy.ndimage.filters import gaussian_filter
        from pi3d.Camera import Camera
        from pi3d.constants import (
            opengles,
            GL_SRC_ALPHA,
            GL_ONE_MINUS_SRC_ALPHA,
            GLsizei,
            GLboolean,
            GLint,
            GL_FLOAT,
            GL_ARRAY_BUFFER,
            GL_UNSIGNED_SHORT,
            GL_TEXTURE_2D,
            GL_UNSIGNED_BYTE,
        )

        time_logging = False

        if self.should_prepare:
            self._prepare()

        if self.lights.alarm_program.factor != -1:
            self.alarm_factor = max(0.001, self.lights.alarm_program.factor)
        else:
            self.alarm_factor = 0

        then = time.time()

        self.display.loop_running()
        now = self.display.time
        self.time_delta = now - self.last_loop
        self.last_loop = now
        self.time_elapsed += self.time_delta

        if time_logging:
            print(f"{time.time() - then} main loop")
            then = time.time()

        # use a sliding window to smooth the spectrum with a gauss function
        # truncating does not save significant time (~3% for this step)

        # new_frame = np.array(self.cava.current_frame, dtype="float32")
        new_frame = gaussian_filter(self.cava.current_frame,
                                    sigma=1.5,
                                    mode="nearest")
        new_frame = new_frame[self.SPECTRUM_CUT:-self.SPECTRUM_CUT]
        new_frame = -0.5 * new_frame**3 + 1.5 * new_frame
        new_frame *= 255
        current_frame = new_frame

        if time_logging:
            print(f"{time.time() - then} spectrum smoothing")
            then = time.time()

        # Value used for circle shake and background color cycle
        # select the first few values and compute their average
        bass_elements = math.ceil(self.BASS_MAX * self.cava.bars)
        self.bass_value = sum(
            current_frame[0:bass_elements]) / bass_elements / 255
        self.bass_value = max(self.bass_value, self.alarm_factor)
        self.total_bass = self.total_bass + self.bass_value
        # the fraction of time that there was bass
        self.bass_fraction = self.total_bass / self.time_elapsed / self.lights.UPS

        self.uniform_values = {
            48: self.width / self.scale,
            49: self.height / self.scale,
            50: self.scale,
            51: self.FFT_HIST,
            52: self.NUM_PARTICLES,
            53: self.PARTICLE_SPAWN_Z,
            54: self.time_elapsed,
            55: self.time_delta,
            56: self.alarm_factor,
            57: self.bass_value,
            58: self.total_bass,
            59: self.bass_fraction,
        }

        # start rendering to the smaller OffscreenTexture
        # we decrease the size of the texture so it only allocates that much memory
        # otherwise it would use as much as the displays size, negating its positive effect
        self.post.ix = int(self.post.ix / self.scale)
        self.post.iy = int(self.post.iy / self.scale)
        opengles.glViewport(
            GLint(0),
            GLint(0),
            GLsizei(int(self.width / self.scale)),
            GLsizei(int(self.height / self.scale)),
        )
        self.post._start()
        self.post.ix = self.width
        self.post.iy = self.height

        self._set_unif(self.background, [48, 49, 54, 56, 58])
        self.background.draw()

        if time_logging:
            print(f"{time.time() - then} background draw")
            then = time.time()

        # enable additive blending so the draw order of overlapping particles does not matter
        opengles.glBlendFunc(1, 1)

        self._set_unif(self.particle_sprite, [53, 54, 59])

        # copied code from pi3d.Shape.draw()
        # we don't need modelmatrices, normals ord textures and always blend
        self.particle_sprite.load_opengl()
        camera = Camera.instance()
        if not camera.mtrx_made:
            camera.make_mtrx()
        self.particle_sprite.MRaw = self.particle_sprite.tr1
        self.particle_sprite.M[0, :, :] = self.particle_sprite.MRaw[:, :]
        self.particle_sprite.M[1, :, :] = np.dot(self.particle_sprite.MRaw,
                                                 camera.mtrx)[:, :]

        # Buffer.draw()
        buf = self.particle_sprite.buf[0]
        buf.load_opengl()
        shader = buf.shader
        shader.use()
        opengles.glUniformMatrix4fv(
            shader.unif_modelviewmatrix,
            GLsizei(2),
            GLboolean(0),
            self.particle_sprite.M.ctypes.data,
        )
        opengles.glUniform3fv(shader.unif_unif, GLsizei(20),
                              self.particle_sprite.unif)
        buf._select()
        opengles.glVertexAttribPointer(shader.attr_vertex, GLint(3), GL_FLOAT,
                                       GLboolean(0), buf.N_BYTES, 0)
        opengles.glEnableVertexAttribArray(shader.attr_vertex)
        opengles.glVertexAttribPointer(shader.attr_texcoord, GLint(2),
                                       GL_FLOAT, GLboolean(0), buf.N_BYTES, 24)
        opengles.glEnableVertexAttribArray(shader.attr_texcoord)
        buf.disp.last_shader = shader
        opengles.glUniform3fv(shader.unif_unib, GLsizei(5), buf.unib)

        opengles.glBindBuffer(GL_ARRAY_BUFFER, self.instance_vbo)
        opengles.glDrawElementsInstanced(
            buf.draw_method,
            GLsizei(buf.ntris * 3),
            GL_UNSIGNED_SHORT,
            0,
            self.NUM_PARTICLES,
        )

        # restore normal blending
        opengles.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

        if time_logging:
            print(f"{time.time() - then} particle draw")
            then = time.time()

        # roll the history one further, insert the current one.
        # we use a texture with four channels eventhough we only need one, refer to this post:
        # https://community.khronos.org/t/updating-textures-per-frame/75020/3
        # basically the gpu converts it anyway, so other formats would be slower
        history = np.zeros(
            (self.FFT_HIST, self.cava.bars - 2 * self.SPECTRUM_CUT, 4),
            dtype="uint8")
        self.fft = np.roll(self.fft, 1, 0)
        self.fft[0] = current_frame
        history[:, :, 0] = self.fft

        if time_logging:
            print(f"{time.time() - then} spectrum roll")
            then = time.time()

        # change the spectrum part of the texture (the lower 256xFFT_HIST pixels)
        opengles.glBindTexture(GL_TEXTURE_2D, self.dynamic_texture._tex)
        iformat = self.dynamic_texture._get_format_from_array(
            history, self.dynamic_texture.i_format)
        opengles.glTexSubImage2D(
            GL_TEXTURE_2D,
            0,
            0,
            self.dynamic_texture.ix,
            history.shape[1],
            history.shape[0],
            iformat,
            GL_UNSIGNED_BYTE,
            history.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)),
        )

        if time_logging:
            print(f"{time.time() - then} glTexImage2D")
            then = time.time()

        self._set_unif(self.spectrum, [48, 49, 51, 52, 53, 54, 55, 57, 58])
        self.spectrum.draw()

        if time_logging:
            print(f"{time.time() - then} spectrum draw")
            then = time.time()

        self._set_unif(self.logo, [48, 49, 51, 54, 57, 58])
        self.logo.draw()

        if time_logging:
            print(f"{time.time() - then} logo draw")
            then = time.time()

        self._set_unif(self.after, [48, 49, 54, 57])
        self.after.draw()

        if time_logging:
            print(f"{time.time() - then} after draw")
            then = time.time()

        self.post._end()

        opengles.glViewport(GLint(0), GLint(0), GLsizei(self.width),
                            GLsizei(self.height))
        self._set_unif(self.post_sprite, [50])
        self.post_sprite.draw()

        if time_logging:
            print(f"{time.time() - then} post draw")
            print(f"scale: {self.scale}")
            print("=====")
Example #59
0
def calculate_polygonal_environment(im: PIL.Image.Image,
                                    baselines: Sequence[Tuple[int, int]] = None,
                                    suppl_obj: Sequence[Tuple[int, int]] = None,
                                    im_feats: np.array = None,
                                    scale: Tuple[int, int] = None):
    """
    Given a list of baselines and an input image, calculates a polygonal
    environment around each baseline.

    Args:
        im (PIL.Image): grayscale input image (mode 'L')
        baselines (sequence): List of lists containing a single baseline per
                              entry.
        suppl_obj (sequence): List of lists containing additional polylines
                              that should be considered hard boundaries for
                              polygonizaton purposes. Can be used to prevent
                              polygonization into non-text areas such as
                              illustrations or to compute the polygonization of
                              a subset of the lines in an image.
        im_feats (numpy.array): An optional precomputed seamcarve energy map.
                                Overrides data in `im`. The default map is
                                `gaussian_filter(sobel(im), 2)`.
        scale (tuple): A 2-tuple (h, w) containing optional scale factors of
                       the input. Values of 0 are used for aspect-preserving
                       scaling. `None` skips input scaling.
    Returns:
        List of lists of coordinates. If no polygonization could be compute for
        a baseline `None` is returned instead.
    """
    if scale is not None and (scale[0] > 0 or scale[1] > 0):
        w, h = im.size
        oh, ow = scale
        if oh == 0:
            oh = int(h * ow/w)
        elif ow == 0:
            ow = int(w * oh/h)
        im = im.resize((ow, oh))
        scale = np.array((ow/w, oh/h))
        # rescale baselines
        baselines = [(np.array(bl) * scale).astype('int').tolist() for bl in baselines]
        # rescale suppl_obj
        if suppl_obj is not None:
            suppl_obj = [(np.array(bl) * scale).astype('int').tolist() for bl in suppl_obj]

    bounds = np.array(im.size, dtype=np.float)
    im = np.array(im)
    if im_feats is None:
         # compute image gradient
        im_feats = gaussian_filter(sobel(im), 2)

    def _ray_intersect_boundaries(ray, direction, aabb):
        """
        Simplified version of [0] for 2d and AABB anchored at (0,0).

        [0] http://gamedev.stackexchange.com/questions/18436/most-efficient-aabb-vs-ray-collision-algorithms
        """
        dir_fraction = np.empty(2, dtype=ray.dtype)
        dir_fraction[direction == 0.0] = np.inf
        dir_fraction[direction != 0.0] = np.divide(1.0, direction[direction != 0.0])

        t1 = (-ray[0]) * dir_fraction[0]
        t2 = (aabb[0] - ray[0]) * dir_fraction[0]
        t3 = (-ray[1]) * dir_fraction[1]
        t4 = (aabb[1] - ray[1]) * dir_fraction[1]

        tmin = max(min(t1, t2), min(t3, t4))
        tmax = min(max(t1, t2), max(t3, t4))

        t = min(x for x in [tmin, tmax] if x >= 0)
        return ray + (direction * t)

    def _extract_patch(env_up, env_bottom, baseline, dir_vec):
        """
        Calculate a line image patch from a ROI and the original baseline.
        """
        upper_polygon = np.concatenate((baseline, env_up[::-1]))
        bottom_polygon = np.concatenate((baseline, env_bottom[::-1]))
        angle = np.arctan2(dir_vec[1], dir_vec[0])

        def _calc_seam(polygon, bias=100):
            """
            Calculates seam between baseline and ROI boundary on one side.

            Adds a baseline-distance-weighted bias to the feature map, masks
            out the bounding polygon and rotates the line so it is roughly
            level.
            """
            MASK_VAL = 99999
            r, c = draw.polygon(polygon[:,1], polygon[:,0])
            c_min, c_max = int(polygon[:,0].min()), int(polygon[:,0].max())
            r_min, r_max = int(polygon[:,1].min()), int(polygon[:,1].max())
            patch = im_feats[r_min:r_max+2, c_min:c_max+2].copy()
            # bias feature matrix by distance from baseline
            mask = np.ones_like(patch)
            for l in zip(baseline[:-1] - (c_min, r_min), baseline[1:] - (c_min, r_min)):
                line_locs = draw.line(l[0][1], l[0][0], l[1][1], l[1][0])
                mask[line_locs] = 0
            dist_bias = distance_transform_cdt(mask)
            # absolute mask
            mask = np.ones_like(patch, dtype=np.bool)
            mask[r-r_min, c-c_min] = False
            # combine weights with features
            patch[mask] = MASK_VAL
            patch += (dist_bias*(np.mean(patch[patch != MASK_VAL])/bias))
            extrema = baseline[(0,-1),:] - (c_min, r_min)
            # scale line image to max 600 pixel width
            scale = min(1.0, 600/(c_max-c_min))
            tform, rotated_patch = _rotate(patch, angle, center=extrema[0], scale=scale, cval=MASK_VAL)
            # ensure to cut off padding after rotation
            x_offsets = np.sort(np.around(tform.inverse(extrema)[:,0]).astype('int'))
            rotated_patch = rotated_patch[:,x_offsets[0]+1:x_offsets[1]]
            # infinity pad for seamcarve
            rotated_patch = np.pad(rotated_patch, ((1, 1), (0, 0)),  mode='constant', constant_values=np.inf)
            r, c = rotated_patch.shape
            # fold into shape (c, r-2 3)
            A = np.lib.stride_tricks.as_strided(rotated_patch, (c, r-2, 3), (rotated_patch.strides[1],
                                                                             rotated_patch.strides[0],
                                                                             rotated_patch.strides[0]))
            B = rotated_patch[1:-1,1:].swapaxes(0, 1)
            backtrack = np.zeros_like(B, dtype='int')
            T = np.empty((B.shape[1]), 'f')
            R = np.arange(-1, len(T)-1)
            for i in np.arange(c-1):
                A[i].min(1, T)
                backtrack[i] = A[i].argmin(1) + R
                B[i] += T
            # backtrack
            seam = []
            j = np.argmin(rotated_patch[1:-1,-1])
            for i in range(c-2, 0, -1):
                seam.append((i+x_offsets[0]+1, j))
                j = backtrack[i, j]
            seam = np.array(seam)[::-1]
            # rotate back
            seam = tform(seam).astype('int')
            # filter out seam points in masked area of original patch/in padding
            seam = seam[seam.min(axis=1)>=0,:]
            m = (seam < mask.shape[::-1]).T
            seam = seam[np.logical_and(m[0], m[1]), :]
            seam = seam[np.invert(mask[seam.T[1], seam.T[0]])]
            seam += (c_min, r_min)
            return seam

        upper_seam = _calc_seam(upper_polygon).astype('int')
        bottom_seam = _calc_seam(bottom_polygon).astype('int')[::-1]
        polygon = np.concatenate(([baseline[0]], upper_seam, [baseline[-1]], bottom_seam))
        return approximate_polygon(polygon, 3).tolist()

    polygons = []
    if suppl_obj is None:
        suppl_obj = []
    for idx, line in enumerate(baselines):
        try:
            # find intercepts with image bounds on each side of baseline
            line = np.array(line, dtype=np.float)
            # calculate magnitude-weighted average direction vector
            lengths = np.linalg.norm(np.diff(line.T), axis=0)
            p_dir = np.mean(np.diff(line.T) * lengths/lengths.sum(), axis=1)
            p_dir = (p_dir.T / np.sqrt(np.sum(p_dir**2,axis=-1)))
            # interpolate baseline
            ls = geom.LineString(line)
            ip_line = [line[0]]
            dist = 10
            while dist < ls.length:
                ip_line.append(np.array(ls.interpolate(dist)))
                dist += 10
            ip_line.append(line[-1])
            ip_line = np.array(ip_line)
            upper_bounds_intersects = []
            bottom_bounds_intersects = []
            for point in ip_line:
                upper_bounds_intersects.append(_ray_intersect_boundaries(point, (p_dir*(-1,1))[::-1], bounds+1).astype('int'))
                bottom_bounds_intersects.append(_ray_intersect_boundaries(point, (p_dir*(1,-1))[::-1], bounds+1).astype('int'))
            # build polygon between baseline and bbox intersects
            upper_polygon = geom.Polygon(ip_line.tolist() + upper_bounds_intersects)
            bottom_polygon = geom.Polygon(ip_line.tolist() + bottom_bounds_intersects)

            # select baselines at least partially in each polygon
            side_a = [geom.LineString(upper_bounds_intersects)]
            side_b = [geom.LineString(bottom_bounds_intersects)]
            for adj_line in baselines[:idx] + baselines[idx+1:] + suppl_obj:
                adj_line = geom.LineString(adj_line)
                if upper_polygon.intersects(adj_line):
                    side_a.append(adj_line)
                elif bottom_polygon.intersects(adj_line):
                    side_b.append(adj_line)
            side_a = unary_union(side_a).buffer(1).boundary
            side_b = unary_union(side_b).buffer(1).boundary
            def _find_closest_point(pt, intersects):
                spt = geom.Point(pt)
                if intersects.type == 'MultiPoint':
                    return min([p for p in intersects], key=lambda x: spt.distance(x))
                elif intersects.type == 'Point':
                    return intersects
                elif intersects.type == 'GeometryCollection' and len(intersects) > 0:
                    t = min([p for p in intersects], key=lambda x: spt.distance(x))
                    if t == 'Point':
                        return t
                    else:
                        return nearest_points(spt, t)[1]
                else:
                    raise Exception('No intersection with boundaries. Shapely intersection object: {}'.format(intersects.wkt))
            # interpolate baseline
            env_up = []
            env_bottom = []
            # find orthogonal (to linear regression) intersects with adjacent objects to complete roi
            for point, upper_bounds_intersect, bottom_bounds_intersect in zip(ip_line, upper_bounds_intersects, bottom_bounds_intersects):
                upper_limit = _find_closest_point(point, geom.LineString([point, upper_bounds_intersect]).intersection(side_a))
                bottom_limit = _find_closest_point(point, geom.LineString([point, bottom_bounds_intersect]).intersection(side_b))
                env_up.append(upper_limit.coords[0])
                env_bottom.append(bottom_limit.coords[0])
            env_up = np.array(env_up, dtype='uint')
            env_bottom = np.array(env_bottom, dtype='uint')
            polygons.append(_extract_patch(env_up, env_bottom, line.astype('int'), p_dir))
        except Exception as e:
            polygons.append(None)

    if scale is not None:
        polygons = [(np.array(pol)/scale).astype('uint').tolist() if pol is not None else None for pol in polygons]
    return polygons
Example #60
-1
def elastic_distortion(image, alpha, sigma):
    s = image.shape
    dx = gaussian_filter(random_state.rand(*s) * 2 - 1, sigma, mode="constant", cval=0) * alpha
    dy = gaussian_filter(random_state.rand(*s) * 2 - 1, sigma, mode="constant", cval=0) * alpha
    x, y = np.meshgrid(np.arange(s[0]), np.arange(s[1]))
    indices = np.reshape(y+dy, (-1, 1)), np.reshape(x+dx, (-1, 1))
    return map_coordinates(image, indices, order=1).reshape(s)