2010-04-12 14 views

Odpowiedz

22

przekonwertować grayscale image do RGB image istnieją dwa problemy trzeba rozwiązać:

  • Grayscale images są 2-D, natomiast RGB images są 3-D, więc trzeba replikować szarości danych obrazowych trzy razy i połączyć trzy kopie wzdłuż trzeciego wymiaru.
  • Dane obrazu mogą być przechowywane w wielu różnych data types, więc należy je odpowiednio przekonwertować. W przypadku przechowywania danych w formacie double wartości pikseli obrazu powinny być liczbami zmiennoprzecinkowymi z zakresu od 0 do 1. W przypadku zapisywania jako typ danych o wartości uint8 wartości pikseli obrazu powinny być liczbami całkowitymi z zakresu od 0 do 255. Można sprawdź typ danych matrycy obrazu za pomocą funkcji class.

Oto 3 typowe warunki mogą wystąpić:

  • Aby przekonwertować uint8 lub double obraz w skali szarości na obraz RGB ten sam typ danych, można korzystać z funkcji repmat lub cat :

    rgbImage = repmat(grayImage,[1 1 3]); 
    rgbImage = cat(3,grayImage,grayImage,grayImage); 
    
  • Aby przekonwertować uint8 GRA yScale obraz do double RGB obrazu, należy przekonwertować do double, potem skali przez 255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]); 
    
  • Aby przekonwertować double obraz w skali szarości do uint8 RGB obrazu, należy przeskalować przez 255, potem przekonwertować uint8:

    rgbImage = repmat(uint8(255.*grayImage),[1 1 3]); 
    
+0

Właśnie wykonałem test, wydaje się, że 'double (grayImage)' jest tym samym co 'grayImage'? I czy operatory dzielenia i operatory'./'I'. * 'W MATLAB? Wydaje się, że '. /' Jest takie samo jak '/'? – user198729

+0

@ user198729: Operatory '. /' I '. *' Oznaczają * element-mądry * dzielenie i mnożenie, tak aby każdy element matrycy obrazu był dzielony przez lub pomnożony przez 255. Możesz sprawdzić klasę (tj. Typ danych) macierzy, wpisując 'class (grayImage)'. Podczas gdy 'double (grayImage)' i 'grayImage' mogą * wyglądać tak, jakby były takie same, to każda z nich może być inną klasą (tak, że przechowują swoje wartości na różne sposoby). – gnovice

+0

Próbowałem różnych operacji, ale '/' i '. /' Nigdy nie dają innego wyniku ... A ponieważ 'double (grayImage)' jest taki sam jak 'grayImage',' double (grayImage) ./ 255' jest również taki sam jak "grayImage./255". Czy możesz podać dwa przykłady pokazujące, dlaczego '. /' i 'double' są potrzebne? – user198729

2

Z definicji obraz RGB ma 3 kanały, co oznacza, że ​​do przedstawienia obrazu potrzebna jest trójwymiarowa matryca. Tak, więc właściwą odpowiedzią jest:

rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]); 

Należy zachować ostrożność podczas normalizowania grayImage. Jeśli grayImage jest uint8, stracisz pewną precyzję w operacji 255*grayImage/max(grayImage(:)).

Również normalizacja grayImage zależy od danych. W swoim pytaniu, należy stosować dwie metody:

rgbImage = grayImage/max(max(grayImage)); 

który normalizuje obraz w skali szarości tak, że maksymalna wartość na obrazie jest 1 i

rgbImage = grayImage/255; 

który ma sens tylko wtedy, gdy wartości w grayImage leżą w zakres 0-255.

Więc to naprawdę zależy od tego, co chcesz zrobić. Ale jeśli chcesz uzyskać obraz RGB, musisz przekonwertować macierz jednokanałową na macierz 3-kanałową.

+0

Myślałem, że z definicji maksymalna wartość '' 1 'rgbImage' jest, co oznacza 'white', ale to nie wydaje się dzieje? – user198729

+0

Niezupełnie, to zależy od sposobu użycia obrazu. – Jacob

Powiązane problemy