29 #define RED_WEIGHT 0.299
30 #define GREEN_WEIGHT 0.587
31 #define BLUE_WEIGHT 0.114
33 static image<uchar> *imageRGBtoGRAY(image<rgb> *input) {
34 int width = input->width();
35 int height = input->height();
36 image<uchar> *output =
new image<uchar>(width, height,
false);
38 for (
int y = 0; y < height; y++) {
39 for (
int x = 0; x < width; x++) {
40 imRef(output, x, y) = (uchar)
41 (imRef(input, x, y).r * RED_WEIGHT +
42 imRef(input, x, y).g * GREEN_WEIGHT +
43 imRef(input, x, y).b * BLUE_WEIGHT);
49 static image<rgb> *imageGRAYtoRGB(image<uchar> *input) {
50 int width = input->width();
51 int height = input->height();
52 image<rgb> *output =
new image<rgb>(width, height,
false);
54 for (
int y = 0; y < height; y++) {
55 for (
int x = 0; x < width; x++) {
56 imRef(output, x, y).r = imRef(input, x, y);
57 imRef(output, x, y).g = imRef(input, x, y);
58 imRef(output, x, y).b = imRef(input, x, y);
64 static image<float> *imageUCHARtoFLOAT(image<uchar> *input) {
65 int width = input->width();
66 int height = input->height();
67 image<float> *output =
new image<float>(width, height,
false);
69 for (
int y = 0; y < height; y++) {
70 for (
int x = 0; x < width; x++) {
71 imRef(output, x, y) = imRef(input, x, y);
77 static image<float> *imageINTtoFLOAT(image<int> *input) {
78 int width = input->width();
79 int height = input->height();
80 image<float> *output =
new image<float>(width, height,
false);
82 for (
int y = 0; y < height; y++) {
83 for (
int x = 0; x < width; x++) {
84 imRef(output, x, y) = imRef(input, x, y);
90 static image<uchar> *imageFLOATtoUCHAR(image<float> *input,
91 float min,
float max) {
92 int width = input->width();
93 int height = input->height();
94 image<uchar> *output =
new image<uchar>(width, height,
false);
99 float scale = UCHAR_MAX / (max - min);
100 for (
int y = 0; y < height; y++) {
101 for (
int x = 0; x < width; x++) {
102 uchar val = (uchar)((imRef(input, x, y) - min) * scale);
103 imRef(output, x, y) = bound(val, (uchar)0, (uchar)UCHAR_MAX);
109 static image<uchar> *imageFLOATtoUCHAR(image<float> *input) {
111 min_max(input, &min, &max);
112 return imageFLOATtoUCHAR(input, min, max);
115 static image<long> *imageUCHARtoLONG(image<uchar> *input) {
116 int width = input->width();
117 int height = input->height();
118 image<long> *output =
new image<long>(width, height,
false);
120 for (
int y = 0; y < height; y++) {
121 for (
int x = 0; x < width; x++) {
122 imRef(output, x, y) = imRef(input, x, y);
128 static image<uchar> *imageLONGtoUCHAR(image<long> *input,
long min,
long max) {
129 int width = input->width();
130 int height = input->height();
131 image<uchar> *output =
new image<uchar>(width, height,
false);
136 float scale = UCHAR_MAX / (float)(max - min);
137 for (
int y = 0; y < height; y++) {
138 for (
int x = 0; x < width; x++) {
139 uchar val = (uchar)((imRef(input, x, y) - min) * scale);
140 imRef(output, x, y) = bound(val, (uchar)0, (uchar)UCHAR_MAX);
146 static image<uchar> *imageLONGtoUCHAR(image<long> *input) {
148 min_max(input, &min, &max);
149 return imageLONGtoUCHAR(input, min, max);
152 static image<uchar> *imageSHORTtoUCHAR(image<short> *input,
153 short min,
short max) {
154 int width = input->width();
155 int height = input->height();
156 image<uchar> *output =
new image<uchar>(width, height,
false);
161 float scale = UCHAR_MAX / (float)(max - min);
162 for (
int y = 0; y < height; y++) {
163 for (
int x = 0; x < width; x++) {
164 uchar val = (uchar)((imRef(input, x, y) - min) * scale);
165 imRef(output, x, y) = bound(val, (uchar)0, (uchar)UCHAR_MAX);
171 static image<uchar> *imageSHORTtoUCHAR(image<short> *input) {
173 min_max(input, &min, &max);
174 return imageSHORTtoUCHAR(input, min, max);