Advertisement
IlidanBabyRage

seam carve

Jan 29th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.57 KB | None | 0 0
  1. import numpy as np
  2. from skimage.io import imread, imsave
  3.  
  4.  
  5. def get_grad(img_lum, mask):
  6.     grad_x = np.zeros_like(img_lum)
  7.     grad_y = np.zeros_like(img_lum)
  8.     grad_y[1:-1,:] = img_lum[2:,:] - img_lum[:-2,:]
  9.     grad_x[:,1:-1] = img_lum[:,2:] - img_lum[:,:-2]
  10.     grad_y[0,:]    = img_lum[1, :] - img_lum[0, :]
  11.     grad_x[:,0]    = img_lum[:, 1] - img_lum[:, 0]
  12.     grad_y[-1,:]   = img_lum[-1,:] - img_lum[-2,:]
  13.     grad_x[:,-1]   = img_lum[:,-1] - img_lum[:,-2]    
  14.     #normalize to -1, 1
  15.     #grad_x = grad_x / 255.0
  16.     #grad_y = grad_y / 255.0
  17.     grad = np.sqrt(grad_x*grad_x + grad_y*grad_y)
  18.     #to 0, 1
  19.     #grad = grad / np.sqrt(2.0)
  20.     #imsave("grad.png", grad.astype(np.uint8))
  21.     if (mask is not None):
  22.         grad += mask*(256*grad.shape[0]*grad.shape[1])
  23.     return grad
  24.  
  25. def gen_shifted(row):
  26.     shifted = np.zeros((*row.shape, 3))
  27.     shifted[:-1, 2] = row[1:]
  28.     shifted[ -1, 2] = np.inf
  29.     shifted[  :, 1] = row[:]
  30.     shifted[ 1:, 0] = row[:-1]
  31.     shifted[  0, 0] = np.inf
  32.     return shifted
  33.  
  34. def seam_carve(img, mode, mask = None):
  35.     mode1, mode2 = tuple(mode.split(' '))
  36.     is_vertical = mode1 == 'vertical'
  37.     is_shrinking = mode2 == 'shrink'
  38.     if (is_vertical):
  39.         img = np.swapaxes(img, 0, 1)
  40.         if (mask is not None):
  41.             mask = mask.T
  42.        
  43.     img_lum = 0.299*img[:,:,0] + \
  44.               0.587*img[:,:,1] + 0.114*img[:,:,2]
  45.  
  46.     grad = get_grad(img_lum, mask)
  47.     cum_sum = np.copy(grad)
  48.     ind = np.zeros_like(grad, dtype=np.int32)
  49.    
  50.     for i in range(1, cum_sum.shape[0]):
  51.         shifted = gen_shifted(cum_sum[i-1])
  52.         ind[i] = np.argmin(shifted, axis=1)
  53.         tmp = np.arange(ind[i].shape[0])
  54.         cum_sum[i,:] = cum_sum[i,:] + shifted[tmp, ind[i]]
  55.        
  56.     seam_mask = np.zeros_like(grad, dtype=np.int32)
  57.     cur_col = np.argmin(cum_sum[-1])
  58.     cur_row = cum_sum.shape[0] - 1
  59.     x_list = [0]*cum_sum.shape[0]
  60.     while cur_row >= 0:
  61.         x_list[cur_row] = cur_col
  62.         seam_mask[cur_row, cur_col] = 1
  63.         chg = -1 if ind[cur_row, cur_col] == 0 else \
  64.               0 if ind[cur_row, cur_col] == 1 else 1
  65.         cur_row -= 1
  66.         cur_col += chg
  67.        
  68.     t_seam_mask = np.logical_not(seam_mask).astype(np.bool_)
  69.     t_seam_mask = np.stack([t_seam_mask]*3, axis=2)
  70.  
  71.     if (is_shrinking):
  72.         res_shape = (img.shape[0], img.shape[1]-1, img.shape[2])
  73.         img_res = np.zeros(res_shape, dtype=np.int32)
  74.         for i in range(res_shape[0]):
  75.             img_res[i, 0:x_list[i],:] = img[i, 0:x_list[i],:]
  76.             img_res[i, x_list[i]:, :] = img[i, x_list[i]+1:,:]
  77.         #img_res = img[t_seam_mask].reshape(res_shape)
  78.         out_mask = None
  79.         if (mask is not None):
  80.             mask_shape = (mask.shape[0], mask.shape[1]-1)
  81.             out_mask = mask[t_seam_mask[:,:,0]].\
  82.                        reshape(mask_shape)
  83.             if (is_vertical):
  84.                 out_mask = out_mask.T
  85.     else:
  86.         res_shape = (img.shape[0], img.shape[1]+1, img.shape[2])
  87.         img_res = np.zeros(res_shape, dtype=np.int32)
  88.         for i in range(res_shape[0]):
  89.             img_res[i, 0:x_list[i],  :] = img[i, 0:x_list[i], :]
  90.             img_res[i, x_list[i]+1:, :] = img[i, x_list[i]:,:]
  91.             x_ind = min(img.shape[1]-1, x_list[i]+1)
  92.             img_res[i, x_list[i], :] = (img[i, x_list[i],:].
  93.                                         astype(np.int32) + \
  94.                                         img[i, x_ind,:])//2
  95.         out_mask = None
  96.         if (mask is not None):
  97.             mask_shape = (mask.shape[0], mask.shape[1]+1)
  98.             out_mask = np.zeros(mask_shape, dtype=np.int32)
  99.             for i in range(res_shape[0]):
  100.                 out_mask[i, 0:x_list[i]] = mask[i, 0:x_list[i]]
  101.                 out_mask[i, x_list[i]+1:] = mask[i, x_list[i]:]
  102.                 x_ind  = max(x_list[i]-1, 0)
  103.                 x_ind2 = min(out_mask.shape[1], x_list[i]+2)
  104.                 out_mask[i,x_ind:x_ind2] = 1
  105.             if (is_vertical):
  106.                 out_mask = out_mask.T    
  107.        
  108.     if (is_vertical):
  109.         return np.swapaxes(img_res, 0, 1), out_mask, seam_mask.T
  110.     return img_res, out_mask, seam_mask
  111.    
  112. def convert_img_to_mask(img):
  113.         return ((img[:, :, 0] != 0) * -1 + (img[:, :, 1] != 0)).astype('int8')
  114.  
  115. if __name__ == "__main__":
  116.     img = imread("seyana.png")
  117.     # img = img[:,:,0:3]
  118.     # mask = imread("Mask2.png")
  119.     mask = np.zeros_like(img)
  120.     mask = convert_img_to_mask(mask)
  121.  
  122.     for i in range(60):
  123.         img, mask, _ = seam_carve(img, "vertical shrink", mask)
  124.     imsave("out.png", img)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement