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
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)