Instrukcja na temat Histogramów oraz operacjach na nich wykonywanych

Zadania

  1. Napisać funkcje realizujące poniższe zadania, jeżeli potraficie funkcje 2 i 3 można napisać jako jedną (0,3 pkt):
    1. Funkcję generującą wektor histogramu dla zadanych \(N\) przedziałów (domyślnie równe 255).
    2. Funkcję generującą rozciągnięcie liniowe obrazu dla wybranego zakresu \(<x_1,x_2>\).
    3. Funkcję generującą rozciągnięcie nieliniowe obrazu dla wybranego zakresu \(<x_1,x_2>\) na podstawie funkcji dostarczonej jako parametr.
    4. Funkcję generująca wyrównanie histogramu.
  2. Przetestować działanie waszych funkcji na dołączonych obrazach w skali odcieni szarości. Sprawdzić poprawność działania samego liczenia histogramu, jak również wszystkich operacji na histogramie (przetestować również kilka różnych podejść do rozciągnięcia nieliniowego — w instrukcji podane są 4 przykłady). (0,35 pkt)
  3. Przy użyciu dołączonej poniżej funkcji zmniejszającej w sposób losowy dynamikę jednej warstwy, przetestować działanie waszych funkcji na obrazach kolorowych. Konwertujecie obrazy kolorowe do przestrzeni YCbCr, HSV i Lab, a następnie przekazujecie je do funkcji zmniejszającej dynamikę, wskazując odpowiednią warstwę do zmniejszenia dynamiki (Y,V i L). Następnie staracie się naprawić tę warstwę waszymi metodami (rozciągnięciem i wyrównaniem) i obserwujecie wyniki. (0,35 pkt)
def lowerDynamic(img,layer,m=0,n=255):
    l=img[:,:,layer]
    x=np.random.randint(m+50,n-50)
    x1=np.random.randint(m,x)
    x2=np.random.randint(x,n)
    W=np.zeros((n-m+1,))+m
    W[x2:]=n
    W[x1:x2]=np.linspace(0,1,x2-x1)*(n-m)+m
    W=W.astype(img.dtype)
    for i,c in enumerate(range(m,n)):
        l[l==c]=W[i]
    img[:,:,layer]=l
    return img