Zadania

  1. Do zaimplementowania dla obrazów kolorowych i skali odcieni szarości:

    1. Funkcja colorFit działającą dla obrazu kolorowego i skali odcieni szarości, która dla podanego przez was koloru piksela zwróci najbliższy mu kolor z podanej palety kolorów. Funkcja przyjmuje na wejściu dwa parametry:

      • wartość koloru
      • paletę kolorów w formie tabeli Nx1 - dla obrazów w skali odcieni szarości lub Nx3 dla obrazów w RGB, gdzie N to ilość kolorów w palecie.

      Prawidłowo napisana funkcja wykorzystująca funkcje podpowiedziane w instrukcji powinna działać niezależnie od tego, czy podajecie mu dane w RGB, czy w skali odcieni szarości o ile będą to prawidłowo ustawione dane. (0,2 pkt)

    2. Trzy funkcje realizujące dithering. Poprawnie napisane działająca funkcja powinna działać jednakowo zarówno dla obrazów kolorowych, jak i tych w skali odcieni szarości, o ile dostaną one dostarczoną odpowiednią paletę. Proszę również przetestować (0,2 pkt):

      • Losowy (dla obrazów binarnych = jedna warstwa)
      • Zorganizowany dla co najmniej M2 (macierz o rozmiarze 4x4)
      • Floyd–Steinberga
  2. Przebadać ich skuteczność działania poprawnie wykonanych funkcji ditheringu na załączonych próbkach. Wybrać kilka z nich zarówno dla obrazów kolorowych, jak i w skali odcieni szarości — tu zawsze proszę przetestować na głowie figury i porównać wynik działania z wynikami zaprezentowanymi w instrukcji, żeby mieć pewność, że macie poprawne wyniki. (0,3 pkt)

    1. Porównać działanie algorytmów oraz czystej kwantyzacji:
      • Dla danych w skali odcieni szarości zapisanych na 1,2 oraz 4 bitach.
      • Dla danych kolorowych wykorzystać podane wcześniej w instrukcji palety kolorów (8,16 - kolorów).
  3. Dla obrazów kolorowych porównanie działanie opracowanych algorytmów dla innych przestrzeni koloru. (0,3 pkt)

    1. Proces przeprowadzić proces zmiany przestrzeni koloru z RGB do przestrzeni CMYK (kod na konwersję poniżej) oraz YCbCr.
    2. Wykonanie funkcji ditheringu w 3 przestrzeniach (RGB, CMYK oraz YCbCr) dla palet wygenerowanych funkcją zamieszczona poniżej (dla 1,2,4-bitów).
    3. Porównać otrzymane wyniki dla tych przestrzeni. Wyniki porównywać w przestrzeni RGB, czyli pozostałe przestrzenie przeliczyć na powrót do RGB
from PIL import Image

def RGBtoCMYK(I):
    # zakładamy że I jest na float <0,1>
    return np.asarray(Image.fromarray(np.uint8(I*255), 'RGB').convert('CMYK'))/255

def CMYKtoRGB(I):
    # zakładamy że I jest na float <0,1>
    return np.asarray(Image.fromarray(np.uint8(I*255), 'CMYK').convert('RGB'))/255

def RGBtoYCbCr(I):
    # zakładamy że I jest na float <0,1>
    return np.asarray(Image.fromarray(np.uint8(I*255), 'RGB').convert('YCbCr'))/255

def YCbCrtoRGB(I):
    # zakładamy że I jest na float <0,1>
    return np.asarray(Image.fromarray(np.uint8(I*255), 'YCbCr').convert('RGB'))/255

def genPallet(numColor,bits):
    # numColors - ilość kolorów (RGB,YCbCr -3 CMYK - 4)
    # bits - ilość bitów
    X=[]
    for i in range(numColor):
        X.append(np.linspace(0,1,(2**bits)).tolist())
    return np.array(np.meshgrid(*X)).T.reshape(-1,numColor)

Do oddania

  • kod źródłowy (jeden plik .py)
  • sprawozdanie z obserwacjami i wynikami w formacie PDF