H= <0, 0.1> u <0.9, 1>
S= <0.2, 0.7>
V= <0.4, 1>
W tym celu chce uzyc karty graficznej. Jestem na etapie konwersji rgb2hsv:
-> wczytaj obrazek i zamien na teksture,
-> w oknie o rozmiarach obrazka wyswietl prostokat w rzucie ortogonalnym z uzyciem wyspecjalizowanego shadera, z nalozona tekstura,
-> zapisz okno do pliku.
Okazuje sie, ze taki sposob dzialania jest bledny, bo wystarczy ze obrazek bedzie wiekszy niz dostepny ekran. :) Da sie to obejsc, ale na razie jest ok. ;)
Prosty shader konwersji wyglada nastepujaco:
rgb2hsv.glsl.vp:
#version 130 in vec4 vVertex; in vec2 vTexCoords; // Transformation Matrix uniform mat4 mvpMatrix; smooth out vec2 vVaryingTexCoords; void main(void) { vVaryingTexCoords = vTexCoords; gl_Position = mvpMatrix * vVertex; }
rgb2hsv.glsl.fp
#version 130 uniform sampler2D colorMap; smooth in vec2 vVaryingTexCoords; out vec4 vFragColor; void main() { //image RGB value vec4 t= texture2D( colorMap, vVaryingTexCoords.st ); //max, min and diff float fmax= max(max(t.x,t.y),t.z); float fmin= min(min(t.x,t.y),t.z); float diff= fmax-fmin; //set up vFragColor with max, vFragColor represent HSV vFragColor.xyzw= vec4(fmax); //x->H y->S z->V //if max is not 0, set S value if (fmax != 0) vFragColor.y= diff/fmax; //if max and min are same, H is 0 if (fmax == fmin) vFragColor.x= 0; else { //otherwise if ( fmax == t.x ) { //if R is dominant float tmp= 0; if (t.y < t.z) tmp= 6; vFragColor.x= (t.y-t.z)/diff + tmp; } else if ( fmax == t.y ) //if G is dominant vFragColor.x= (t.z-t.x)/diff + 2; else if ( fmax == t.z ) //if B is dominant vFragColor.x= (t.x-t.y)/diff + 4; vFragColor.x= vFragColor.x/6; } }Jak widac, vertex shader ma tylko przepuscic geometrie i wspolrzedne tekstury do fragment shadera, w ktorym odbywa sie wlasciwa konwersja. Po szczegoly konwersji odsylam do wikipedii lub ksiazki "Techniki Biometryczne, Czesc 1, Metody Rzopoznawania Twarzy" G.Kukharev, A.Kuzminski. Poniższy screenshot pokazuje, od lewej - obraz oryginalny, obraz w HSV po przepuszczeniu przez moj program i obraz kontrolny w HSV po przepuszczeniu przez MATLABowska funkcjce rgb2hsv:
Dla Leny w calej jej krasie i w rozdzielczosci 1084x2318 widac duza roznice w szybkosci dzialania pomiedzy MATLABem a napisanym programem, i o to chodzilo. :) Lena moze nie jest najszczesliwszym obrazkiem do testow, bo wiekszosc obrazka miesci sie w przedzialach HSV, ale to nic. :)