25 #include "ImageConvert.hh"
28 #include <Base/Debug/DebugSimple.hh>
29 #include "ToPlanar.cpp"
30 #include "ToInterleaved.cpp"
37 #ifdef BIAS_HAVE_IMAGEMAGICKLIB
39 using namespace Magick;
40 using namespace MagickLib;
42 #ifdef BIAS_IMAGEMAGICKLIB_V2
43 # define MagickLib MagickCore
44 #endif //BIAS_IMAGEMAGICKLIB_V2
48 dv_decoder_t *ImageConvert::DVDecoder_ = NULL;
52 #define SWIC(biasTypeEnum, cpptype, callfunc, src, dst) \
53 case ImageBase::biasTypeEnum :\
55 Image< cpptype > typedImg, destImg;\
56 const ImageBase* psrc = &src; \
57 typedImg.StealImage(*const_cast<ImageBase*>(psrc)); \
58 callfunc(typedImg, destImg);\
59 const_cast<ImageBase*>(psrc)->StealImage(typedImg); \
60 dst.StealImage(destImg);\
71 #define CASE_UCHAR(func, src, dst) SWIC(ST_unsignedchar, unsigned char, func, src, dst)
72 #define CASE_FLOAT(func, src, dst) SWIC(ST_float, float, func, src, dst)
75 #ifdef BUILD_IMAGE_CHAR
76 # define CASE_CHAR(func, src, dst) SWIC(ST_char, char, func, src, dst)
78 # define CASE_CHAR(func, src, dst)
81 #ifdef BUILD_IMAGE_SHORT
82 # define CASE_SHORT(func, src, dst) SWIC(ST_shortint, short int, func, src, dst)
84 # define CASE_SHORT(func, src, dst)
87 #ifdef BUILD_IMAGE_USHORT
88 # define CASE_USHORT(func, src, dst) SWIC(ST_unsignedshortint, unsigned short int, func, src, dst)
90 # define CASE_USHORT(func, src, dst)
93 #ifdef BUILD_IMAGE_INT
94 # define CASE_INT(func, src, dst) SWIC(ST_int, int, func, src, dst)
96 # define CASE_INT(func, src, dst)
99 #ifdef BUILD_IMAGE_UINT
100 # define CASE_UINT(func, src, dst) SWIC(ST_unsignedint, unsigned int, func, src, dst)
102 # define CASE_UINT(func, src, dst)
105 #ifdef BUILD_IMAGE_DOUBLE
106 # define CASE_DOUBLE(func, src, dst) SWIC(ST_double, double, func, src, dst)
108 # define CASE_DOUBLE(func, src, dst)
116 #define CALLFUNC(afunc,source,dest) \
117 CASE_UCHAR (afunc,source,dest) \
118 CASE_FLOAT (afunc,source,dest) \
119 CASE_CHAR (afunc,source,dest) \
120 CASE_SHORT (afunc,source,dest) \
121 CASE_USHORT(afunc,source,dest) \
122 CASE_INT (afunc,source,dest) \
123 CASE_UINT (afunc,source,dest) \
124 CASE_DOUBLE(afunc,source,dest)
139 BIASERR(
"color model conversion cannot convert image from StorageType "
147 switch (targetColorModel)
149 case ImageBase::CM_Grey:
154 case ImageBase::ST_unsignedchar:
162 case ImageBase::ST_float:
170 #ifdef BUILD_IMAGE_CHAR
171 case ImageBase::ST_char:
179 #endif // BUILD_IMAGE_CHAR
180 #ifdef BUILD_IMAGE_SHORT
181 case ImageBase::ST_shortint:
189 #endif // BUILD_IMAGE_SHORT
190 #ifdef BUILD_IMAGE_USHORT
191 case ImageBase::ST_unsignedshortint:
199 #endif // BUILD_IMAGE_USHORT
200 #ifdef BUILD_IMAGE_INT
201 case ImageBase::ST_int:
209 #endif // BUILD_IMAGE_INT
210 #ifdef BUILD_IMAGE_UINT
211 case ImageBase::ST_unsignedint:
219 #endif // BUILD_IMAGE_UINT
220 #ifdef BUILD_IMAGE_DOUBLE
221 case ImageBase::ST_double:
229 #endif // BUILD_IMAGE_DOUBLE
233 BIASERR(
"invalid storage type in source image");
238 BIASERR(
"no In-Place-conversion for sourceColorModel:"<<
240 " to targetColorModel:"<<targetColorModel<< endl<<
241 "can only In-Place-convert to CM_Grey");
249 CALLFUNC(ToInterleaved,source,destImgBase);
251 BIASERR(
"invalid storage type in source image");
256 CALLFUNC(ToPlanar,source,destImgBase);
258 BIASERR(
"invalid storage type in source image");
267 switch (targetColorModel)
269 case ImageBase::CM_Grey:
272 CALLFUNC(ToGrey,source,dest);
274 BIASERR(
"invalid storage type in source image");
278 case ImageBase::CM_RGB:
281 CALLFUNC(ToRGB,source,dest);
283 BIASERR(
"invalid storage type in source image");
287 case ImageBase::CM_RGBA:
290 CALLFUNC(ToRGBA,source,dest);
292 BIASERR(
"invalid storage type in source image");
296 case ImageBase::CM_HSV:
299 CALLFUNC(ToHSV,source,dest);
301 BIASERR(
"invalid storage type in source image");
305 case ImageBase::CM_HSL:
308 CALLFUNC(ToHSL,source,dest);
310 BIASERR(
"invalid storage type in source image");
314 case ImageBase::CM_hsL:
317 CALLFUNC(TohsL,source,dest);
319 BIASERR(
"invalid storage type in source image");
325 BIASERR(
"no conversion available to targetColorModel:"<<
334 CALLFUNC(ToInterleaved,dest,destImgBase);
336 BIASERR(
"invalid storage type in source image");
341 CALLFUNC(ToPlanar,dest,destImgBase);
343 BIASERR(
"invalid storage type in source image");
358 #define YUV2RGB(y, u, v, r, g, b)\
359 r = y + ( ((v << 11) + (v << 10) - (v << 8) + (v << 6) - (v << 3) ) >> 11);\
360 g = y - ( ((v<<10) + (v<<9) - (v<<6) - (v<<3) ) >> 11 ) - \
361 ( ((u << 9) + (u << 7) + (u << 6) + (u << 3) + u) >> 11 );\
362 b = y + ( ((u << 12) - (u << 9) + (u << 5)+(u<<4)) >> 11);\
366 r = r > 255 ? 255 : r;\
367 g = g > 255 ? 255 : g;\
368 b = b > 255 ? 255 : b
376 template<
class StorageType>
380 BIASGDOUT(D_CONVERT,
" ImageConvert::ToGrey()");
387 "ToGrey() should be called with an image of same size");
392 BIASGDOUT(D_CONVERT,
"ToGrey() should be called with an 1 channel image");
401 case ImageBase::CM_Grey:
405 case ImageBase::CM_DV:
407 res = DVToRGB_(source,dest);
410 BIASERR(
"CM_DV not supported because BIAS_HAVE_DV not defined!");
415 case ImageBase::CM_RGB:
416 case ImageBase::CM_BGR:
417 res = RGBToGrey_(source,dest);
419 case ImageBase::CM_BGRA:
420 res = BGRAToGrey_(source, dest);
422 case ImageBase::CM_UYVY422:
423 case ImageBase::CM_YUYV422:
424 res = YUV422ToGrey_(source,dest);
426 case ImageBase::CM_YUV420P:
427 res = YUV420PToGrey_(source,dest);
429 case ImageBase::CM_YUV411:
430 res = YUV411ToGrey_(source,dest);
432 case ImageBase::CM_Bayer_RGGB:
433 case ImageBase::CM_Bayer_GBRG:
434 case ImageBase::CM_Bayer_GRBG:
435 case ImageBase::CM_Bayer_BGGR:
437 res = BayerToGrey_(source,dest);
439 case ImageBase::CM_HSL:
440 case ImageBase::CM_hsL:
441 res = HSLToGrey_(source,dest);
444 BIASERR(
"ImageConvert::ToGrey(): unknown color model:"<<
459 template<
class StorageType>
462 BIASGDOUT(D_CONVERT,
"GetChannel()");
468 if (channelCount < channel) {
469 BIASERR(
"Error: Image has not enough channels.");
475 for (
unsigned long int i = 0; i < image.
GetPixelCount(); i++) {
476 sink[0] = src[channel];
486 for (
unsigned long int i = 0; i < image.
GetPixelCount(); i++) {
487 for (
int j = 0; j < channelCount; j++) {
488 sink[j] = src[channel];
499 BIASGDOUT(D_CONVERT,
"GetChannel()");
500 register unsigned char *sink = (
unsigned char*)image.
GetImageData();
501 register unsigned char *src = (
unsigned char*)image.
GetImageData();
505 if (channelCount < channel) {
506 BIASERR(
"Error: Image has not enough channels.");
513 for (
unsigned long int i = 0; i < image.
GetPixelCount(); i++) {
514 for (
int k=0; k<depth; k++) {
515 sink[k] = src[channel*depth+k];
517 src += channelCount*depth;
526 for (
unsigned long int i = 0; i < image.
GetPixelCount(); i++) {
527 for (
int j = 0; j < channelCount; j++) {
528 for (
int k=0; k<depth; k++) {
529 sink[j*depth+k] = src[channel*depth+k];
532 src += channelCount*depth;
533 sink+= channelCount*depth;
544 template<
class StorageType>
547 const unsigned int channel)
552 BIASERR(
"GetChannel(src,dst,channel) should not be called with"
553 " the same images. In place does not work, currently.");
558 BIASWARN(
"GetChannel(src,dst,channel) should be called"
559 "with an image of same size.\n"
566 BIASWARN(
"GetChannel(src,dst,channel) should be called "
567 "with a 1 channel dest image but has "
573 BIASERR(
"GetChannel(src,dst,channel) - src doesn't have enough channels");
616 case ImageBase::ST_unsignedchar:
625 #ifdef BUILD_IMAGE_USHORT
626 case ImageBase::ST_unsignedshortint:
635 #endif // BUILD_IMAGE_USHORT
636 case ImageBase::ST_float:
646 BIASERR(
"unfinished code");
654 template <
class StorageType>
658 BIASGDOUT(D_CONVERT,
"ImageConvert::RGBToGrey_()");
660 const StorageType *r, *g, *b;
664 case ImageBase::CM_RGB:
669 case ImageBase::CM_BGR:
675 BIASERR(
"RGBToGrey_ must be called with RGB or BGR ColorModel_");
681 if (numeric_limits<StorageType>::is_integer){
682 for (
unsigned int i=0; i < num_pix; i++){
684 p[0]=(StorageType)(0.299*(
double)(r[0])+
685 0.587*(
double)(g[0])+
686 0.114*(
double)(b[0])+0.5);
690 for (
unsigned int i=0; i < num_pix; i++){
691 p[0]=(StorageType)(0.299*(
double)(r[0])+
692 0.587*(
double)(g[0])+
693 0.114*(
double)(b[0]));
699 case ImageBase::CM_RGB:
704 case ImageBase::CM_BGR:
710 BIASERR(
"RGBToGrey_ must be called with RGB or BGR ColorModel_");
716 if (numeric_limits<StorageType>::is_integer){
717 for (
unsigned int i=0; i < num_pix; i++){
719 p[0]=(StorageType)((0.299*(
double)(r[0])+
720 0.587*(
double)(g[0])+
721 0.114*(
double)(b[0]))+0.5);
722 p++; r+=3; g+=3; b+=3;
725 for (
unsigned int i=0; i < num_pix; i++){
726 p[0]=(StorageType)((0.299*(
double)(r[0])+
727 0.587*(
double)(g[0])+
728 0.114*(
double)(b[0])));
729 p++; r+=3; g+=3; b+=3;
736 template<
class StorageType>
741 BIASGDOUT(D_CONVERT,
"ImageConvert::BGRAToGrey_()");
742 StorageType *p = dest.GetImageData();
743 const StorageType *r, *g, *b;
755 BIASERR(
"RGBToGrey_ must be called with BGRA ColorModel_");
758 for (
unsigned int i = 0; i < dest.GetWidth() * dest.GetHeight(); i++)
763 p[0] = Cast<StorageType> (0.299 * (double) (r[0]) +0.587
764 * (double) (g[0]) +0.114 * (double) (b[0]));
781 BIASERR(
"RGBToGrey_ must be called with BGRA ColorModel_");
784 for (
unsigned int i = 0; i < dest.GetWidth() * dest.GetHeight(); i++)
786 p[0] = Cast<StorageType> (0.299 * (double) (r[0]) +0.587
787 * (double) (g[0]) +0.114 * (double) (b[0]));
800 template <
class StorageType>
807 register StorageType *sinkp;
808 bool IdenticalImages =
false;
809 BIASGDOUT(D_CONVERT,
"ImageConvert::YUV422ToGrey_()");
812 BIASGDOUT(D_MI_CONVGREY,
"identical images");
813 IdenticalImages =
true;
818 case ImageBase::CM_YUYV422:
820 case ImageBase::CM_UYVY422:
824 BIASERR(
"ImageConvert::YUV422ToGrey_(): unsupported colormodel");
832 for (
register unsigned long int i=0; i < dest.
GetPixelCount(); i++){
840 if (IdenticalImages) {
853 template <
class StorageType>
858 BIASGDOUT(D_CONVERT,
"ImageConvert::IP_ToGrey_()");
866 case ImageBase::CM_Grey:
867 BIASERR(
"already in grey");
869 case ImageBase::CM_BGR:
870 res = IP_RGBToGrey_(img);
872 case ImageBase::CM_BGRA:
873 res = IP_RGBToGrey_(img);
875 case ImageBase::CM_RGB:
876 res = IP_RGBToGrey_(img);
878 case ImageBase::CM_YUYV422:
879 case ImageBase::CM_UYVY422:
880 res = IP_YUV422ToGrey_(img);
883 BIASERR(
"Image::IP_ToGrey(): unknown color model");
902 unsigned int width = source.
GetWidth();
903 unsigned int height = source.
GetHeight();
908 BIASERR(
"the source image must be in rgb format: error");
914 BIASERR(
"number of channels dont equal 3: error");
922 dest.
Init(width, height, channels);
927 float rgbToxyz[3][3] = {
928 { 0.490f, 0.310f, 0.200f },
929 { 0.177f, 0.812f, 0.011f },
930 { 0.000f, 0.010f, 0.990f }
933 float* channelR =
new float[width*height];
934 ImageBase::GetChannel(source, 0, channelR);
935 float* channelG =
new float[width*height];
936 ImageBase::GetChannel(source, 1, channelG);
937 float* channelB =
new float[width*height];
938 ImageBase::GetChannel(source, 2, channelB);
940 for (
unsigned int i = 0; i < height; i++)
942 for (
unsigned int j = 0; j < width; j++)
945 channelR[i*width+j]/scale,
946 channelG[i*width+j]/scale,
947 channelB[i*width+j]/scale};
949 dest.
SetPixel(s[0] * rgbToxyz[0][0] + s[1] * rgbToxyz[0][1] + s[2]
950 * rgbToxyz[0][2], s[0] * rgbToxyz[1][0] + s[1] * rgbToxyz[1][1]
951 + s[2] * rgbToxyz[1][2], s[0] * rgbToxyz[2][0] + s[1]
952 * rgbToxyz[2][1] + s[2] * rgbToxyz[2][2], j, i);
963 template<
class StorageType>
967 unsigned int width = source.
GetWidth();
968 unsigned int height = source.
GetHeight();
973 BIASERR(
"the source image must be in xyz format: error");
979 BIASERR(
"number of channels must equal 3: error");
987 dest.
Init(width, height, channels);
992 float xyzTorgb[3][3] =
994 { 2.3649f, -0.8971f, -0.4678f },
995 { -0.5156f, 1.4273f, 0.0883f },
996 { 0.0052f, -0.0144f, 1.0092f } };
998 for (
unsigned int i = 0; i < height; i++)
1000 for (
unsigned int j = 0; j < width; j++)
1005 dest.
SetPixel((StorageType) rint((s[0] * xyzTorgb[0][0] + s[1] * xyzTorgb[0][1] + s[2]
1006 * xyzTorgb[0][2])*scale), (StorageType) rint((s[0] * xyzTorgb[1][0] + s[1] * xyzTorgb[1][1]
1007 + s[2] * xyzTorgb[1][2])*scale), (StorageType) rint((s[0] * xyzTorgb[2][0] + s[1]
1008 * xyzTorgb[2][1] + s[2] * xyzTorgb[2][2])*scale), j, i);
1019 unsigned int width = source.
GetWidth();
1020 unsigned int height = source.
GetHeight();
1024 BIASERR(
"the source image must be in xyz format: error");
1030 BIASERR(
"number of channels must equal 3: error");
1038 dest.
Init(width, height, channels);
1043 float rgbToxyz[3][3] =
1045 { 0.490f, 0.310f, 0.200f },
1046 { 0.177f, 0.812f, 0.011f },
1047 { 0.000f, 0.010f, 0.990f } };
1049 float Xn, Yn, Zn, Un, Vn;
1051 Xn = rgbToxyz[0][0] + rgbToxyz[0][1] + rgbToxyz[0][2];
1052 Yn = rgbToxyz[1][0] + rgbToxyz[1][1] + rgbToxyz[1][2];
1053 Zn = rgbToxyz[2][0] + rgbToxyz[2][1] + rgbToxyz[2][2];
1055 Un = (4.0f * Xn) / (Xn + 15.0f * Yn + 3.0f * Zn);
1056 Vn = (9.0f * Yn) / (Xn + 15.0f * Yn + 3.0f * Zn);
1058 for (
unsigned int i = 0; i < height; i++)
1060 for (
unsigned int j = 0; j < width; j++)
1072 L = 116.0f * pow(L, 1.0f / 3.0f) - 16.0f;
1080 float denominator = x + 15.0f * y + 3.0f * z;
1083 if (denominator != 0)
1085 u_star = 13.0f * L * ((4.0f * x / denominator) - Un);
1086 v_star = 13.0f * L * ((9.0f * y / denominator) - Vn);
1090 dest.
SetPixel(L, u_star, v_star, j, i);
1098 unsigned int width = source.
GetWidth();
1099 unsigned int height = source.
GetHeight();
1103 BIASERR(
"the source image must be in xyz format: error");
1109 BIASERR(
"number of channels must equal 3: error");
1117 dest.
Init(width, height, channels);
1122 float rgbToxyz[3][3] =
1124 { 0.490f, 0.310f, 0.200f },
1125 { 0.177f, 0.812f, 0.011f },
1126 { 0.000f, 0.010f, 0.990f } };
1129 Xn = rgbToxyz[0][0] + rgbToxyz[0][1] + rgbToxyz[0][2];
1130 Yn = rgbToxyz[1][0] + rgbToxyz[1][1] + rgbToxyz[1][2];
1131 Zn = rgbToxyz[2][0] + rgbToxyz[2][1] + rgbToxyz[2][2];
1132 float th_root = 1.0f/3.0f;
1134 for (
unsigned int i = 0; i < height; i++)
1136 for (
unsigned int j = 0; j < width; j++)
1142 float x_scaled, y_scaled, z_scaled, x_root, y_root, z_root;
1148 if(x_scaled < 0.008856f){
1149 x_root = (903.296f*x_scaled+16.0f)/116.0f;
1151 x_root = x_scaled * th_root;
1154 if(y_scaled < 0.008856f){
1155 y_root = (903.296f*y_scaled+16.0f)/116.0f;
1157 y_root = y_scaled * th_root;
1160 if(z_scaled < 0.008856f){
1161 z_root = (903.296f*z_scaled+16.0f)/116.0f;
1163 z_root = z_scaled * th_root;
1167 float L = 116.0f * y_root - 16.0f;
1169 float a = 500.0f * (x_root - z_root);
1171 float b = 200.0f * (y_root - z_root);
1183 unsigned int width = source.
GetWidth();
1184 unsigned int height = source.
GetHeight();
1189 BIASERR(
"the source image must be in luv format: error");
1195 BIASERR(
"number of channels must equal 3: error");
1203 dest.
Init(width, height, channels);
1208 float rgbToxyz[3][3] =
1210 { 0.490f, 0.310f, 0.200f },
1211 { 0.177f, 0.812f, 0.011f },
1212 { 0.000f, 0.010f, 0.990f } };
1214 float Xn, Yn, Zn, Un, Vn;
1216 Xn = rgbToxyz[0][0] + rgbToxyz[0][1] + rgbToxyz[0][2];
1217 Yn = rgbToxyz[1][0] + rgbToxyz[1][1] + rgbToxyz[1][2];
1218 Zn = rgbToxyz[2][0] + rgbToxyz[2][1] + rgbToxyz[2][2];
1220 Un = (4.0f * Xn) / (Xn + 15.0f * Yn + 3.0f * Zn);
1221 Vn = (9.0f * Yn) / (Xn + 15.0f * Yn + 3.0f * Zn);
1223 for (
unsigned int i = 0; i < height; i++)
1225 for (
unsigned int j = 0; j < width; j++)
1236 float u_star = luv[1];
1237 float v_star = luv[2];
1244 y = Yn * pow((
float) ((L + 16.0) / 116.0), 3);
1248 y = Yn * (L / 903.3f);
1253 float u = u_star / (13.0f * L) + Un;
1254 float v = v_star / (13.0f * L) + Vn;
1255 z = 3.0f * y / v - 5.0f * y - (3.0f / 4.0f) * u * y / v;
1256 x = 9.0f * y / v - 15.0f * y - 3.0f * z;
1271 int res = RGBToXYZ(source, xyz, scale);
1274 XYZToLUV(xyz, dest);
1285 int res = RGBToXYZ(source, xyz, scale);
1288 XYZToLAB(xyz, dest);
1296 template<
class StorageType>
1301 int res = LUVToXYZ(source, xyz);
1304 res = XYZToRGB(xyz, dest, scale);
1310 template <
class StorageType>
1314 StorageType *r, *g, *b;
1317 case ImageBase::CM_RGB:
1322 case ImageBase::CM_BGR:
1327 case ImageBase::CM_BGRA:
1333 BIASERR(
"IP_RGBToGrey_ must be called with RGB or BGR ColorModel_");
1339 if (numeric_limits<StorageType>::is_integer){
1340 for (
unsigned int i=0; i < num_pix; i++){
1342 p[0]=(StorageType)(0.299*(
double)(r[0])+
1343 0.587*(
double)(g[0])+
1344 0.114*(
double)(b[0])+0.5);
1348 for (
unsigned int i=0; i < num_pix; i++){
1349 p[0]=(StorageType)(0.299*(
double)(r[0])+
1350 0.587*(
double)(g[0])+
1351 0.114*(
double)(b[0]));
1357 case ImageBase::CM_RGB:
1362 case ImageBase::CM_BGR:
1367 case ImageBase::CM_BGRA:
1373 BIASERR(
"IP_RGBToGrey_ must be called with RGB or BGR or BGRA ColorModel_");
1380 if (numeric_limits<StorageType>::is_integer){
1382 for (
unsigned int i=0; i < num_pix; i++){
1383 p[0]=(StorageType)(0.299*(
double)(r[0])+
1384 0.587*(
double)(g[0])+
1385 0.114*(
double)(b[0])+0.5);
1386 p++; r+=3; g+=3; b+=3;
1389 for (
unsigned int i=0; i < num_pix; i++){
1390 p[0]=(StorageType)(0.299*(
double)(r[0])+
1391 0.587*(
double)(g[0])+
1392 0.114*(
double)(b[0]));
1393 p++; r+=3; g+=3; b+=3;
1405 cerr<<
"Error in rgb2i3! ColorModel should be CM_RGB"<<
"\r\n";
1411 int size = width*height;
1412 dest.
Init(width, height, 3);
1415 case ImageBase::ST_float:
1416 ConvertRGBToI1I2I3Worker_<float>(
static_cast<const float*
>(source.
GetImageData()),
1419 case ImageBase::ST_unsignedchar:
1420 ConvertRGBToI1I2I3Worker_<unsigned char>(
static_cast<const unsigned char*
>(source.
GetImageData()),
1424 BIASERR(
"unimplemented case!");
1433 template<
class sourceType>
1436 sourceType sR, sG, sB;
1437 for(
int i = 0; i < size; i++)
1449 *siP =
static_cast<float>(sR + sG + sB)/3.f;
1452 *siP =
static_cast<float>(sR - sB)/2.f;
1455 *siP =
static_cast<float>(2*sG - sR - sB)/4.f;
1461 template <
class StorageType>
1466 BIASGDOUT(D_CONVERT,
"ImageConvert::IP_YUV422ToGrey_()");
1471 case ImageBase::CM_YUYV422:
1475 BIASERR(
"ImageConvert::IP_YUV422ToGrey_() color model not yet implemented");
1481 case ImageBase::CM_YUYV422:
1484 case ImageBase::CM_UYVY422:
1488 BIASERR(
"ImageConvert::IP_YUV422ToGrey_(): unsupported colormodel");
1506 template <
class StorageType>
1512 BIASWARNONCE(
"inefficient code: -> RGBA conversion");
1516 res = ToRGB(source, rgb);
1517 if (res!=0)
return res;
1530 for (
unsigned int y = 0; y < dest.
GetHeight(); y++) {
1531 for (
unsigned int x = 0; x < dest.
GetWidth(); x++) {
1545 template <
class StorageType>
1558 BIASGDOUT(D_CONVERT,
"ImageConvert::ToRGB()");
1572 BIASERR(
"BIAS_HAVE_DV not defined!!!");
1582 case ImageBase::CM_Grey:
1583 case ImageBase::CM_DepthAndVariance:
1584 case ImageBase::CM_Disparity:
1585 case ImageBase::CM_Depth:
1586 res = GreyToRGB_(source,*tmpdest);
1588 case ImageBase::CM_BGR:
1589 res = BGRToRGB_(source,*tmpdest);
1591 case ImageBase::CM_RGB:
1595 case ImageBase::CM_HSL:
1596 res = HSLToRGB_(source,*tmpdest);
1598 case ImageBase::CM_UYVY422:
1599 res = YUV422ToRGB_(source,*tmpdest);
1601 case ImageBase::CM_YUYV422:
1602 res = YUV422ToRGB_(source,*tmpdest);
1604 case ImageBase::CM_YUV420P:
1605 res = YUV420PToRGB_(source,*tmpdest);
1607 case ImageBase::CM_HSV:
1608 res = HSVToRGB_(source, *tmpdest);
1610 case ImageBase::CM_DV:
1612 res = DVToRGB_(source,*tmpdest);
1614 BIASERR(
"BIAS_HAVE_DV not defined!!");
1618 case ImageBase::CM_Bayer_RGGB:
1619 case ImageBase::CM_Bayer_GBRG:
1620 case ImageBase::CM_Bayer_GRBG:
1621 case ImageBase::CM_Bayer_BGGR:
1622 res = BayerToRGB_(source,*tmpdest);
1624 case ImageBase::CM_RGBA:
1625 res = RGBAToRGB_(source,*tmpdest);
1627 case ImageBase::CM_BGRA:
1628 res = BGRAToRGB_(source,*tmpdest);
1630 case ImageBase::CM_PGR_XB3_F7M3_GBRG:
1638 if ((ps_uc!=NULL) && (pd_uc!=NULL)){
1641 res = DeinterleaveHorizontal(*ps_uc, tmp3);
1643 BIASERR(
"could not Deinterleave the 3 Bayer patterns.");
1651 BIASERR(
"could not Deinterlace");
1655 BIASERR(
"CM_PGR_XB3_F7M3_GBRG implemented only for unsigned char.");
1662 BIASERR(
"ImageConvert::ToRGB(): unknown color model:"<<
1678 template <
class StorageType>
1683 BIASGDOUT(D_CONVERT,
"BGRToRGB_()");
1690 for (
unsigned long int i=0;i<pixel_count; i++) {
1698 for (
unsigned long int i=0;i<pixel_count; i++) {
1709 template <
class StorageType>
1713 BIASGDOUT(D_CONVERT,
"RGBAToRGB()");
1715 register const StorageType *src = source.
GetImageData();
1730 template <
class StorageType>
1734 BIASGDOUT(D_CONVERT,
"RGBAToRGB()");
1736 register const StorageType *src = source.
GetImageData();
1750 template <
class StorageType>
1756 BIASGDOUT(D_CONVERT,
"YUV422ToRGB_()");
1758 bool IdenticalImages =
false;
1763 IdenticalImages =
true;
1773 float y,u = 0.0,v=0.0;
1782 if (source.
ColorModel_ == ImageBase::CM_UYVY422) {
1791 y = (float)sourcedata[j*2 + yoffset];
1793 u= (float)sourcedata[j*2+ uvoffset]- 128;
1796 v = (float) sourcedata[j*2+ uvoffset ]- 128;
1799 b = rint(y + 1.77 * u );
1800 g = rint(y - 0.714 * v - 0.345 * u );
1801 r = rint(y + 1.4 * v );
1805 r = r >255 ? 255: r;
1806 g = g >255 ? 255: g;
1807 b = b >255 ? 255: b;
1814 sink[sinkoffset++ ] = (
unsigned char) r;
1815 sink[sinkoffset++] = (
unsigned char) g;
1816 sink[sinkoffset++] = (
unsigned char) b;
1821 register int y0,y1,u,v,r,g,b;
1823 for (i = 0, j = 0; i < (source.
GetWidth()*source.
GetHeight() << 1); i += 4, j += 6) {
1824 u = (
unsigned char) sourcedata[i + 0] - 128;
1825 y0 = (
unsigned char) sourcedata[i + 1];
1826 v = (
unsigned char) sourcedata[i + 2] - 128;
1827 y1 = (
unsigned char) sourcedata[i + 3];
1828 YUV2RGB (y0, u, v, r, g, b);
1829 sink[j + 0] = StorageType(r);
1830 sink[j + 1] = StorageType(g);
1831 sink[j + 2] = StorageType(b);
1832 YUV2RGB (y1, u, v, r, g, b);
1833 sink[j + 3] = StorageType(r);
1834 sink[j + 4] = StorageType(g);
1835 sink[j + 5] = StorageType(b);
1840 for (i = 0, j = 0; i < (dest.
GetWidth()*dest.
GetHeight() << 1); i += 4, j += 6) {
1841 u = (
unsigned char) sourcedata[i + 1] - 128;
1842 y0 = (
unsigned char) sourcedata[i + 0];
1843 v = (
unsigned char) sourcedata[i + 3] - 128;
1844 y1 = (
unsigned char) sourcedata[i + 2];
1845 YUV2RGB (y0, u, v, r, g, b);
1846 sink[j + 0] = StorageType(r);
1847 sink[j + 1] = StorageType(g);
1848 sink[j + 2] = StorageType(b);
1849 YUV2RGB (y1, u, v, r, g, b);
1850 sink[j + 3] = StorageType(r);
1851 sink[j + 4] = StorageType(g);
1852 sink[j + 5] = StorageType(b);
1856 if (IdenticalImages) {
1866 template <
class StorageType>
1870 BIASGDOUT(D_CONVERT,
"GreyToRGB_()");
1872 register const StorageType* src_start = source.
GetImageData();
1873 register const StorageType* src_stop = src_start + dest.
GetPixelCount();
1876 for (;src_start < src_stop; src_start++) {
1877 *pDest++ = *src_start;
1878 *pDest++ = *src_start;
1879 *pDest++ = *src_start;
1886 template <
class StorageType>
1889 unsigned char quality )
1891 BIASERR(
"DVToRGB_ only makes sense with unsigned char images");
1900 unsigned char quality )
1902 BIASGDOUT(D_CONVERT,
"DVToRGB_()");
1915 unsigned char *pixels[3];
1922 pitches[0] = 720 * 3;
1925 if (DVDecoder_ == NULL) DVDecoder_ = dv_decoder_new(0,0,0);
1926 if (DVDecoder_ == NULL) BIASERR(
"dv_decoder_new() failed.");
1930 case 0: DVDecoder_->quality = DV_QUALITY_FASTEST ;
1932 case 1: DVDecoder_->quality = DV_QUALITY_FASTEST | DV_QUALITY_AC_1;
1934 case 2: DVDecoder_->quality = DV_QUALITY_COLOR;
1936 case 3: DVDecoder_->quality = DV_QUALITY_COLOR | DV_QUALITY_AC_1;
1938 case 4: DVDecoder_->quality = DV_QUALITY_BEST;
1947 dv_decode_full_frame(DVDecoder_, source.
GetImageData(),
1948 e_dv_color_rgb, pixels, pitches);
1955 #endif // of BIAS_HAVE_DV
1961 template <
class StorageType>
1965 BIASGDOUT(D_CONVERT,
" Image::BayerToGreySlow_()");
1972 StorageType R=0,G=0,B=0;
1973 unsigned int srcskip;
1976 Mask[0] = - (int(source.
GetWidth()) +1);
1977 Mask[1] = - int(source.
GetWidth());
1978 Mask[2] = - (int(source.
GetWidth()) -1);
1981 Mask[5] = int(source.
GetWidth()) -1;
1982 Mask[6] = + int(source.
GetWidth());
1983 Mask[7] = int(source.
GetWidth()) +1;
1985 unsigned int xoffset = 0;
1986 unsigned int yoffset = 0;
1988 case ImageBase::CM_Bayer_RGGB:
1991 G = (*(src+srcskip)+*(src+1))/2;
1992 B = *(src+srcskip+1);
1994 case ImageBase::CM_Bayer_GBRG:
2001 case ImageBase::CM_Bayer_GRBG:
2008 case ImageBase::CM_Bayer_BGGR:
2009 xoffset = 1;yoffset = 1;
2012 G = (*(src+srcskip)+*(src+1))/2;
2013 R = *(src+srcskip+1);
2016 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2020 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2021 if (x%2 == xoffset) {
2023 G = ( *(src+Mask[3])+ *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2024 B = ( *(src+Mask[5]) + *(src+Mask[7])) /2;
2027 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2029 B = (*(src+Mask[6]) ) ;
2031 *sink++ = Cast<StorageType>(0.299*(double)R+
2032 0.587*(
double)G+0.114*(double)B);
2037 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2038 if (x%2 == xoffset) {
2039 R = ( *(src+Mask[6]) ) ;
2041 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2044 R = ( *(src+Mask[5]) + *(src+Mask[7])) /2;
2045 G = ( *(src+Mask[3]) + *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2048 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2054 if ((dest.
GetWidth()-1)%2 == xoffset) {
2056 G = ( *(src+Mask[3])+ *(src+Mask[6]) ) /2;
2057 B = *(src+Mask[5]) ;
2062 B = (*(src+Mask[6]) ) ;
2066 if ((dest.
GetWidth()-1)%2 == xoffset) {
2067 R = ( *(src+Mask[6]) ) ;
2069 B = *(src+Mask[3]) ;
2073 G = ( *(src+Mask[3]) + *(src+Mask[6]) ) /2;
2077 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2082 for (
unsigned int y=1; y<(
unsigned int)source.
GetHeight()-1; y++) {
2085 if (0%2 == xoffset) {
2087 G = (*(src+Mask[1]) + *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2088 B = ( *(src+Mask[2]) + *(src+Mask[7])) /2;
2092 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2096 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2101 R = ( *(src+Mask[0]) + *(src+Mask[7])) /2;
2102 G = (*(src+Mask[1]) + *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2105 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2108 for (
unsigned int x=1; x<(
unsigned int)source.
GetWidth()-1; x++) {
2110 if (x%2 == xoffset) {
2112 G = (*(src+Mask[1]) + *(src+Mask[3])
2113 + *(src+Mask[4]) + *(src+Mask[6]) ) /4;
2114 B = ( *(src+Mask[0]) + *(src+Mask[2])
2115 + *(src+Mask[5]) + *(src+Mask[7])) /4;
2117 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2119 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2122 if (x%2 == xoffset) {
2123 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2125 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2128 R = ( *(src+Mask[0]) + *(src+Mask[2])
2129 + *(src+Mask[5]) + *(src+Mask[7])) /4;
2130 G = (*(src+Mask[1]) + *(src+Mask[3])
2131 + *(src+Mask[4]) + *(src+Mask[6]) ) /4;
2134 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2139 if ((srcskip-1)%2 == xoffset) {
2141 G = (*(src+Mask[1]) + *(src+Mask[3]) + *(src+Mask[6]) ) /3;
2142 B = ( *(src+Mask[0]) + *(src+Mask[5])) /2;
2144 R = *(src+Mask[3]) ;
2146 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2149 if ((srcskip-1)%2 == xoffset) {
2150 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2155 R = ( *(src+Mask[0]) + *(src+Mask[5])) /2;
2156 G = (*(src+Mask[1]) + *(src+Mask[3])+ *(src+Mask[6]) ) /3;
2159 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2165 if ((source.
GetHeight()-1)%2 == yoffset) {
2168 G = ( *(src+Mask[1])+ *(src+Mask[4]) ) /2;
2169 B = *(src+Mask[2]) ;
2174 B = (*(src+Mask[1]) ) ;
2179 R = ( *(src+Mask[1]) ) ;
2181 B = *(src+Mask[4]) ;
2185 G = ( *(src+Mask[1]) + *(src+Mask[4]) ) /2;
2189 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2192 if ((source.
GetHeight()-1)%2 == yoffset) {
2193 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2194 if (x%2 == xoffset) {
2196 G = ( *(src+Mask[3])+ *(src+Mask[1]) + *(src+Mask[4]) ) /3;
2197 B = ( *(src+Mask[0]) + *(src+Mask[2])) /2;
2200 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2202 B = (*(src+Mask[1]) ) ;
2204 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2209 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2210 if (x%2 == xoffset) {
2211 R = ( *(src+Mask[1]) ) ;
2213 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2216 R = ( *(src+Mask[0]) + *(src+Mask[2])) /2;
2217 G = ( *(src+Mask[1]) + *(src+Mask[3]) + *(src+Mask[4]) ) /3;
2220 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2225 if ((source.
GetHeight()-1)%2 == yoffset) {
2226 if ((dest.
GetWidth()-1)%2 == xoffset) {
2228 G = ( *(src+Mask[3])+ *(src+Mask[1]) ) /2;
2229 B = *(src+Mask[0]) ;
2234 B = (*(src+Mask[1]) ) ;
2238 if ((dest.
GetWidth()-1)%2 == xoffset) {
2239 R = ( *(src+Mask[1]) ) ;
2241 B = *(src+Mask[3]) ;
2245 G = ( *(src+Mask[3]) + *(src+Mask[1]) ) /2;
2249 *sink++ = Cast<StorageType>(0.299*(double)R+0.587*(
double)G+0.114*(double)B);
2256 template <
class StorageType>
2260 BIASGDOUT(D_CONVERT,
" Image::BayerToRGB_()");
2275 BIASASSERT(sink!=NULL);
2276 BIASASSERT(src!=NULL);
2280 StorageType R=0,G=0,B=0;
2281 unsigned int srcskip;
2284 Mask[0] = - (int(source.
GetWidth()) +1);
2285 Mask[1] = - int(source.
GetWidth());
2286 Mask[2] = - (int(source.
GetWidth()) -1);
2289 Mask[5] = int(source.
GetWidth()) -1;
2290 Mask[6] = + int(source.
GetWidth());
2291 Mask[7] = int(source.
GetWidth()) +1;
2293 unsigned int xoffset = 0;
2294 unsigned int yoffset = 0;
2296 case ImageBase::CM_Bayer_RGGB:
2299 G = (*(src+srcskip)+*(src+1))/2;
2300 B = *(src+srcskip+1);
2302 case ImageBase::CM_Bayer_GBRG:
2309 case ImageBase::CM_Bayer_GRBG:
2316 case ImageBase::CM_Bayer_BGGR:
2317 xoffset = 1;yoffset = 1;
2320 G = (*(src+srcskip)+*(src+1))/2;
2321 R = *(src+srcskip+1);
2324 sink[0]=R; sink[1]=G; sink[2]=B;
2328 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2329 if (x%2 == xoffset) {
2331 G = ( *(src+Mask[3])+ *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2332 B = ( *(src+Mask[5]) + *(src+Mask[7])) /2;
2335 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2337 B = (*(src+Mask[6]) ) ;
2346 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2347 if (x%2 == xoffset) {
2348 R = ( *(src+Mask[6]) ) ;
2350 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2353 R = ( *(src+Mask[5]) + *(src+Mask[7])) /2;
2354 G = ( *(src+Mask[3]) + *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2365 if ((dest.
GetWidth()-1)%2 == xoffset) {
2367 G = ( *(src+Mask[3])+ *(src+Mask[6]) ) /2;
2368 B = *(src+Mask[5]) ;
2373 B = (*(src+Mask[6]) ) ;
2377 if ((dest.
GetWidth()-1)%2 == xoffset) {
2378 R = ( *(src+Mask[6]) ) ;
2380 B = *(src+Mask[3]) ;
2384 G = ( *(src+Mask[3]) + *(src+Mask[6]) ) /2;
2395 for (
unsigned int y=1; y<(
unsigned int)source.
GetHeight()-1; y++) {
2398 if (0%2 == xoffset) {
2400 G = (*(src+Mask[1]) + *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2401 B = ( *(src+Mask[2]) + *(src+Mask[7])) /2;
2405 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2409 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2414 R = ( *(src+Mask[0]) + *(src+Mask[7])) /2;
2415 G = (*(src+Mask[1]) + *(src+Mask[4]) + *(src+Mask[6]) ) /3;
2423 for (
unsigned int x=1; x<(
unsigned int)source.
GetWidth()-1; x++) {
2425 if (x%2 == xoffset) {
2427 G = (*(src+Mask[1]) + *(src+Mask[3])
2428 + *(src+Mask[4]) + *(src+Mask[6]) ) /4;
2429 B = ( *(src+Mask[0]) + *(src+Mask[2])
2430 + *(src+Mask[5]) + *(src+Mask[7])) /4;
2432 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2434 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2437 if (x%2 == xoffset) {
2438 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2440 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2443 R = ( *(src+Mask[0]) + *(src+Mask[2])
2444 + *(src+Mask[5]) + *(src+Mask[7])) /4;
2445 G = (*(src+Mask[1]) + *(src+Mask[3])
2446 + *(src+Mask[4]) + *(src+Mask[6]) ) /4;
2456 if ((srcskip-1)%2 == xoffset) {
2458 G = (*(src+Mask[1]) + *(src+Mask[3]) + *(src+Mask[6]) ) /3;
2459 B = ( *(src+Mask[0]) + *(src+Mask[5])) /2;
2461 R = *(src+Mask[3]) ;
2463 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2466 if ((srcskip-1)%2 == xoffset) {
2467 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2472 R = ( *(src+Mask[0]) + *(src+Mask[5])) /2;
2473 G = (*(src+Mask[1]) + *(src+Mask[3])+ *(src+Mask[6]) ) /3;
2484 if ((source.
GetHeight()-1)%2 == yoffset) {
2487 G = ( *(src+Mask[1])+ *(src+Mask[4]) ) /2;
2488 B = *(src+Mask[2]) ;
2493 B = (*(src+Mask[1]) ) ;
2498 R = ( *(src+Mask[1]) ) ;
2500 B = *(src+Mask[4]) ;
2504 G = ( *(src+Mask[1]) + *(src+Mask[4]) ) /2;
2513 if ((source.
GetHeight()-1)%2 == yoffset) {
2514 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2515 if (x%2 == xoffset) {
2517 G = ( *(src+Mask[3])+ *(src+Mask[1]) + *(src+Mask[4]) ) /3;
2518 B = ( *(src+Mask[0]) + *(src+Mask[2])) /2;
2521 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2523 B = (*(src+Mask[1]) ) ;
2532 for (
unsigned int x=1; x<(
unsigned int)dest.
GetWidth()-1; x++){
2533 if (x%2 == xoffset) {
2534 R = ( *(src+Mask[1]) ) ;
2536 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2539 R = ( *(src+Mask[0]) + *(src+Mask[2])) /2;
2540 G = ( *(src+Mask[1]) + *(src+Mask[3]) + *(src+Mask[4]) ) /3;
2550 if ((source.
GetHeight()-1)%2 == yoffset) {
2551 if ((dest.
GetWidth()-1)%2 == xoffset) {
2553 G = ( *(src+Mask[3])+ *(src+Mask[1]) ) /2;
2554 B = *(src+Mask[0]) ;
2559 B = (*(src+Mask[1]) ) ;
2563 if ((dest.
GetWidth()-1)%2 == xoffset) {
2564 R = ( *(src+Mask[1]) ) ;
2566 B = *(src+Mask[3]) ;
2570 G = ( *(src+Mask[3]) + *(src+Mask[1]) ) /2;
2583 template <
class StorageType>
2595 BIASERR(
"ONLY IMPLEMENTED FOR unsigned char and unsigned short");
2610 BIASERR(
"ONLY IMPLEMENTED FOR unsigned char and unsigned short");
2621 BIASERR(
"ONLY IMPLEMENTED FOR unsigned char and unsigned short");
2625 BIASERR(
"NOT IMPLEMENTED");
2629 BIASERR(
"NOT IMPLEMENTED YET");
2633 BIASERR(
"NO DEFAULT OPERATION");
2650 template <
class StorageType>
2654 BIASGDOUT(D_CONVERT,
" Image::BayerToRGBSlow_()");
2660 StorageType R,G,B, d1, d2;
2662 Mask[0] = - (int(source.
GetWidth()) +1);
2663 Mask[1] = - int(source.
GetWidth());
2664 Mask[2] = - (int(source.
GetWidth()) -1);
2667 Mask[5] = int(source.
GetWidth()) -1;
2668 Mask[6] = + int(source.
GetWidth());
2669 Mask[7] = int(source.
GetWidth()) +1;
2670 Mask[8] = - 2 * int(source.
GetWidth());
2673 Mask[11] = + 2 * int(source.
GetWidth());
2675 #define D1 (*(src+Mask[8])>*(src+Mask[11]))?\
2676 (*(src+Mask[8])-*(src+Mask[11])):\
2677 (*(src+Mask[11])-*(src+Mask[8]))
2678 #define D2 (*(src+Mask[9])>*(src+Mask[10]))?\
2679 (*(src+Mask[9])-*(src+Mask[10])):\
2680 (*(src+Mask[10])-*(src+Mask[9]))
2682 unsigned int xoffset = 0;
2683 unsigned int yoffset = 0;
2685 case ImageBase::CM_Bayer_GBRG: yoffset = 1;
break;
2686 case ImageBase::CM_Bayer_GRBG: xoffset = 1;
break;
2687 case ImageBase::CM_Bayer_BGGR: xoffset = 1;yoffset = 1;
break;
2690 for (
unsigned int y=2; y<(
unsigned int)source.
GetHeight()-2; y++) {
2691 for (
unsigned int x=2; x<(
unsigned int)source.
GetWidth()-2; x++) {
2693 if (x%2 == xoffset) {
2698 G = (*(src+Mask[1]) + *(src+Mask[6]) ) /2;
2700 G = (*(src+Mask[3]) + *(src+Mask[4]) ) /2;
2702 G = (*(src+Mask[1]) + *(src+Mask[3])
2703 + *(src+Mask[4]) + *(src+Mask[6]) ) /4;
2705 B = ( *(src+Mask[0]) + *(src+Mask[2])
2706 + *(src+Mask[5]) + *(src+Mask[7])) /4;
2709 R = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2711 B = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2714 if (x%2 == xoffset) {
2715 R = ( *(src+Mask[1]) + *(src+Mask[6]) ) /2;
2717 B = ( *(src+Mask[3]) + *(src+Mask[4]) ) /2;
2720 R = ( *(src+Mask[0]) + *(src+Mask[2])
2721 + *(src+Mask[5]) + *(src+Mask[7])) /4;
2725 G = (*(src+Mask[1]) + *(src+Mask[6]) ) /2;
2727 G = (*(src+Mask[3]) + *(src+Mask[4]) ) /2;
2729 G = (*(src+Mask[1]) + *(src+Mask[3])
2730 + *(src+Mask[4]) + *(src+Mask[6]) ) /4;
2746 template <
class StorageType>
2752 float y,u = 0.0,v=0.0;
2759 for (
int z = 0; z < height ; z++) {
2761 voffset = width*height +z/2*width/2;
2762 uoffset = width*height + width*height/4+z/2*width/2;
2764 for (
int x=0; x< width; x++) {
2765 y = 1.164f * (float) (src[z*width + x] -16) ;
2767 v = (float) (src[voffset + x/2] -128);
2768 u = (float) (src[uoffset + x/2 ] -128);
2770 b = float(rint( y + 2.018f*v ));
2771 g = float(rint( y - 0.813f*u - 0.391f*v));
2772 r = float(rint( y + 1.596f*u));
2780 sink[(z*width + x)*3 ] = (
unsigned char) r;
2781 sink[(z*width + x)*3 +1] =(
unsigned char)g;
2782 sink[(z*width + x)*3 +2] =(
unsigned char) b;
2788 template <
class StorageType>
2798 for (
int z = 0; z < height ; z++)
2799 for (
int x=0; x< width; x++)
2800 sink[(z*width + x) ] = src[z*width + x];
2806 template <
class StorageType>
2816 for (
int z = 0; z < height ; z++)
2817 for (
int x=0; x< width; x++)
2818 sink[(z*width + x) ] = src[z*width*2 + x*2];
2830 unsigned char *d = (
unsigned char*)dest.
GetImageData();
2832 for (
unsigned int i=0; i<values; i++){
2833 d[i] = (
unsigned char) *s;
2852 if (targetST == ImageBase::ST_invalid || sourceST == ImageBase::ST_invalid) {
2853 BIASERR(
"Invalid storage type in source or target image!");
2858 if (targetST == sourceST) {
2870 #ifdef BUILD_IMAGE_FLOAT
2871 case ImageBase::ST_float:
2876 # ifdef BUILD_IMAGE_DOUBLE
2877 case ImageBase::ST_double:
2880 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2884 # ifdef BUILD_IMAGE_UCHAR
2885 case ImageBase::ST_unsignedchar:
2887 unsigned char *s = (
unsigned char*) source.
GetImageData();
2888 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2892 # ifdef BUILD_IMAGE_CHAR
2893 case ImageBase::ST_char:
2896 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2900 # ifdef BUILD_IMAGE_USHORT
2901 case ImageBase::ST_unsignedshortint:
2903 unsigned short *s = (
unsigned short*) source.
GetImageData();
2904 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2908 # ifdef BUILD_IMAGE_SHORT
2909 case ImageBase::ST_shortint:
2912 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2916 # ifdef BUILD_IMAGE_UINT
2917 case ImageBase::ST_unsignedint:
2919 unsigned int *s = (
unsigned int*) source.
GetImageData();
2920 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2924 # ifdef BUILD_IMAGE_INT
2925 case ImageBase::ST_int:
2928 for (
unsigned int i = 0; i < values; i++) d[i] = (
float) s[i];
2933 memset(dest.
GetImageData(), 0, values *
sizeof(float));
2934 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
2935 <<
" and targetST = " << targetST <<
"!");
2940 #endif // BUILD_IMAGE_FLOAT
2942 #ifdef BUILD_IMAGE_DOUBLE
2943 case ImageBase::ST_double:
2948 # ifdef BUILD_IMAGE_FLOAT
2949 case ImageBase::ST_float:
2952 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
2956 # ifdef BUILD_IMAGE_UCHAR
2957 case ImageBase::ST_unsignedchar:
2959 unsigned char *s = (
unsigned char*) source.
GetImageData();
2960 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
2964 # ifdef BUILD_IMAGE_CHAR
2965 case ImageBase::ST_char:
2968 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
2972 # ifdef BUILD_IMAGE_USHORT
2973 case ImageBase::ST_unsignedshortint:
2975 unsigned short *s = (
unsigned short*) source.
GetImageData();
2976 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
2980 # ifdef BUILD_IMAGE_SHORT
2981 case ImageBase::ST_shortint:
2984 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
2988 # ifdef BUILD_IMAGE_UINT
2989 case ImageBase::ST_unsignedint:
2991 unsigned int *s = (
unsigned int*) source.
GetImageData();
2992 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
2996 # ifdef BUILD_IMAGE_INT
2997 case ImageBase::ST_int:
3000 for (
unsigned int i = 0; i < values; i++) d[i] = (
double) s[i];
3005 memset(dest.
GetImageData(), 0, values *
sizeof(double));
3006 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3007 <<
" and targetST = " << targetST <<
"!");
3012 #endif // BUILD_IMAGE_DOUBLE
3014 #ifdef BUILD_IMAGE_UCHAR
3015 case ImageBase::ST_unsignedchar:
3017 unsigned char* d = (
unsigned char*) dest.
GetImageData();
3020 # ifdef BUILD_IMAGE_FLOAT
3021 case ImageBase::ST_float:
3024 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3028 # ifdef BUILD_IMAGE_DOUBLE
3029 case ImageBase::ST_double:
3032 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3036 # ifdef BUILD_IMAGE_CHAR
3037 case ImageBase::ST_char:
3040 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3044 # ifdef BUILD_IMAGE_USHORT
3045 case ImageBase::ST_unsignedshortint:
3047 unsigned short *s = (
unsigned short*) source.
GetImageData();
3048 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3052 # ifdef BUILD_IMAGE_SHORT
3053 case ImageBase::ST_shortint:
3056 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3060 # ifdef BUILD_IMAGE_UINT
3061 case ImageBase::ST_unsignedint:
3063 unsigned int *s = (
unsigned int*) source.
GetImageData();
3064 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3068 # ifdef BUILD_IMAGE_INT
3069 case ImageBase::ST_int:
3072 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned char) s[i];
3077 memset(dest.
GetImageData(), 0, values *
sizeof(
unsigned char));
3078 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3079 <<
" and targetST = " << targetST <<
"!");
3084 #endif // BUILD_IMAGE_UCHAR
3086 #ifdef BUILD_IMAGE_CHAR
3087 case ImageBase::ST_char:
3092 # ifdef BUILD_IMAGE_FLOAT
3093 case ImageBase::ST_float:
3096 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3100 # ifdef BUILD_IMAGE_DOUBLE
3101 case ImageBase::ST_double:
3104 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3108 # ifdef BUILD_IMAGE_UCHAR
3109 case ImageBase::ST_unsignedchar:
3111 unsigned char *s = (
unsigned char*) source.
GetImageData();
3112 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3116 # ifdef BUILD_IMAGE_USHORT
3117 case ImageBase::ST_unsignedshortint:
3119 unsigned short *s = (
unsigned short*) source.
GetImageData();
3120 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3124 # ifdef BUILD_IMAGE_SHORT
3125 case ImageBase::ST_shortint:
3128 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3132 # ifdef BUILD_IMAGE_UINT
3133 case ImageBase::ST_unsignedint:
3135 unsigned int *s = (
unsigned int*) source.
GetImageData();
3136 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3140 # ifdef BUILD_IMAGE_INT
3141 case ImageBase::ST_int:
3144 for (
unsigned int i = 0; i < values; i++) d[i] = (
char) s[i];
3150 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3151 <<
" and targetST = " << targetST <<
"!");
3156 #endif // BUILD_IMAGE_CHAR
3158 #ifdef BUILD_IMAGE_USHORT
3159 case ImageBase::ST_unsignedshortint:
3161 unsigned short* d = (
unsigned short*) dest.
GetImageData();
3164 # ifdef BUILD_IMAGE_FLOAT
3165 case ImageBase::ST_float:
3168 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3172 # ifdef BUILD_IMAGE_DOUBLE
3173 case ImageBase::ST_double:
3176 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3180 # ifdef BUILD_IMAGE_UCHAR
3181 case ImageBase::ST_unsignedchar:
3183 unsigned char *s = (
unsigned char*) source.
GetImageData();
3184 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3188 # ifdef BUILD_IMAGE_CHAR
3189 case ImageBase::ST_char:
3192 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3196 # ifdef BUILD_IMAGE_SHORT
3197 case ImageBase::ST_shortint:
3200 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3204 # ifdef BUILD_IMAGE_UINT
3205 case ImageBase::ST_unsignedint:
3207 unsigned int *s = (
unsigned int*) source.
GetImageData();
3208 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3212 # ifdef BUILD_IMAGE_INT
3213 case ImageBase::ST_int:
3216 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned short) s[i];
3221 memset(dest.
GetImageData(), 0, values *
sizeof(
unsigned short));
3222 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3223 <<
" and targetST = " << targetST <<
"!");
3228 #endif // BUILD_IMAGE_USHORT
3230 #ifdef BUILD_IMAGE_SHORT
3231 case ImageBase::ST_shortint:
3236 # ifdef BUILD_IMAGE_FLOAT
3237 case ImageBase::ST_float:
3240 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3244 # ifdef BUILD_IMAGE_DOUBLE
3245 case ImageBase::ST_double:
3248 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3252 # ifdef BUILD_IMAGE_UCHAR
3253 case ImageBase::ST_unsignedchar:
3255 unsigned char *s = (
unsigned char*) source.
GetImageData();
3256 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3260 # ifdef BUILD_IMAGE_CHAR
3261 case ImageBase::ST_char:
3264 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3268 # ifdef BUILD_IMAGE_USHORT
3269 case ImageBase::ST_unsignedshortint:
3271 unsigned short *s = (
unsigned short*) source.
GetImageData();
3272 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3276 # ifdef BUILD_IMAGE_UINT
3277 case ImageBase::ST_unsignedint:
3279 unsigned int *s = (
unsigned int*) source.
GetImageData();
3280 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3284 # ifdef BUILD_IMAGE_INT
3285 case ImageBase::ST_int:
3288 for (
unsigned int i = 0; i < values; i++) d[i] = (
short) s[i];
3293 memset(dest.
GetImageData(), 0, values *
sizeof(short));
3294 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3295 <<
" and targetST = " << targetST <<
"!");
3300 #endif // BUILD_IMAGE_SHORT
3302 #ifdef BUILD_IMAGE_UINT
3303 case ImageBase::ST_unsignedint:
3308 # ifdef BUILD_IMAGE_FLOAT
3309 case ImageBase::ST_float:
3312 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3316 # ifdef BUILD_IMAGE_DOUBLE
3317 case ImageBase::ST_double:
3320 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3324 # ifdef BUILD_IMAGE_UCHAR
3325 case ImageBase::ST_unsignedchar:
3327 unsigned char *s = (
unsigned char*) source.
GetImageData();
3328 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3332 # ifdef BUILD_IMAGE_CHAR
3333 case ImageBase::ST_char:
3336 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3340 # ifdef BUILD_IMAGE_USHORT
3341 case ImageBase::ST_unsignedshortint:
3343 unsigned short *s = (
unsigned short*) source.
GetImageData();
3344 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3348 # ifdef BUILD_IMAGE_SHORT
3349 case ImageBase::ST_shortint:
3352 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3356 # ifdef BUILD_IMAGE_INT
3357 case ImageBase::ST_int:
3360 for (
unsigned int i = 0; i < values; i++) d[i] = (
unsigned int) s[i];
3365 memset(dest.
GetImageData(), 0, values *
sizeof(
unsigned int));
3366 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3367 <<
" and targetST = " << targetST <<
"!");
3372 #endif // BUILD_IMAGE_UINT
3374 #ifdef BUILD_IMAGE_INT
3375 case ImageBase::ST_int:
3380 # ifdef BUILD_IMAGE_FLOAT
3381 case ImageBase::ST_float:
3384 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3388 # ifdef BUILD_IMAGE_DOUBLE
3389 case ImageBase::ST_double:
3392 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3396 # ifdef BUILD_IMAGE_UCHAR
3397 case ImageBase::ST_unsignedchar:
3399 unsigned char *s = (
unsigned char*) source.
GetImageData();
3400 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3404 # ifdef BUILD_IMAGE_CHAR
3405 case ImageBase::ST_char:
3408 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3412 # ifdef BUILD_IMAGE_USHORT
3413 case ImageBase::ST_unsignedshortint:
3415 unsigned short *s = (
unsigned short*) source.
GetImageData();
3416 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3420 # ifdef BUILD_IMAGE_SHORT
3421 case ImageBase::ST_shortint:
3424 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3428 # ifdef BUILD_IMAGE_UINT
3429 case ImageBase::ST_unsignedint:
3431 unsigned int *s = (
unsigned int*) source.
GetImageData();
3432 for (
unsigned int i = 0; i < values; i++) d[i] = (
int) s[i];
3438 BIASERR(
"ConvertST() not implemented for sourceST = " << sourceST
3439 <<
" and targetST = " << targetST <<
"!");
3444 #endif // BUILD_IMAGE_INT
3447 BIASERR(
"ConvertST() not implemented for targetST = " << targetST <<
"!");
3452 int tlx, tly, brx, bry;
3460 template <
class StorageType>
3464 BIASGDOUT(D_CONVERT,
"ImageConvert::hsLToGrey_()");
3466 const StorageType *h, *s, *L;
3470 case ImageBase::CM_hsL:
3471 case ImageBase::CM_HSL:
3477 BIASERR(
"HSLToGrey_ must be called with HSL or hsL ColorModel_");
3486 case ImageBase::CM_hsL:
3487 case ImageBase::CM_HSL:
3493 BIASERR(
"HSLToGrey_ must be called with HSL or hsL ColorModel_");
3497 *p=(StorageType)(*L);
3504 #ifdef BIAS_HAVE_IMAGEMAGICKLIB
3511 Magick::InitializeMagick(NULL);
3516 image.colorSpace(sRGBColorspace);
3524 image.colorSpace(GRAYColorspace);
3529 pixmap=
"RGB";
break;
3531 pixmap=
"RGBA";
break;
3533 BIASERR(
"unsupported channelcount. Could not convert image to ImageMagick++");
3548 image.colorSpace(sRGBColorspace);
3552 image.colorSpace(sRGBColorspace);
3561 image.colorSpace(GRAYColorspace);
3562 image.type(GrayscaleType);
3567 image.colorSpace(UndefinedColorspace);
3568 image.type(GrayscaleMatteType);
3572 image.colorSpace(HSBColorspace);
3576 image.colorSpace(HSLColorspace);
3579 BIASERR(
"unsupported color model. Please add switch for "<<input.
GetColorModel());
3583 unsigned char* p_imageData = (
unsigned char*)input.
GetImageData();
3584 BIASASSERT(p_imageData!=NULL);
3588 Magick::StorageType magick_ST=Magick::CharPixel;
3595 magick_ST=Magick::CharPixel;
3596 depth = (8*
sizeof(char));
3600 magick_ST=Magick::ShortPixel;
3601 depth = (8*
sizeof(short));
3605 magick_ST=Magick::IntegerPixel;
3606 depth = (8*
sizeof(int));
3609 magick_ST=Magick::FloatPixel;
3610 depth = (8*
sizeof(float));
3613 magick_ST=Magick::DoublePixel;
3614 depth = (8*
sizeof(double));
3617 BIASERR(
"unsupported input image BIAS StorageType "<<input.
GetStorageType() );
3630 if (8*input.
GetDepth() != image.depth()){
3631 BIASERR(
"ImageMagick bitdepth="<<image.depth()
3632 <<
" seems to be smaller than requested "<<8*input.
GetDepth()<<
" bit input"<<endl
3633 <<
"Do you use a bit-limited ImageMagick version , e.g. ImageMagick-16bit?"<<endl
3634 <<
"You cannot convert this image to ImageMagick Image with your version of ImageMagick due to dynamic range problems!"
3638 BIASASSERT( 8*input.
GetDepth() == image.depth() );
3648 Magick::InitializeMagick(NULL);
3653 unsigned width=(
unsigned int)image.columns();
3654 unsigned height=(
unsigned int)image.rows();
3655 unsigned bitdepth=(
unsigned int)image.depth();
3658 while (depth<bitdepth)
3668 Magick::StorageType imst=MagickLib::UndefinedPixel;
3671 Magick::ColorspaceType imcs=image.image()->colorspace;
3672 std::string cm_map=
"";
3677 case sizeof(
unsigned char):
3678 st=ImageBase::ST_unsignedchar;
3679 imst=MagickLib::CharPixel;
3681 #ifdef BUILD_IMAGE_USHORT
3682 case sizeof(
unsigned short):
3683 st=ImageBase::ST_unsignedshortint;
3684 imst=MagickLib::ShortPixel;
3688 st=ImageBase::ST_float;
3689 imst=MagickLib::FloatPixel;
3692 BIASERR(
"Invalid depth "<<depth<<
" byte given (maybe unfinished code)!");
3711 case MagickLib::GRAYColorspace:
3717 case MagickLib::RGBColorspace:
3718 case MagickLib::sRGBColorspace:
3721 if (image.channelDepth(MagickLib::AlphaChannel)>1){
3735 BIASERR(
"Color model:"<<imcs<<
" not implemented. You may want to add a colorspace/map handler.");
3758 BIASERR(
"Error: You tried to load a "<<depth<<
" byte "
3759 <<
"("<<bitdepth<<
"bit) "
3760 <<
"image into an image of storage type "
3769 result.
Init(width, height, cc, st,
true);
3772 image.write(0, 0, width, height, cm_map, imst, result.
GetImageData());
3776 catch ( Magick::Exception & error_) {
3778 BIASERR(
"ImageMagick2BIAS failed."<<endl
3779 <<
" Caught Magick exception: "<<endl
3780 <<
" "<<error_.what()<<endl );
3783 catch ( std::exception & e) {
3784 BIASERR(
"ImageMagick2BIAS failed."<<endl
3785 <<
" Caught std exception: "<<endl
3786 <<
" "<<e.what()<<endl );
3790 BIASERR(
"ImageMagick2BIAS failed."<<endl
3791 <<
" Caught unknown exception. "<<endl);
3801 #ifdef BIAS_HAVE_OPENCV
3802 template <
class StorageType>
3825 StorageType* newImageData = (StorageType*) dest->imageDataOrigin;
3839 case ImageBase::CM_Grey:
3844 case ImageBase::CM_BGR :
3849 for(
int channel = 0; channel < 3; channel++) {
3850 register const StorageType* src = source.
GetImageData() +
3852 register StorageType* act = newImageData + channel;
3853 register const StorageType* stop = src + source.
GetPixelCount();
3854 for(;src < stop; src++) {
3866 case ImageBase::CM_RGB :
3871 for(
int channel = 0; channel < 3; channel++) {
3872 register const StorageType* src = source.
GetImageData() + (2 - channel) *
3874 register StorageType* act = newImageData + channel;
3875 register const StorageType* stop = src + source.
GetPixelCount();
3876 for(;src < stop; src++) {
3884 register const StorageType* src = source.
GetImageData();
3885 register const StorageType* stop = src + 3 * source.
GetPixelCount();
3886 register StorageType* act = newImageData;
3887 while (src < stop) {
3898 case ImageBase::CM_BGRA:
3901 StorageType *d = newImageData;
3905 const StorageType *g = b + size, *r = g + size;
3906 for (
int i = 0; i < size; i++)
3921 for (
int i = 0; i < size; i++)
3937 BIASERR(
"Only Grey, BGR and RGB images can be converted to IplImages yet."
3945 template <
class StorageType>
3949 if (8*
sizeof(StorageType) != source->depth) {
3950 BIASERR(
"Cannot convert an IplImage into an Image of different color "
3955 if (source->width <=0 || source->height <= 0) {
3956 BIASERR(
"IplImage to be converted to Image has no size!");
3962 switch (source->nChannels) {
3965 dest.
Init(source->width, source->height, 1);
3969 if (strcmp(source->colorModel,
"RGB")==0 &&
3970 strcmp(source->channelSeq,
"BGR")==0 &&
3971 source->dataOrder==IPL_DATA_ORDER_PIXEL &&
3972 (source->depth>>3)==
sizeof(StorageType) ){
3973 dest.
Init(source->width, source->height, 3);
3974 register unsigned char* src = (
unsigned char*) source->imageDataOrigin;
3975 register unsigned char* stop = src + 3 * source->width * source->height;
3977 while (src < stop) {
3984 BIASERR(
"Ipl2BIAS not implemented for this color model or inavlid storage type");
3989 BIASERR(
"Only gray IplImages can be converted to Images yet!");
3994 #endif // BIAS_HAVE_OPENCV
4006 BIASERR(
"storagetypes size must be 1 for now due to simple pointer arithmetics.\n"
4007 "Other pointer sizes need to be implemented.");
4011 BIASERR(
"storagetypes must match");
4015 BIASASSERT(raw.
GetColorModel()== vidap_DEFAULT_PACKED_COLORMODEL );
4028 unsigned char *s =NULL, *d0=NULL, *d1=NULL, *d2=NULL;
4030 for (
unsigned int y=0; y<raw.
GetHeight(); y++){
4035 for (
unsigned int x=0; x<raw.
GetWidth(); x++){
4036 *d0 = *s; s++; d0++;
4037 *d1 = *s; s++; d1++;
4038 *d2 = *s; s++; d2++;
4327 template<
class StorageType>
4328 int ImageConvert::BayerToRGBSimple(
const StorageType* source, StorageType* dest,
4330 return BayerToRGBSimple_( source, dest, sx, sy, tile);
4334 template<
class StorageType>
4335 int ImageConvert::BayerToRGBSimple_(
const StorageType* source, StorageType* dest,
4338 const int bayerStep = sx;
4339 const int rgbStep = 3 * sx;
4342 int blue = tile == ImageBase::CM_Bayer_BGGR
4343 || tile == ImageBase::CM_Bayer_GBRG ? -1 : 1;
4344 int start_with_green = tile == ImageBase::CM_Bayer_GBRG
4345 || tile == ImageBase::CM_Bayer_GRBG;
4350 for (i = sx * (sy - 1) * 3; i < imax; i++) {
4353 iinc = (sx - 1) * 3;
4354 for (i = (sx - 1) * 3; i < imax; i += iinc) {
4364 for (; height--; source += bayerStep, dest += rgbStep) {
4365 const StorageType *bayerEnd = source + width;
4367 if (start_with_green) {
4368 dest[-blue] = source[1];
4369 dest[0] = (source[0] + source[bayerStep + 1] + 1) >> 1;
4370 dest[blue] = source[bayerStep];
4376 for (; source <= bayerEnd - 2; source += 2, dest += 6) {
4377 dest[-1] = source[0];
4378 dest[0] = (source[1] + source[bayerStep] + 1) >> 1;
4379 dest[1] = source[bayerStep + 1];
4381 dest[2] = source[2];
4382 dest[3] = (source[1] + source[bayerStep + 2] + 1) >> 1;
4383 dest[4] = source[bayerStep + 1];
4386 for (; source <= bayerEnd - 2; source += 2, dest += 6) {
4387 dest[1] = source[0];
4388 dest[0] = (source[1] + source[bayerStep] + 1) >> 1;
4389 dest[-1] = source[bayerStep + 1];
4391 dest[4] = source[2];
4392 dest[3] = (source[1] + source[bayerStep + 2] + 1) >> 1;
4393 dest[2] = source[bayerStep + 1];
4397 if (source < bayerEnd) {
4398 dest[-blue] = source[0];
4399 dest[0] = (source[1] + source[bayerStep] + 1) >> 1;
4400 dest[blue] = source[bayerStep + 1];
4409 start_with_green = !start_with_green;
4415 template<
class StorageType>
4416 int ImageConvert::BayerToRGBBilinear_(
const StorageType* bayer, StorageType* rgb,
4419 const int bayerStep = sx;
4420 const int rgbStep = 3 * sx;
4423 int blue = tile == ImageBase::CM_Bayer_BGGR
4424 || tile == ImageBase::CM_Bayer_GBRG ? -1 : 1;
4425 int start_with_green = tile == ImageBase::CM_Bayer_GBRG
4426 || tile == ImageBase::CM_Bayer_GRBG;
4429 ClearBorders_(rgb, sx, sy, 1);
4430 rgb += rgbStep + 3 + 1;
4434 for (; height--; bayer += bayerStep, rgb += rgbStep) {
4436 const StorageType *bayerEnd = bayer + width;
4438 if (start_with_green) {
4441 t0 = (bayer[1] + bayer[bayerStep * 2 + 1] + 1) >> 1;
4442 t1 = (bayer[bayerStep] + bayer[bayerStep + 2] + 1) >> 1;
4443 rgb[-blue] = (StorageType) t0;
4444 rgb[0] = bayer[bayerStep + 1];
4445 rgb[blue] = (StorageType) t1;
4451 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4452 t0 = (bayer[0] + bayer[2] + bayer[bayerStep * 2] +
4453 bayer[bayerStep * 2 + 2] + 2) >> 2;
4454 t1 = (bayer[1] + bayer[bayerStep] +
4455 bayer[bayerStep + 2] + bayer[bayerStep * 2 + 1] +
4457 rgb[-1] = (StorageType) t0;
4458 rgb[0] = (StorageType) t1;
4459 rgb[1] = bayer[bayerStep + 1];
4461 t0 = (bayer[2] + bayer[bayerStep * 2 + 2] + 1) >> 1;
4462 t1 = (bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4464 rgb[2] = (StorageType) t0;
4465 rgb[3] = bayer[bayerStep + 2];
4466 rgb[4] = (StorageType) t1;
4469 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4470 t0 = (bayer[0] + bayer[2] + bayer[bayerStep * 2] +
4471 bayer[bayerStep * 2 + 2] + 2) >> 2;
4472 t1 = (bayer[1] + bayer[bayerStep] +
4473 bayer[bayerStep + 2] + bayer[bayerStep * 2 + 1] +
4475 rgb[1] = (StorageType) t0;
4476 rgb[0] = (StorageType) t1;
4477 rgb[-1] = bayer[bayerStep + 1];
4479 t0 = (bayer[2] + bayer[bayerStep * 2 + 2] + 1) >> 1;
4480 t1 = (bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4482 rgb[4] = (StorageType) t0;
4483 rgb[3] = bayer[bayerStep + 2];
4484 rgb[2] = (StorageType) t1;
4488 if (bayer < bayerEnd) {
4489 t0 = (bayer[0] + bayer[2] + bayer[bayerStep * 2] +
4490 bayer[bayerStep * 2 + 2] + 2) >> 2;
4491 t1 = (bayer[1] + bayer[bayerStep] +
4492 bayer[bayerStep + 2] + bayer[bayerStep * 2 + 1] +
4494 rgb[-blue] = (StorageType) t0;
4495 rgb[0] = (StorageType) t1;
4496 rgb[blue] = bayer[bayerStep + 1];
4505 start_with_green = !start_with_green;
4510 template<
class StorageType>
4511 int ImageConvert::BayerToRGBNearestNeighbour_(
const StorageType* bayer, StorageType* rgb,
4514 const int bayerStep = sx;
4515 const int rgbStep = 3 * sx;
4518 int blue = tile == ImageBase::CM_Bayer_BGGR
4519 || tile == ImageBase::CM_Bayer_GBRG ? -1 : 1;
4520 int start_with_green = tile == ImageBase::CM_Bayer_GBRG
4521 || tile == ImageBase::CM_Bayer_GRBG;
4525 for (i = sx * (sy - 1) * 3; i < imax; i++) {
4528 iinc = (sx - 1) * 3;
4529 for (i = (sx - 1) * 3; i < imax; i += iinc) {
4539 for (; height--; bayer += bayerStep, rgb += rgbStep) {
4541 const StorageType *bayerEnd = bayer + width;
4543 if (start_with_green) {
4544 rgb[-blue] = bayer[1];
4545 rgb[0] = bayer[bayerStep + 1];
4546 rgb[blue] = bayer[bayerStep];
4552 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4555 rgb[1] = bayer[bayerStep + 1];
4558 rgb[3] = bayer[bayerStep + 2];
4559 rgb[4] = bayer[bayerStep + 1];
4562 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4565 rgb[-1] = bayer[bayerStep + 1];
4568 rgb[3] = bayer[bayerStep + 2];
4569 rgb[2] = bayer[bayerStep + 1];
4573 if (bayer < bayerEnd) {
4574 rgb[-blue] = bayer[0];
4576 rgb[blue] = bayer[bayerStep + 1];
4585 start_with_green = !start_with_green;
4590 template<
class StorageType>
4591 void ImageConvert::ClearBorders_(StorageType *rgb,
int sx,
int sy,
int w)
4596 j = 3 * sx * sy - 1;
4602 int low = sx * (w - 1) * 3 - 1 + w * 3;
4603 i = low + sx * (sy - w * 2 + 1) * 3;
4610 i -= (sx - 2 * w) * 3;
4614 int ImageConvert::BayerToRGBHQLinear_(
const unsigned char* bayer,
unsigned char* rgb,
int sx,
int sy,
ImageBase::EColorModel tile){
4616 const int bayerStep = sx;
4617 const int rgbStep = 3 * sx;
4620 int blue = tile == ImageBase::CM_Bayer_BGGR
4621 || tile == ImageBase::CM_Bayer_GBRG ? -1 : 1;
4622 int start_with_green = tile == ImageBase::CM_Bayer_GBRG
4623 || tile == ImageBase::CM_Bayer_GRBG;
4626 ClearBorders_<unsigned char>(rgb, sx, sy, 2);
4627 rgb += 2 * rgbStep + 6 + 1;
4634 for (; height--; bayer += bayerStep, rgb += rgbStep) {
4636 const unsigned char *bayerEnd = bayer + width;
4637 const int bayerStep2 = bayerStep * 2;
4638 const int bayerStep3 = bayerStep * 3;
4639 const int bayerStep4 = bayerStep * 4;
4641 if (start_with_green) {
4643 rgb[0] = bayer[bayerStep2 + 2];
4645 + ((bayer[bayerStep + 2] + bayer[bayerStep3 + 2]) << 2)
4647 - bayer[bayerStep + 1]
4648 - bayer[bayerStep + 3]
4649 - bayer[bayerStep3 + 1]
4650 - bayer[bayerStep3 + 3]
4651 - bayer[bayerStep4 + 2]
4652 + ((bayer[bayerStep2] + bayer[bayerStep2 + 4] + 1) >> 1);
4654 ((bayer[bayerStep2 + 1] + bayer[bayerStep2 + 3]) << 2)
4656 - bayer[bayerStep + 1]
4657 - bayer[bayerStep + 3]
4658 - bayer[bayerStep3 + 1]
4659 - bayer[bayerStep3 + 3]
4660 - bayer[bayerStep2 + 4]
4661 + ((bayer[2] + bayer[bayerStep4 + 2] + 1) >> 1);
4663 CLIP<unsigned char>((
unsigned char&)t0, rgb[-blue]);
4665 CLIP<unsigned char>((
unsigned char&)t1, rgb[blue]);
4672 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4674 rgb[1] = bayer[bayerStep2 + 2];
4676 t0 = ((bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4677 bayer[bayerStep3 + 1] + bayer[bayerStep3 + 3]) << 1)
4679 (((bayer[2] + bayer[bayerStep2] +
4680 bayer[bayerStep2 + 4] + bayer[bayerStep4 +
4684 t1 = ((bayer[bayerStep + 2] + bayer[bayerStep2 + 1] +
4685 bayer[bayerStep2 + 3] + bayer[bayerStep3 + 2]) << 1)
4686 - (bayer[2] + bayer[bayerStep2] +
4687 bayer[bayerStep2 + 4] + bayer[bayerStep4 + 2])
4690 CLIP<unsigned char>((
unsigned char&)t0, rgb[-1]);
4692 CLIP<unsigned char>((
unsigned char&)t1, rgb[0]);
4694 rgb[3] = bayer[bayerStep2 + 3];
4696 + ((bayer[bayerStep + 3] + bayer[bayerStep3 + 3]) << 2)
4698 - bayer[bayerStep + 2]
4699 - bayer[bayerStep + 4]
4700 - bayer[bayerStep3 + 2]
4701 - bayer[bayerStep3 + 4]
4702 - bayer[bayerStep4 + 3]
4704 ((bayer[bayerStep2 + 1] + bayer[bayerStep2 + 5] +
4707 ((bayer[bayerStep2 + 2] + bayer[bayerStep2 + 4]) << 2)
4708 - bayer[bayerStep2 + 1]
4709 - bayer[bayerStep + 2]
4710 - bayer[bayerStep + 4]
4711 - bayer[bayerStep3 + 2]
4712 - bayer[bayerStep3 + 4]
4713 - bayer[bayerStep2 + 5]
4714 + ((bayer[3] + bayer[bayerStep4 + 3] + 1) >> 1);
4716 CLIP<unsigned char>((
unsigned char&)t0, rgb[2]);
4718 CLIP<unsigned char>((
unsigned char&)t1, rgb[4]);
4721 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4723 rgb[-1] = bayer[bayerStep2 + 2];
4725 t0 = ((bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4726 bayer[bayerStep3 + 1] + bayer[bayerStep3 + 3]) << 1)
4728 (((bayer[2] + bayer[bayerStep2] +
4729 bayer[bayerStep2 + 4] + bayer[bayerStep4 +
4733 t1 = ((bayer[bayerStep + 2] + bayer[bayerStep2 + 1] +
4734 bayer[bayerStep2 + 3] + bayer[bayerStep * 3 +
4736 - (bayer[2] + bayer[bayerStep2] +
4737 bayer[bayerStep2 + 4] + bayer[bayerStep4 + 2])
4740 CLIP<unsigned char>((
unsigned char&)t0, rgb[1]);
4742 CLIP<unsigned char>((
unsigned char&)t1, rgb[0]);
4745 rgb[3] = bayer[bayerStep2 + 3];
4747 + ((bayer[bayerStep + 3] + bayer[bayerStep3 + 3]) << 2)
4749 - bayer[bayerStep + 2]
4750 - bayer[bayerStep + 4]
4751 - bayer[bayerStep3 + 2]
4752 - bayer[bayerStep3 + 4]
4753 - bayer[bayerStep4 + 3]
4755 ((bayer[bayerStep2 + 1] + bayer[bayerStep2 + 5] +
4758 ((bayer[bayerStep2 + 2] + bayer[bayerStep2 + 4]) << 2)
4759 - bayer[bayerStep2 + 1]
4760 - bayer[bayerStep + 2]
4761 - bayer[bayerStep + 4]
4762 - bayer[bayerStep3 + 2]
4763 - bayer[bayerStep3 + 4]
4764 - bayer[bayerStep2 + 5]
4765 + ((bayer[3] + bayer[bayerStep4 + 3] + 1) >> 1);
4767 CLIP<unsigned char>((
unsigned char&)t0, rgb[4]);
4769 CLIP<unsigned char>((
unsigned char&)t1, rgb[2]);
4773 if (bayer < bayerEnd) {
4775 rgb[blue] = bayer[bayerStep2 + 2];
4777 t0 = ((bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4778 bayer[bayerStep3 + 1] + bayer[bayerStep3 + 3]) << 1)
4780 (((bayer[2] + bayer[bayerStep2] +
4781 bayer[bayerStep2 + 4] + bayer[bayerStep4 +
4785 t1 = (((bayer[bayerStep + 2] + bayer[bayerStep2 + 1] +
4786 bayer[bayerStep2 + 3] + bayer[bayerStep3 + 2])) << 1)
4787 - (bayer[2] + bayer[bayerStep2] +
4788 bayer[bayerStep2 + 4] + bayer[bayerStep4 + 2])
4791 CLIP<unsigned char>((
unsigned char&)t0, rgb[-blue]);
4793 CLIP<unsigned char>((
unsigned char&)t1, rgb[0]);
4804 start_with_green = !start_with_green;
4811 int ImageConvert::BayerToRGBHQLinear_(
const unsigned short* bayer,
unsigned short* rgb,
int sx,
int sy,
ImageBase::EColorModel tile,
int bit){
4813 unsigned short bits = (
unsigned short) bit;
4814 const int bayerStep = sx;
4815 const int rgbStep = 3 * sx;
4818 int blue = tile == ImageBase::CM_Bayer_BGGR
4819 || tile == ImageBase::CM_Bayer_GBRG ? -1 : 1;
4820 int start_with_green = tile == ImageBase::CM_Bayer_GBRG
4821 || tile == ImageBase::CM_Bayer_GRBG;
4824 ClearBorders_<unsigned short>(rgb, sx, sy, 2);
4825 rgb += 2 * rgbStep + 6 + 1;
4832 for (; height--; bayer += bayerStep, rgb += rgbStep) {
4833 unsigned short t0, t1;
4834 const unsigned short *bayerEnd = bayer + width;
4835 const int bayerStep2 = bayerStep * 2;
4836 const int bayerStep3 = bayerStep * 3;
4837 const int bayerStep4 = bayerStep * 4;
4839 if (start_with_green) {
4841 rgb[0] = bayer[bayerStep2 + 2];
4843 + ((bayer[bayerStep + 2] + bayer[bayerStep3 + 2]) << 2)
4845 - bayer[bayerStep + 1]
4846 - bayer[bayerStep + 3]
4847 - bayer[bayerStep3 + 1]
4848 - bayer[bayerStep3 + 3]
4849 - bayer[bayerStep4 + 2]
4850 + ((bayer[bayerStep2] + bayer[bayerStep2 + 4] + 1) >> 1);
4852 ((bayer[bayerStep2 + 1] + bayer[bayerStep2 + 3]) << 2)
4854 - bayer[bayerStep + 1]
4855 - bayer[bayerStep + 3]
4856 - bayer[bayerStep3 + 1]
4857 - bayer[bayerStep3 + 3]
4858 - bayer[bayerStep2 + 4]
4859 + ((bayer[2] + bayer[bayerStep4 + 2] + 1) >> 1);
4861 CLIP16<unsigned short>((
unsigned short&)t0,rgb[-blue],bits);
4863 CLIP16<unsigned short>((
unsigned short&)t1,rgb[blue],bits);
4870 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4872 rgb[1] = bayer[bayerStep2 + 2];
4874 t0 = ((bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4875 bayer[bayerStep3 + 1] + bayer[bayerStep3 + 3]) << 1)
4877 (((bayer[2] + bayer[bayerStep2] +
4878 bayer[bayerStep2 + 4] + bayer[bayerStep4 +
4882 t1 = ((bayer[bayerStep + 2] + bayer[bayerStep2 + 1] +
4883 bayer[bayerStep2 + 3] + bayer[bayerStep3 + 2]) << 1)
4884 - (bayer[2] + bayer[bayerStep2] +
4885 bayer[bayerStep2 + 4] + bayer[bayerStep4 + 2])
4888 CLIP16<unsigned short>((
unsigned short&)t0, rgb[-1],bits);
4890 CLIP16<unsigned short>((
unsigned short&)t1, rgb[0],bits);
4892 rgb[3] = bayer[bayerStep2 + 3];
4894 + ((bayer[bayerStep + 3] + bayer[bayerStep3 + 3]) << 2)
4896 - bayer[bayerStep + 2]
4897 - bayer[bayerStep + 4]
4898 - bayer[bayerStep3 + 2]
4899 - bayer[bayerStep3 + 4]
4900 - bayer[bayerStep4 + 3]
4902 ((bayer[bayerStep2 + 1] + bayer[bayerStep2 + 5] +
4905 ((bayer[bayerStep2 + 2] + bayer[bayerStep2 + 4]) << 2)
4906 - bayer[bayerStep2 + 1]
4907 - bayer[bayerStep + 2]
4908 - bayer[bayerStep + 4]
4909 - bayer[bayerStep3 + 2]
4910 - bayer[bayerStep3 + 4]
4911 - bayer[bayerStep2 + 5]
4912 + ((bayer[3] + bayer[bayerStep4 + 3] + 1) >> 1);
4914 CLIP16<unsigned short>((
unsigned short&)t0,rgb[2],bits);
4917 CLIP16<unsigned short>((
unsigned short&)t1,rgb[4],bits);
4920 for (; bayer <= bayerEnd - 2; bayer += 2, rgb += 6) {
4922 rgb[-1] = bayer[bayerStep2 + 2];
4924 t0 = ((bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4925 bayer[bayerStep3 + 1] + bayer[bayerStep3 + 3]) << 1)
4927 (((bayer[2] + bayer[bayerStep2] +
4928 bayer[bayerStep2 + 4] + bayer[bayerStep4 +
4932 t1 = ((bayer[bayerStep + 2] + bayer[bayerStep2 + 1] +
4933 bayer[bayerStep2 + 3] + bayer[bayerStep * 3 +
4935 - (bayer[2] + bayer[bayerStep2] +
4936 bayer[bayerStep2 + 4] + bayer[bayerStep4 + 2])
4939 CLIP16<unsigned short>((
unsigned short&)t0,rgb[1],bits);
4941 CLIP16<unsigned short>((
unsigned short&)t1,rgb[0],bits);
4944 rgb[3] = bayer[bayerStep2 + 3];
4946 + ((bayer[bayerStep + 3] + bayer[bayerStep3 + 3]) << 2)
4948 - bayer[bayerStep + 2]
4949 - bayer[bayerStep + 4]
4950 - bayer[bayerStep3 + 2]
4951 - bayer[bayerStep3 + 4]
4952 - bayer[bayerStep4 + 3]
4954 ((bayer[bayerStep2 + 1] + bayer[bayerStep2 + 5] +
4957 ((bayer[bayerStep2 + 2] + bayer[bayerStep2 + 4]) << 2)
4958 - bayer[bayerStep2 + 1]
4959 - bayer[bayerStep + 2]
4960 - bayer[bayerStep + 4]
4961 - bayer[bayerStep3 + 2]
4962 - bayer[bayerStep3 + 4]
4963 - bayer[bayerStep2 + 5]
4964 + ((bayer[3] + bayer[bayerStep4 + 3] + 1) >> 1);
4966 CLIP16<unsigned short>((
unsigned short&)t0,rgb[4],bits);
4968 CLIP16<unsigned short>((
unsigned short&)t1,rgb[2],bits);
4972 if (bayer < bayerEnd) {
4974 rgb[blue] = bayer[bayerStep2 + 2];
4976 t0 = ((bayer[bayerStep + 1] + bayer[bayerStep + 3] +
4977 bayer[bayerStep3 + 1] + bayer[bayerStep3 + 3]) << 1)
4979 (((bayer[2] + bayer[bayerStep2] +
4980 bayer[bayerStep2 + 4] + bayer[bayerStep4 +
4984 t1 = (((bayer[bayerStep + 2] + bayer[bayerStep2 + 1] +
4985 bayer[bayerStep2 + 3] + bayer[bayerStep3 + 2])) << 1)
4986 - (bayer[2] + bayer[bayerStep2] +
4987 bayer[bayerStep2 + 4] + bayer[bayerStep4 + 2])
4990 CLIP16<unsigned short>((
unsigned short&)t0,rgb[-blue],bits);
4992 CLIP16<unsigned short>((
unsigned short&)t1,rgb[0],bits);
5003 start_with_green = !start_with_green;
5010 template<
class StorageType>
5011 int ImageConvert::BayerToRGBAHD_(
const StorageType* source, StorageType* dest,
int sx,
int sy,
ImageBase::EColorModel tile,
int bits){
5016 template <
class StorageType>
5017 void ImageConvert::CLIP(StorageType& in, StorageType& out){
5018 in = in < 0 ? 0 : in;
5019 in = in > 255 ? 255 : in;
5023 template <
class StorageType>
5024 void ImageConvert::CLIP16(StorageType& in, StorageType& out, StorageType bits){
5025 in = in < 0 ? 0 : in;
5026 in = in > ((1<<bits)-1) ? ((1<<bits)-1) : in;
5033 #include "ImageConvertInstantiation.cpp"
EColorModel
These are the most often used color models.
void Release()
reimplemented from ImageBase
static int GreyToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
static int IP_RGBToGrey_(Image< StorageType > &img)
void SetBitDepth(unsigned bitdepth)
needed by ImageIO
void PrintHeader(std::ostream &os=std::cout) const
static int BayerToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
interpolates, better than above
(16bit) unsigned integer image storage type
static int BayerToRGBSlow_(const Image< StorageType > &source, Image< StorageType > &dest)
this is the right way, green interpoaltion is mostly done out of two values no visible difference to ...
unsigned int GetDepth() const
returns the bytes per channel, which is the sizeof(StorageType) Should match GetSizeDepth(GetStorageT...
HSL, similar to HSV but space is a double tipped cone.
int SetCorners(unsigned UpperLeftX, unsigned UpperLeftY, unsigned LowerRightX, unsigned LowerRightY)
Sets a rectangular region of interest.
void GetCorners(unsigned &UpperLeftX, unsigned &UpperLeftY, unsigned &LowerRightX, unsigned &LowerRightY) const
Return the region of interest, by saving the coordinates within the variables defined by the paramete...
unsigned int Depth_
size of one channel of one pixel in bytes
bool IsEmpty() const
check if ImageData_ points to allocated image buffer or not
bool IsInterleaved() const
(8bit) signed char image storage type
unsigned int GetWidthStep() const
returns the number of bytes per line
void SetColorModel(EColorModel Model)
unsigned int GetSizeByte() const
returns the nr.
static int YUV411ToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
unsigned int WidthStep_
size of a line in bytes for interleaved, NOT nr . of pixels (but size a line in one plane for planar)...
double image storage type
static void ConvertRGBToI1I2I3Worker_(const sourceType *soP, float *siP, int size)
static int YUV420PToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
unsigned int GetWidth() const
unsigned int GetBitDepth() const
returns the bits per channel Is not necessairily 8*sizeof(StorageType), could be fewer bits...
StorageType PixelValue(const unsigned int x, const unsigned int y, const unsigned short int channel=0) const
Returns value of pixel at specific position, using specific channel as offset.
static int GetChannel(const Image< StorageType > &source, Image< StorageType > &dest, const unsigned int channel)
Create a new image dest by cropping one of the source images channels.
static int ToRGBA(const Image< StorageType > &source, Image< StorageType > &dest)
Create a RGBA converted copy of source image in dest.
(16bit) signed integer image storage type
color values, 3 channels, order: blue,green,red
const void * GetImageData() const
static int BGRToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
static int BayerToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
added border calculation, woelk evers, woelk
static int DVToRGB_(const Image< StorageType > &source, Image< StorageType > &dest, unsigned char quality=4)
foreign image formats, ipl, vil, ImageMagick
BayerDemosaicMethod
methods for conversion from bayer to rgb
static int RGBToI1I2I3(const BIAS::ImageBase &source, BIAS::Image< float > &dest)
Converts RGB image to Othe's principle component generalization for RGB based segmentation.
static int YUV420PToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
ROI * GetROI()
Returns a pointer to the roi object.
static int BGRAToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
not tested - use at own risk - alpha channel will be ignored
void ** GetImageDataArray() const
Get an array of pointers to image data.
int StealImage(ImageBase &source)
steals the image data array from source, after releasing the actual image data and sets source image ...
unsigned int GetChannelCount() const
returns the number of Color channels, e.g.
color values, 3 channels, order: red,green,blue
unsigned int GetHeight() const
static int HSLToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
just copies the L channel
int SetROI(unsigned int UpperLeftX, unsigned int UpperLeftY, unsigned int LowerRightX, unsigned int LowerRightY)
deprecated, use SetROICorners()
void SetPixel(const StorageType &value, const unsigned int &x, const unsigned int &y, const unsigned short int channel=0)
Set the value of a given pixel (x,y) in channel to value.
void Init(unsigned int Width, unsigned int Height, unsigned int channels=1, enum EStorageType storageType=ST_unsignedchar, const bool interleaved=true)
calls Init from ImageBase storageType is ignored, just dummy argument
const StorageType * GetImageData() const
overloaded GetImageData() from ImageBase
RGBA, 4 channels, order: red,green,blue,alpha.
unsigned int ChannelCount_
number of channels per pixel
void Release(const bool reset_storage_type=false)
Free the allocated data structures Hands off: Do !!NOT!! change the default of reset_storage_type: Im...
enum EColorModel GetColorModel() const
(32bit) signed integer image storage type
void Init(unsigned int width, unsigned int height, unsigned int nChannels=1, enum EStorageType storageType=ST_unsignedchar, const bool interleaved=true)
Initialize image size and channels.
void ReleaseImageDataPointer()
Releases ImageData_ (to be used together with RedirectImageDataPointer)
static int BIAS2ImageMagick(const BIAS::ImageBase &input, Magick::Image &dest)
Returns a new, separate ImageMagick Image for use with ImageMagick created from the source BIAS Image...
static int IP_YUV422ToGrey_(Image< StorageType > &img)
enum EStorageType GetStorageType() const
(8bit) unsigned char image storage type
static int BayerToRGB(const Image< StorageType > &source, Image< StorageType > &dest, BayerDemosaicMethod method=BAYER_DEMOSAIC_METHOD_BILINEAR, bool flip=false)
converts an image with bayer pattern to rgb
HSV, 3 channels, order: hue, sat , value.
int UpdateImageDataArrayFromImageData_()
recomputes pointer array returned by GetImageDataArray
static int RGBToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
static int ImageMagick2BIAS(Magick::Image &image, BIAS::ImageBase &result)
Returns a new, separate BIAS Image created from the source ImageMagick Image.
static int YUV422ToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
void * ImageData_
a pointer to the image data
static int RGBAToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
unsigned long int GetPixelCount() const
returns number of pixels in image
GreyA, 2 channels, grey plus Alpha.
This is the base class for images in BIAS.
void RedirectImageDataPointer(void *data)
This method takes data and set the internal image data pointer to this.
static int ToRGB(const Image< StorageType > &source, Image< StorageType > &dest)
Create a RGB converted copy of source image in this.
int FlipHorizontal()
flips the image horizontal (column order is inverted) In place function return 0 in case of success...
static int BGRAToRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
unsigned int Width_
image width in pixels
enum EColorModel ColorModel_
the color model of the pixels
static int YUV422ToGrey_(const Image< StorageType > &source, Image< StorageType > &dest)
static int IP_ToGrey(Image< StorageType > &img)
In place conversion to gray image.
(32bit) unsigned integer image storage type
static int ToGrey(const ImageBase &source, ImageBase &dest)
wrapper for the templated function ToGrey