Exemple #1
0
def mk_encoder(quality = 25,  lowest = -100, highest=60):
  """
  Inputs:
    - quality_level : int (between 1 and 100)
  Returns:
    - an encoder from k-length bit strings to 
      quantized 8x8 DCT matrices
  """
  codec = JPEG()
  quant = codec.scaled_luminance_quant_matrix(quality)
  quant_values = np.ravel(quant)
  quant_shape = quant.shape
  sorted_indices = np.argsort(quant_values)
  
  bits_per_bin = np.zeros_like(quant_values, dtype='int')
  for i,idx in enumerate(sorted_indices):
    
    q = float(quant_values[idx])
    value_range = int(highest/q)*q - int(lowest/q)*q
    if value_range > 0:
      nbits = int(np.ceil(np.log2(float(value_range) / q)))
    else:
      nbits = 0
    bits_per_bin[idx] = int(nbits)
  total_nbits = np.sum(bits_per_bin) 
  encoder = BitEncoder(
    total_nbits, 
    quant, 
    bits_per_bin,
    lowest,
    highest)
  return encoder
Exemple #2
0
def main(argv):
  # discretize_channel(9)
  # discretize_channel(10)
  vals = discretize_channel(9)
  print vals

  rand_block = random_11_block(vals)
  print rand_block
  dctd = two_dim_DCT(rand_block)
  print 'DCTd'
  print_8_by_8(dctd)

  jpeg = JPEG()
  print

  # For visualizing the quantization matrices.
  #
  # for quality in range(5, 96):
  #   quantized = jpeg.scaled_luminance_quant_matrix(quality)
  #   with open('quant_%s.log' % quality, 'w') as fh:
  #     for row in range(8):
  #       for col in range(8):
  #         fh.write('%d %d %d\n' % (row, col, quantized[row,col]))

  quantized = jpeg.luminance_quantize(dctd, 75)
  print_8_by_8(quantized)
  print 'Dequanitzed'
  dequantized = jpeg.luminance_dequantize(quantized, 75)
  print_8_by_8(dequantized)
  idctd = two_dim_DCT(dequantized, False)
  print 'iDCT'
  print_8_by_8(idctd)
  print 'Diff'
  print_8_by_8( idctd - rand_block)
  print 'FS'
  dithered = jpeg.fs_dither(idctd)
  print_8_by_8(dithered)
  print 'Diff Dither'
  print_8_by_8( dithered - rand_block)