2013-01-21 14 views
5

Jestem raczej nowy w matlab, ale miałem nadzieję, że ktoś może pomóc w tym pytaniu. Mam więc obraz kolorowy, który chcę przekonwertować na skalę szarości, a następnie zmniejszyć liczbę poziomów szarości. Czytałem obraz i użyłem rgb2gray() do konwersji obrazu na skalę szarości. Jednak nie wiem, jak przekonwertować obraz, aby użyć tylko 32 poziomów szarości zamiast 255 poziomów szarości.zmiana liczby poziomów szarości w obrazie w skali szarości w Matlab

Próbowałem użyć mapy kolorów (szary (32)), ale wydawało się, że nie ma to wpływu na sam wykreślony obraz lub pasek koloru pod obrazem. Więc nie byłem pewien, gdzie jeszcze szukać. Jakieś wskazówki? Dzięki.

+0

Naprawdę nie chcesz dalej kwantyzować go, po prostu wybierając poziomy w odstępach 8 kolorów. Rozważ zastosowanie ulepszonej metody kwantyzacji w skali szarości. – mmgp

Odpowiedz

0

Sprawdź, czy typ danych obrazu to uint8, co podejrzewam. W takim przypadku podziel obraz przez 8, aby nadużywać efektu podziału liczb całkowitych, pomnóż ponownie przez 8 i ustaw: I2=(I/8)*8. I2 będzie miał tylko 32 poziomy szarości.

2

Można zmniejszyć liczbę różnych wartości w obrazie zwykłą zaokrąglenia:

I = rgb2gray(imread('image.gif')); 
J = 8*round(I/8) 

Zobacz imhist(I) i imhist(J) dla efektu.

Jednakże, jeśli chcesz zmniejszyć rozmiar obrazu, możesz lepiej skorzystać z programu do przetwarzania obrazu, takiego jak Photoshop, Gimp lub IrfanView i zapisać jako 32-kolorowy GIF. W ten sposób faktycznie zredukujesz paletę pliku i myślę, że to jest coś, czego Matlab nie może zrobić.

+2

Uważaj na 'rundy'. Otrzymasz 33 poziomy szarości, jeśli "I" nie jest typu całkowitego. Jeśli 'I' jest typu całkowitego, nie potrzebujesz" rundy ". ;-) –

+0

@ s.bandara: Dobry punkt na temat zaokrąglania. Wygląda na to, że OP może faktycznie szukać 'imwrite', używając odpowiedniej mapy, ale nie mam czasu, aby to rozgryźć. – Junuxx

+0

@Junuxx czy wiesz, jak zły wynikowy obraz będzie wyglądał za pomocą tej procedury? (Skomentowałem to w twojej odpowiedzi po prostu dlatego, że pojawiłem się na górze, gdy odwiedziłem to pytanie, ale jest to równie ważne dla innych odpowiedzi tutaj obecnych.) – mmgp

2

Podczas gdy result = (img/8)*8 konwertuje obraz w skali szarości w zakresie [0, 255] na podzestaw tego zakresu, ale teraz używając tylko 32 wartości, może utworzyć niepożądane artefakty. Metoda, która prawdopodobnie wytwarza wizualnie lepsze obrazy nazywa się Improved Grayscale Quantization (w skrócie IGS). Pseudo-kod do wykonywania może być wyrażony jako:

mult = 256/(2^bits) 
mask = 2^(8 - bits) - 1 
prev_sum = 0 
for x = 1 to width 
    for y = 1 to height 
     value = img[x, y] 
     if value >> bits != mask: 
      prev_sum = value + (prev_sum & mask) 
     else: 
      prev_sum = value 
     res[x, y] = (prev_sum >> (8 - bits)) * mult 

Jako przykład, rozważmy następującą postać i odpowiednie kwantyzacji z bits = 5, bits = 4 i bits = 3 pomocą następującego sposobu:

enter image description hereenter image description hereenter image description hereenter image description here

teraz same obrazy, ale skwantyzowana wykonując (img/(256/(2^bits)))*(256/(2^bits)):

enter image description hereenter image description hereenter image description hereenter image description here

To nie jest patologiczny przykład.

Powiązane problemy