Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GDCMIMAGECHANGEPHOTOMETRICINTERPRETATION_H
00016 #define GDCMIMAGECHANGEPHOTOMETRICINTERPRETATION_H
00017
00018 #include "gdcmImageToImageFilter.h"
00019 #include "gdcmPhotometricInterpretation.h"
00020
00021 namespace gdcm
00022 {
00023
00024 class DataElement;
00029 class GDCM_EXPORT ImageChangePhotometricInterpretation : public ImageToImageFilter
00030 {
00031 public:
00032 ImageChangePhotometricInterpretation():PI() {}
00033 ~ImageChangePhotometricInterpretation() {}
00034
00036 void SetPhotometricInterpretation(PhotometricInterpretation const &pi) { PI = pi; }
00037 const PhotometricInterpretation &GetPhotometricInterpretation() const { return PI; }
00038
00040 bool Change();
00041
00043 template <typename T>
00044 static void RGB2YBR(T ybr[3], const T rgb[3]);
00045 template <typename T>
00046 static void YBR2RGB(T rgb[3], const T ybr[3]);
00047
00048 protected:
00049 bool ChangeMonochrome();
00050
00051 private:
00052 PhotometricInterpretation PI;
00053 };
00054
00055
00056
00057 template <typename T>
00058 void ImageChangePhotometricInterpretation::RGB2YBR(T ybr[3], const T rgb[3])
00059 {
00060 #if 1
00061 ybr[0] = 65.738 * rgb[0] + 129.057 * rgb[1] + 25.064 * rgb[2] + 16;
00062 ybr[1] = -37.945 * rgb[0] + -74.494 * rgb[1] + 112.439 * rgb[2] + 128;
00063 ybr[2] = 112.439 * rgb[0] + -94.154 * rgb[1] + -18.285 * rgb[2] + 128;
00064 #else
00065
00066 const double R = rgb[0];
00067 const double G = rgb[1];
00068 const double B = rgb[2];
00069 const double Y = .2990 * R + .5870 * G + .1140 * B;
00070 const double CB = -.168736 * R - .331264 * G + .5000 * B + 128;
00071 const double CR = .5000 * R - .418688 * G - .081312 * B + 128;
00072
00073
00074
00075 ybr[0] = Y ;
00076 ybr[1] = CB ;
00077 ybr[2] = CR ;
00078 #endif
00079 }
00080
00081 template <typename T>
00082 void ImageChangePhotometricInterpretation::YBR2RGB(T rgb[3], const T ybr[3])
00083 {
00084
00085 #if 1
00086 rgb[0] = 298.082 * ((int)ybr[0]-16) + 0. * ((int)ybr[1]-128) + 408.583 * ((int)ybr[2]-128) - 1. / 256;
00087 rgb[1] = 298.082 * ((int)ybr[0]-16) + -100.291 * ((int)ybr[1]-128) + -208.12 * ((int)ybr[2]-128) - 1. / 256;
00088 rgb[2] = 298.082 * ((int)ybr[0]-16) + 516.411 * ((int)ybr[1]-128) + 0. * ((int)ybr[2]-128) - 1. / 256;
00089
00090 #else
00091 const double Y = ybr[0];
00092 const double Cb = ybr[1];
00093 const double Cr = ybr[2];
00094
00095
00096
00097 const double r = Y + 1.402 * (Cr-128);
00098 const double g = Y - 0.344136 * (Cb-128) - 0.714136 * (Cr-128);
00099 const double b = Y + 1.772 * (Cb-128);
00100 double R = r < 0 ? 0 : r;
00101 R = R > 255 ? 255 : R;
00102 double G = g < 0 ? 0 : g;
00103 G = G > 255 ? 255 : G;
00104 double B = b < 0 ? 0 : b;
00105 B = B > 255 ? 255 : B;
00106 assert( R >= 0 && R <= 255 );
00107 assert( G >= 0 && G <= 255 );
00108 assert( B >= 0 && B <= 255 );
00109 rgb[0] = ((R < 0 ? 0 : R) > 255 ? 255 : R);
00110 rgb[1] = G;
00111 rgb[2] = B;
00112 #endif
00113
00114 }
00115
00116 }
00117
00118 #endif //GDCMIMAGECHANGEPHOTOMETRICINTERPRETATION_H
00119