Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.54 KB | None | 0 0
  1. import cv2
  2. import numpy as np
  3. from multi_plot import multi_plot
  4.  
  5. # table of [luminance, chrominance, chrominance]
  6. std_quantization_tab = [
  7.   [
  8.     [16,  11,  10,  16,  24,  40,  51,  61],
  9.     [12,  12,  14,  19,  26,  58,  60,  55],
  10.     [14,  13,  16,  24,  40,  57,  69,  56],
  11.     [14,  17,  22,  29,  51,  87,  80,  62],
  12.     [18,  22,  37,  56,  68, 109, 103,  77],
  13.     [24,  35,  55,  64,  81, 104, 113,  92],
  14.     [49,  64,  78,  87, 103, 121, 120, 101],
  15.     [72,  92,  95,  98, 112, 100, 103,  99]
  16.   ],
  17.   [
  18.     [17,  18,  24,  47,  99,  99,  99,  99],
  19.     [18,  21,  26,  66,  99,  99,  99,  99],
  20.     [24,  26,  56,  99,  99,  99,  99,  99],
  21.     [47,  66,  99,  99,  99,  99,  99,  99],
  22.     [99,  99,  99,  99,  99,  99,  99,  99],
  23.     [99,  99,  99,  99,  99,  99,  99,  99],
  24.     [99,  99,  99,  99,  99,  99,  99,  99],
  25.     [99,  99,  99,  99,  99,  99,  99,  99]
  26.   ],
  27.   [
  28.     [17,  18,  24,  47,  99,  99,  99,  99],
  29.     [18,  21,  26,  66,  99,  99,  99,  99],
  30.     [24,  26,  56,  99,  99,  99,  99,  99],
  31.     [47,  66,  99,  99,  99,  99,  99,  99],
  32.     [99,  99,  99,  99,  99,  99,  99,  99],
  33.     [99,  99,  99,  99,  99,  99,  99,  99],
  34.     [99,  99,  99,  99,  99,  99,  99,  99],
  35.     [99,  99,  99,  99,  99,  99,  99,  99]
  36.   ]
  37. ]
  38.  
  39. generated_quantization_tab = np.zeros((3, 8, 8))
  40.  
  41. #generowanie tabel dla kwantyzacji o odpowiedniej jakosci
  42. def makeTables(quality):
  43.   factor = quality;
  44.  
  45.   if quality < 1:
  46.     factor = 1
  47.   if quality > 99:
  48.     factor = 99
  49.   if quality < 50:
  50.     quality = 5000 / factor
  51.   else:
  52.     quality = 200 - factor*2
  53.  
  54.   for i in range(0, 8):
  55.     for j in range(0, 8):
  56.       luma_quality = (std_quantization_tab[0][i][j] * quality + 50) / 100
  57.       chroma_quality = (std_quantization_tab[1][i][j] * quality + 50) / 100
  58.  
  59.       # Limit 1 <= q <= 255
  60.       if luma_quality < 1:
  61.         luma_quality = 1
  62.       if luma_quality > 255:
  63.         luma_quality = 255
  64.       generated_quantization_tab[0][i][j] = luma_quality
  65.  
  66.       if chroma_quality < 1:
  67.         chroma_quality = 1
  68.       if chroma_quality > 255:
  69.         chroma_quality = 255
  70.       generated_quantization_tab[1][i][j] = chroma_quality
  71.       generated_quantization_tab[2][i][j] = chroma_quality
  72.  
  73.      
  74.  
  75. def kompresuj(obraz_oryginalny, quality):
  76.     #generowanie tabel dla kwantyzacji o odpowiedniej jakosci
  77.     makeTables(quality)
  78.  
  79.     wysokosc, szerokosc = obraz_oryginalny.shape[:2]
  80.  
  81.     # ustawienie wymiarow obrazu na wielokrotnosc 8
  82.     if (szerokosc % 8) != 0:
  83.         filler = obraz_oryginalny[:,szerokosc-1:,:]
  84.         for i in range(8 - (szerokosc % 8)):
  85.             obraz_oryginalny = np.append(obraz_oryginalny, filler, 1)
  86.  
  87.     if (wysokosc % 8) != 0:
  88.         filler = obraz_oryginalny[wysokosc-1:,:,:]
  89.         for i in range(8 - (wysokosc % 8)):
  90.             obraz_oryginalny = np.append(obraz_oryginalny, filler, 0)
  91.  
  92.     wysokosc, szerokosc = obraz_oryginalny.shape[:2]
  93.  
  94.     obraz_po_konwersji = obraz_oryginalny.copy()
  95.     #konwersja na przestrzen YCrCb, Y=luminancja, Cr/Cb=czerwony/niebieski-roznica chrominancji
  96.     obraz_po_konwersji = cv2.cvtColor(obraz_po_konwersji, cv2.COLOR_BGR2YCR_CB)
  97.    
  98.     konwersja = np.empty(shape=(wysokosc, szerokosc, 3))
  99.    
  100.     # DCT na blokach 8x8
  101.     for startY in range(0, wysokosc, 8):
  102.         for startX in range(0, szerokosc, 8):
  103.             for c in range(0, 3):
  104.                 blok = obraz_po_konwersji[startY:startY+8, startX:startX+8, c:c+1].reshape(8,8)
  105.  
  106.                 # DCT
  107.                 blokf = np.float32(blok)     # konwersja na float
  108.                 dct = cv2.dct(blokf)         # DCT
  109.                  
  110.                 # kwantyzacja
  111.                 blokq = np.around(np.divide(dct, generated_quantization_tab[c]))
  112.                 blokq = np.multiply(blokq, generated_quantization_tab[c])
  113.  
  114.                 # zapis do wynikowego obrazu
  115.                 for y in range(8):
  116.                     for x in range(8):
  117.                         konwersja[startY+y, startX+x, c] = blokq[y, x]
  118.  
  119.     # odwrotna DCT
  120.     for startY in range(0, wysokosc, 8):
  121.         for startX in range(0, szerokosc, 8):
  122.             for c in range(0, 3):
  123.                 blok = konwersja[startY:startY+8, startX:startX+8, c:c+1].reshape(8,8)
  124.                
  125.                 blokf = np.float32(blok)     # konwersja na float
  126.                 idct = cv2.idct(blokf)        # odwrotna DCT
  127.                 np.place(idct, idct>255.0, 255.0)
  128.                 np.place(idct, idct<0.0, 0.0)
  129.                 blok = np.uint8(np.around(idct))
  130.  
  131.                 # zapis do wynikowego obrazu
  132.                 for y in range(8):
  133.                     for x in range(8):
  134.                         obraz_po_konwersji[startY+y, startX+x, c] = blok[y, x]
  135.  
  136.     # konwersja na przestrzen BGR
  137.     obraz_po_konwersji = cv2.cvtColor(obraz_po_konwersji, cv2.COLOR_YCR_CB2BGR)
  138.     return obraz_po_konwersji
  139.  
  140. if __name__ == "__main__":
  141.     obraz_oryginalny = cv2.imread("balls.tif", cv2.IMREAD_COLOR)
  142.  
  143.     # quality - 100 - najlepsza jakosc, 1 - najgorsza
  144.     obrazy = [
  145.         kompresuj(obraz_oryginalny, 100),
  146.         kompresuj(obraz_oryginalny, 75),
  147.         kompresuj(obraz_oryginalny, 50),
  148.         kompresuj(obraz_oryginalny, 25),
  149.         kompresuj(obraz_oryginalny, 10),
  150.         kompresuj(obraz_oryginalny, 0)
  151.     ]
  152.  
  153.     cv2.imshow("Oryginalny obraz", obraz_oryginalny)
  154.    
  155.     plot = multi_plot(800, 1200, 2, 3, obrazy, ["100%","75%","50%","25%","10%","1%"], (0,0,0), True, (255,255,255))
  156.     cv2.imshow("Konwersja DCT + kwantyzacja + odwrotna DCT", plot)
  157.    
  158.     cv2.waitKey(0)
  159.     cv2.destroyAllWindows()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement