Masalah:
Dalam pelbagai aplikasi pemprosesan imej, selalunya menjadi perlu untuk menukar warna antara ruang warna RGB dan HSV. Untuk memastikan peralihan yang lancar, adalah penting untuk bekerja dalam julat yang sama untuk kedua-dua ruang, biasanya antara 0 dan 255.
Penyelesaian:
Untuk menangani keperluan ini, mari kita teroka algoritma terbukti yang cekap menukar warna antara RGB dan HSV dalam yang ditentukan julat:
typedef struct { double r; double g; double b; } rgb; typedef struct { double h; double s; double v; } hsv;
hsv rgb2hsv(rgb in) { hsv out; double min, max, delta; min = in.r < in.g ? in.r : in.g; min = min < in.b ? min : in.b; max = in.r > in.g ? in.r : in.g; max = max > in.b ? max : in.b; out.v = max; delta = max - min; if (delta < 0.00001) { out.s = 0; out.h = 0; // undefined, maybe nan? return out; } if( max > 0.0 ) { // NOTE: if Max is == 0, this divide would cause a crash out.s = (delta / max); } else { // if max is 0, then r = g = b = 0 // s = 0, h is undefined out.s = 0.0; out.h = NAN; return out; } if( in.r >= max ) // > is bogus, just keeps compilor happy out.h = ( in.g - in.b ) / delta; // between yellow & magenta else if( in.g >= max ) out.h = 2.0 + ( in.b - in.r ) / delta; // between cyan & yellow else out.h = 4.0 + ( in.r - in.g ) / delta; // between magenta & cyan out.h *= 60.0; if( out.h < 0.0 ) out.h += 360.0; return out; }
rgb hsv2rgb(hsv in) { double hh, p, q, t, ff; long i; rgb out; if(in.s <= 0.0) { out.r = in.v; out.g = in.v; out.b = in.v; return out; } hh = in.h; if(hh >= 360.0) hh = 0.0; hh /= 60.0; i = (long)hh; ff = hh - i; p = in.v * (1.0 - in.s); q = in.v * (1.0 - (in.s * ff)); t = in.v * (1.0 - (in.s * (1.0 - ff))); switch(i) { case 0: out.r = in.v; out.g = t; out.b = p; break; case 1: out.r = q; out.g = in.v; out.b = p; break; case 2: out.r = p; out.g = in.v; out.b = t; break; case 3: out.r = p; out.g = q; out.b = in.v; break; case 4: out.r = t; out.g = p; out.b = in.v; break; case 5: default: out.r = in.v; out.g = p; out.b = q; break; } return out; }
Atas ialah kandungan terperinci Bagaimanakah saya boleh menukar RGB kepada HSV dengan cekap dan sebaliknya dalam julat 0-255?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!