11 #ifndef BRAINRAT_UTILITY_CHANNELEXTRACTOR_H
12 #define BRAINRAT_UTILITY_CHANNELEXTRACTOR_H
19 #include <aims/rgb/rgb.h>
20 #include <aims/io/io_g.h>
22 #include <cartodata/volume/volume.h>
23 #include <cartodata/volume/volumeutil.h>
25 #include <cartobase/type/datatypetraits.h>
26 #include <cartobase/type/types.h>
74 virtual const char *
what()
const throw()
76 return "Resampler: Bad options";
84 template <
typename T,
typename C>
92 return (C) (
_a * (double) val +
_b );
109 template <
typename T>
133 template <
typename T>
136 _imin = (double) carto::VolumeUtil<T>::min( in );
138 template <
typename T>
141 _imax = (double) carto::VolumeUtil<T>::max( in );
143 template <
typename T>
146 _imin = (double) std::numeric_limits<T>::min();
148 template <
typename T>
151 _imax = (double) std::numeric_limits<T>::max();
153 template <
typename C>
156 _omin = (double) std::numeric_limits<C>::min();
158 template <
typename C>
161 _omax = (double) std::numeric_limits<C>::max();
172 template <
typename T,
typename C>
187 computeInputTypeMax<T>();
189 computeInputTypeMax<T>();
192 computeOutputMin<C>();
194 computeOutputMax<C>();
220 void Rescaler::computeInputDynMin<AimsRGB>( carto::VolumeRef<AimsRGB> in,
int ch )
222 carto::VolumeRef<AimsRGB>::const_iterator i, ie = in.end();
223 _imin = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGB>::ChannelType>::
max();
224 for( i = in.begin(); i != ie; ++i )
226 if(
_imin > (
double) (*i)[ch] )
227 _imin = (
double) (*i)[ch];
232 void Rescaler::computeInputDynMax<AimsRGB>( carto::VolumeRef<AimsRGB> in,
int ch )
234 carto::VolumeRef<AimsRGB>::const_iterator i, ie = in.end();
235 _imax = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGB>::ChannelType>::
min();
236 for( i = in.begin(); i != ie; ++i )
238 if(
_imax > (
double) (*i)[ch] )
239 _imax = (
double) (*i)[ch];
244 void Rescaler::computeInputTypeMin<AimsRGB>()
246 _imin = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGB>::ChannelType>::
min();
250 void Rescaler::computeInputTypeMax<AimsRGB>()
252 _imax = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGB>::ChannelType>::
max();
257 void Rescaler::computeInputDynMin<AimsRGBA>( carto::VolumeRef<AimsRGBA> in,
int ch )
259 carto::VolumeRef<AimsRGBA>::const_iterator i, ie = in.end();
260 _imin = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGBA>::ChannelType>::
max();
261 for( i = in.begin(); i != ie; ++i )
263 if(
_imin > (
double) (*i)[ch] )
264 _imin = (
double) (*i)[ch];
269 void Rescaler::computeInputDynMax<AimsRGBA>( carto::VolumeRef<AimsRGBA> in,
int ch )
271 carto::VolumeRef<AimsRGBA>::const_iterator i, ie = in.end();
272 _imax = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGBA>::ChannelType>::
min();
273 for( i = in.begin(); i != ie; ++i )
275 if(
_imax > (
double) (*i)[ch] )
276 _imax = (
double) (*i)[ch];
281 void Rescaler::computeInputTypeMin<AimsRGBA>()
283 _imin = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGBA>::ChannelType>::
min();
287 void Rescaler::computeInputTypeMax<AimsRGBA>()
289 _imax = (double) std::numeric_limits<carto::DataTypeTraits<AimsRGBA>::ChannelType>::
max();
294 void Rescaler::computeInputDynMin<AimsHSV>( carto::VolumeRef<AimsHSV> in,
int ch )
296 carto::VolumeRef<AimsHSV>::const_iterator i, ie = in.end();
297 _imin = (double) std::numeric_limits<carto::DataTypeTraits<AimsHSV>::ChannelType>::
max();
298 for( i = in.begin(); i != ie; ++i )
300 if(
_imin > (
double) (*i)[ch] )
301 _imin = (
double) (*i)[ch];
306 void Rescaler::computeInputDynMax<AimsHSV>( carto::VolumeRef<AimsHSV> in,
int ch )
308 carto::VolumeRef<AimsHSV>::const_iterator i, ie = in.end();
309 _imax = (double) std::numeric_limits<carto::DataTypeTraits<AimsHSV>::ChannelType>::
min();
310 for( i = in.begin(); i != ie; ++i )
312 if(
_imax > (
double) (*i)[ch] )
313 _imax = (
double) (*i)[ch];
318 void Rescaler::computeInputTypeMin<AimsHSV>()
320 _imin = (double) std::numeric_limits<carto::DataTypeTraits<AimsHSV>::ChannelType>::
min();
324 void Rescaler::computeInputTypeMax<AimsHSV>()
326 _imax = (double) std::numeric_limits<carto::DataTypeTraits<AimsHSV>::ChannelType>::
max();
332 template <
typename T,
typename C>
347 virtual const char *
what()
const throw()
349 return (
"ChannelExtractor: type " + carto::DataTypeCode<T>::name() +
" not implemented").c_str();
474 carto::VolumeRef<C> out( in.getSizeX(), in.getSizeY(),
475 in.getSizeZ(), in.getSizeT() );
476 out->copyHeaderFrom( in.header() );
483 template <
typename C>
493 void getChannelR( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
494 void getChannelG( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
495 void getChannelB( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
497 void getChannelYl( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
498 void getChannelCb( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
499 void getChannelCr( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
500 void getChannelH( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
501 void getChannelS( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
502 void getChannelV( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
503 void getChannelX( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
504 void getChannelY( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
505 void getChannelZ( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
506 void getChannelL( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
507 void getChannela( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
508 void getChannelb( carto::VolumeRef<AimsRGB>, carto::VolumeRef<C> );
612 carto::VolumeRef<C> out( in.getSizeX(), in.getSizeY(),
613 in.getSizeZ(), in.getSizeT() );
614 out->copyHeaderFrom( in.header() );
619 template <
typename C>
622 computeRuntimeMinMax<AimsRGB,C>( in, 0 );
624 long dimx = in.getSizeX(),
625 dimy = in.getSizeY(),
626 dimz = in.getSizeZ(),
627 dimt = in.getSizeT();
628 for(
long t=0; t< dimt; ++t )
629 for(
long z=0; z< dimz; ++z )
630 for(
long y=0; y< dimy; ++y )
631 for(
long x=0; x< dimx; ++x )
632 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGB>::ChannelType,C>( in( x, y, z, t ).red() );
635 template <
typename C>
638 computeRuntimeMinMax<AimsRGB,C>( in, 1 );
640 long dimx = in.getSizeX(),
641 dimy = in.getSizeY(),
642 dimz = in.getSizeZ(),
643 dimt = in.getSizeT();
644 for(
long t=0; t< dimt; ++t )
645 for(
long z=0; z< dimz; ++z )
646 for(
long y=0; y< dimy; ++y )
647 for(
long x=0; x< dimx; ++x )
648 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGB>::ChannelType,C>( in( x, y, z, t ).green() );
651 template <
typename C>
654 computeRuntimeMinMax<AimsRGB,C>( in, 2 );
656 long dimx = in.getSizeX(),
657 dimy = in.getSizeY(),
658 dimz = in.getSizeZ(),
659 dimt = in.getSizeT();
660 for(
long t=0; t< dimt; ++t )
661 for(
long z=0; z< dimz; ++z )
662 for(
long y=0; y< dimy; ++y )
663 for(
long x=0; x< dimx; ++x )
664 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGB>::ChannelType,C>( in( x, y, z, t ).blue() );
667 template <
typename C>
670 computeRuntimeMinMax<AimsRGB,C>( in );
673 long dimx = in.getSizeX(),
674 dimy = in.getSizeY(),
675 dimz = in.getSizeZ(),
676 dimt = in.getSizeT();
677 for(
long t=0; t< dimt; ++t )
678 for(
long z=0; z< dimz; ++z )
679 for(
long y=0; y< dimy; ++y )
680 for(
long x=0; x< dimx; ++x )
682 val = (double) in( x, y, z, t ).red()
683 + (double) in( x, y, z, t ).green()
684 + (double) in( x, y, z, t ).blue();
686 out( x, y, z, t ) = rescale<double,C>( val );
690 template <
typename C>
693 computeRuntimeMinMax<AimsRGB,C>( in );
696 long dimx = in.getSizeX(),
697 dimy = in.getSizeY(),
698 dimz = in.getSizeZ(),
699 dimt = in.getSizeT();
700 for(
long t=0; t< dimt; ++t )
701 for(
long z=0; z< dimz; ++z )
702 for(
long y=0; y< dimy; ++y )
703 for(
long x=0; x< dimx; ++x )
705 val = 0.299 * (double) in( x, y, z, t ).red()
706 + 0.587 * (double) in( x, y, z, t ).green()
707 + 0.114 * (double) in( x, y, z, t ).blue();
708 out( x, y, z, t ) = rescale<double,C>( val );
712 template <
typename C>
715 computeRuntimeMinMax<AimsRGB,C>( in );
718 long dimx = in.getSizeX(),
719 dimy = in.getSizeY(),
720 dimz = in.getSizeZ(),
721 dimt = in.getSizeT();
722 for(
long t=0; t< dimt; ++t )
723 for(
long z=0; z< dimz; ++z )
724 for(
long y=0; y< dimy; ++y )
725 for(
long x=0; x< dimx; ++x )
727 val = - 0.1687 * (double) in( x, y, z, t ).red()
728 - 0.3313 * (double) in( x, y, z, t ).green()
729 + 0.5 * (double) in( x, y, z, t ).blue()
731 out( x, y, z, t ) = rescale<double,C>( val );
735 template <
typename C>
738 computeRuntimeMinMax<AimsRGB,C>( in );
741 long dimx = in.getSizeX(),
742 dimy = in.getSizeY(),
743 dimz = in.getSizeZ(),
744 dimt = in.getSizeT();
745 for(
long t=0; t< dimt; ++t )
746 for(
long z=0; z< dimz; ++z )
747 for(
long y=0; y< dimy; ++y )
748 for(
long x=0; x< dimx; ++x )
750 val = 0.5 * (double) in( x, y, z, t ).red()
751 - 0.4187 * (double) in( x, y, z, t ).green()
752 - 0.0813 * (double) in( x, y, z, t ).blue()
754 out( x, y, z, t ) = rescale<double,C>( val );
758 template <
typename C>
761 computeRuntimeMinMax<AimsRGB,C>( in );
764 long dimx = in.getSizeX(),
765 dimy = in.getSizeY(),
766 dimz = in.getSizeZ(),
767 dimt = in.getSizeT();
768 for(
long t=0; t< dimt; ++t )
769 for(
long z=0; z< dimz; ++z )
770 for(
long y=0; y< dimy; ++y )
771 for(
long x=0; x< dimx; ++x )
773 val = std::atan2( std::sqrt(3) * (
774 (
double) in( x, y, z, t ).green() -
775 (
double) in( x, y, z, t ).blue() ),
777 (
double) in( x, y, z, t ).red() -
778 (
double) in( x, y, z, t ).green() -
779 (
double) in( x, y, z, t ).blue() )
781 out( x, y, z, t ) = rescale<double,C>( val );
785 template <
typename C>
788 computeRuntimeMinMax<AimsRGB,C>( in );
790 long dimx = in.getSizeX(),
791 dimy = in.getSizeY(),
792 dimz = in.getSizeZ(),
793 dimt = in.getSizeT();
794 for(
long t=0; t< dimt; ++t )
795 for(
long z=0; z< dimz; ++z )
796 for(
long y=0; y< dimy; ++y )
797 for(
long x=0; x< dimx; ++x )
799 min = ( in( x, y, z, t ).red() <= in( x, y, z, t ).green()
800 ? (double) in( x, y, z, t ).red()
801 : (double) in( x, y, z, t ).green() );
802 min = (
min <= (double) in( x, y, z, t ).blue()
804 : in( x, y, z, t ).blue() );
805 max = ( in( x, y, z, t ).red() >= in( x, y, z, t ).green()
806 ? (double) in( x, y, z, t ).red()
807 : (double) in( x, y, z, t ).green() );
808 max = (
max >= (double) in( x, y, z, t ).blue()
810 : in( x, y, z, t ).blue() );
812 out( x, y, z, t ) = rescale<double,C>( val );
816 template <
typename C>
819 computeRuntimeMinMax<AimsRGB,C>( in );
821 long dimx = in.getSizeX(),
822 dimy = in.getSizeY(),
823 dimz = in.getSizeZ(),
824 dimt = in.getSizeT();
825 for(
long t=0; t< dimt; ++t )
826 for(
long z=0; z< dimz; ++z )
827 for(
long y=0; y< dimy; ++y )
828 for(
long x=0; x< dimx; ++x )
830 max = ( in( x, y, z, t ).red() >= in( x, y, z, t ).green()
831 ? (double) in( x, y, z, t ).red()
832 : (double) in( x, y, z, t ).green() );
833 max = (
max >= (double) in( x, y, z, t ).blue()
835 : in( x, y, z, t ).blue() );
836 out( x, y, z, t ) = rescale<double,C>(
max );
840 template <
typename C>
843 computeRuntimeMinMax<AimsRGB,C>( in );
846 long dimx = in.getSizeX(),
847 dimy = in.getSizeY(),
848 dimz = in.getSizeZ(),
849 dimt = in.getSizeT();
850 for(
long t=0; t< dimt; ++t )
851 for(
long z=0; z< dimz; ++z )
852 for(
long y=0; y< dimy; ++y )
853 for(
long x=0; x< dimx; ++x )
855 valin[0] = ((double) in( x, y, z, t ).red())/255;
856 valin[1] = ((double) in( x, y, z, t ).green())/255;
857 valin[2] = ((double) in( x, y, z, t ).blue())/255;
859 for(
int n=0; n<3; ++n){
860 if( valin[n] > 0.04045 )
861 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
863 valin[n] = valin[n]/12.92;
866 valout = 0.412453*valin[0] + 0.357580*valin[1] + 0.180423*valin[2];
869 out( x, y, z, t ) = rescale<double,C>( valout );
873 template <
typename C>
876 computeRuntimeMinMax<AimsRGB,C>( in );
879 long dimx = in.getSizeX(),
880 dimy = in.getSizeY(),
881 dimz = in.getSizeZ(),
882 dimt = in.getSizeT();
883 for(
long t=0; t< dimt; ++t )
884 for(
long z=0; z< dimz; ++z )
885 for(
long y=0; y< dimy; ++y )
886 for(
long x=0; x< dimx; ++x )
888 valin[0] = ((double) in( x, y, z, t ).red())/255;
889 valin[1] = ((double) in( x, y, z, t ).green())/255;
890 valin[2] = ((double) in( x, y, z, t ).blue())/255;
892 for(
int n=0; n<3; ++n){
893 if( valin[n] > 0.04045 )
894 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
896 valin[n] = valin[n]/12.92;
899 valout = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
902 out( x, y, z, t ) = rescale<double,C>( valout );
906 template <
typename C>
909 computeRuntimeMinMax<AimsRGB,C>( in );
912 long dimx = in.getSizeX(),
913 dimy = in.getSizeY(),
914 dimz = in.getSizeZ(),
915 dimt = in.getSizeT();
916 for(
long t=0; t< dimt; ++t )
917 for(
long z=0; z< dimz; ++z )
918 for(
long y=0; y< dimy; ++y )
919 for(
long x=0; x< dimx; ++x )
921 valin[0] = ((double) in( x, y, z, t ).red())/255;
922 valin[1] = ((double) in( x, y, z, t ).green())/255;
923 valin[2] = ((double) in( x, y, z, t ).blue())/255;
925 for(
int n=0; n<3; ++n){
926 if( valin[n] > 0.04045 )
927 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
929 valin[n] = valin[n]/12.92;
932 valout = 0.019334*valin[0] + 0.119193*valin[1] + 0.950227*valin[2];
935 out( x, y, z, t ) = rescale<double,C>( valout );
939 template <
typename C>
942 computeRuntimeMinMax<AimsRGB,C>( in );
944 double valX, valY, valZ, valout;
945 long dimx = in.getSizeX(),
946 dimy = in.getSizeY(),
947 dimz = in.getSizeZ(),
948 dimt = in.getSizeT();
949 for(
long t=0; t< dimt; ++t )
950 for(
long z=0; z< dimz; ++z )
951 for(
long y=0; y< dimy; ++y )
952 for(
long x=0; x< dimx; ++x )
954 valin[0] = ((double) in( x, y, z, t ).red())/255;
955 valin[1] = ((double) in( x, y, z, t ).green())/255;
956 valin[2] = ((double) in( x, y, z, t ).blue())/255;
958 for(
int n=0; n<3; ++n){
959 if( valin[n] > 0.04045 )
960 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
962 valin[n] = valin[n]/12.92;
965 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
967 if( valY > 0.008856 ) {
968 valout = std::pow(valY, 0.333333);
970 valout = 7.787*valY + ((double)16/116);
973 valout = 116*valout - 16;
975 out( x, y, z, t ) = rescale<double,C>( valout );
979 template <
typename C>
982 computeRuntimeMinMax<AimsRGB,C>( in );
984 double valX, valY, valZ, valout;
985 long dimx = in.getSizeX(),
986 dimy = in.getSizeY(),
987 dimz = in.getSizeZ(),
988 dimt = in.getSizeT();
989 for(
long t=0; t< dimt; ++t )
990 for(
long z=0; z< dimz; ++z )
991 for(
long y=0; y< dimy; ++y )
992 for(
long x=0; x< dimx; ++x )
994 valin[0] = ((double) in( x, y, z, t ).red())/255;
995 valin[1] = ((double) in( x, y, z, t ).green())/255;
996 valin[2] = ((double) in( x, y, z, t ).blue())/255;
998 for(
int n=0; n<3; ++n){
999 if( valin[n] > 0.04045 )
1000 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1002 valin[n] = valin[n]/12.92;
1005 valX = (0.412453*valin[0] + 0.357580*valin[1] + 0.180423*valin[2])*((
double)100/95.047);
1006 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
1009 if( valX > 0.008856 ) {
1010 valout += std::pow(valX, 0.333333);
1012 valout += 7.787*valX + ((double)16/116);
1014 if( valY > 0.008856 ) {
1015 valout -= std::pow(valY, 0.333333);
1017 valout -= 7.787*valY + ((double)16/116);
1021 out( x, y, z, t ) = rescale<double,C>( valout );
1025 template <
typename C>
1028 computeRuntimeMinMax<AimsRGB,C>( in );
1030 double valX, valY, valZ, valout;
1031 long dimx = in.getSizeX(),
1032 dimy = in.getSizeY(),
1033 dimz = in.getSizeZ(),
1034 dimt = in.getSizeT();
1035 for(
long t=0; t< dimt; ++t )
1036 for(
long z=0; z< dimz; ++z )
1037 for(
long y=0; y< dimy; ++y )
1038 for(
long x=0; x< dimx; ++x )
1040 valin[0] = ((double) in( x, y, z, t ).red())/255;
1041 valin[1] = ((double) in( x, y, z, t ).green())/255;
1042 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1044 for(
int n=0; n<3; ++n){
1045 if( valin[n] > 0.04045 )
1046 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1048 valin[n] = valin[n]/12.92;
1051 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
1052 valZ = (0.019334*valin[0] + 0.119193*valin[1] + 0.950227*valin[2])*((
double)100/108.883);
1055 if( valY > 0.008856 ) {
1056 valout += std::pow(valY, 0.333333);
1058 valout += 7.787*valY + ((double)16/116);
1060 if( valZ > 0.008856 ) {
1061 valout -= std::pow(valZ, 0.333333);
1063 valout -= 7.787*valZ + ((double)16/116);
1067 out( x, y, z, t ) = rescale<double,C>( valout );
1072 template <
typename C>
1082 void getChannelR( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1083 void getChannelG( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1084 void getChannelB( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1085 void getChannelA( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1087 void getChannelYl( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1088 void getChannelCb( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1089 void getChannelCr( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1090 void getChannelH( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1091 void getChannelS( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1092 void getChannelV( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1093 void getChannelX( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1094 void getChannelY( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1095 void getChannelZ( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1096 void getChannelL( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1097 void getChannela( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1098 void getChannelb( carto::VolumeRef<AimsRGBA>, carto::VolumeRef<C> );
1122 getChannelA( in, out );
1208 carto::VolumeRef<C> out( in.getSizeX(), in.getSizeY(),
1209 in.getSizeZ(), in.getSizeT() );
1210 out->copyHeaderFrom( in.header() );
1215 template <
typename C>
1218 computeRuntimeMinMax<AimsRGBA,C>( in, 0 );
1220 long dimx = in.getSizeX(),
1221 dimy = in.getSizeY(),
1222 dimz = in.getSizeZ(),
1223 dimt = in.getSizeT();
1224 for(
long t=0; t< dimt; ++t )
1225 for(
long z=0; z< dimz; ++z )
1226 for(
long y=0; y< dimy; ++y )
1227 for(
long x=0; x< dimx; ++x )
1228 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGBA>::ChannelType,C>( in( x, y, z, t ).red() );
1231 template <
typename C>
1234 computeRuntimeMinMax<AimsRGBA,C>( in, 1 );
1236 long dimx = in.getSizeX(),
1237 dimy = in.getSizeY(),
1238 dimz = in.getSizeZ(),
1239 dimt = in.getSizeT();
1240 for(
long t=0; t< dimt; ++t )
1241 for(
long z=0; z< dimz; ++z )
1242 for(
long y=0; y< dimy; ++y )
1243 for(
long x=0; x< dimx; ++x )
1244 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGBA>::ChannelType,C>( in( x, y, z, t ).green() );
1247 template <
typename C>
1250 computeRuntimeMinMax<AimsRGBA,C>( in, 2 );
1252 long dimx = in.getSizeX(),
1253 dimy = in.getSizeY(),
1254 dimz = in.getSizeZ(),
1255 dimt = in.getSizeT();
1256 for(
long t=0; t< dimt; ++t )
1257 for(
long z=0; z< dimz; ++z )
1258 for(
long y=0; y< dimy; ++y )
1259 for(
long x=0; x< dimx; ++x )
1260 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGBA>::ChannelType,C>( in( x, y, z, t ).blue() );
1263 template <
typename C>
1266 computeRuntimeMinMax<AimsRGBA,C>( in, 3 );
1268 long dimx = in.getSizeX(),
1269 dimy = in.getSizeY(),
1270 dimz = in.getSizeZ(),
1271 dimt = in.getSizeT();
1272 for(
long t=0; t< dimt; ++t )
1273 for(
long z=0; z< dimz; ++z )
1274 for(
long y=0; y< dimy; ++y )
1275 for(
long x=0; x< dimx; ++x )
1276 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsRGBA>::ChannelType,C>( in( x, y, z, t ).alpha() );
1279 template <
typename C>
1281 carto::VolumeRef<AimsRGBA> in,
1282 carto::VolumeRef<C> out)
1284 computeRuntimeMinMax<AimsRGBA,C>( in );
1300 long dimx = in.getSizeX(),
1301 dimy = in.getSizeY(),
1302 dimz = in.getSizeZ(),
1303 dimt = in.getSizeT();
1304 for(
long t=0; t< dimt; ++t )
1305 for(
long z=0; z< dimz; ++z )
1306 for(
long y=0; y< dimy; ++y )
1307 for(
long x=0; x< dimx; ++x )
1309 val = (double) in( x, y, z, t ).red()
1310 + (double) in( x, y, z, t ).green()
1311 + (double) in( x, y, z, t ).blue();
1313 out( x, y, z, t ) = rescale<double,C>( val );
1317 template <
typename C>
1320 computeRuntimeMinMax<AimsRGBA,C>( in );
1323 long dimx = in.getSizeX(),
1324 dimy = in.getSizeY(),
1325 dimz = in.getSizeZ(),
1326 dimt = in.getSizeT();
1327 for(
long t=0; t< dimt; ++t )
1328 for(
long z=0; z< dimz; ++z )
1329 for(
long y=0; y< dimy; ++y )
1330 for(
long x=0; x< dimx; ++x )
1332 val = 0.299 * (double) in( x, y, z, t ).red()
1333 + 0.587 * (double) in( x, y, z, t ).green()
1334 + 0.114 * (double) in( x, y, z, t ).blue();
1335 out( x, y, z, t ) = rescale<double,C>( val );
1339 template <
typename C>
1342 computeRuntimeMinMax<AimsRGBA,C>( in );
1345 long dimx = in.getSizeX(),
1346 dimy = in.getSizeY(),
1347 dimz = in.getSizeZ(),
1348 dimt = in.getSizeT();
1349 for(
long t=0; t< dimt; ++t )
1350 for(
long z=0; z< dimz; ++z )
1351 for(
long y=0; y< dimy; ++y )
1352 for(
long x=0; x< dimx; ++x )
1354 val = - 0.1687 * (double) in( x, y, z, t ).red()
1355 - 0.3313 * (double) in( x, y, z, t ).green()
1356 + 0.5 * (double) in( x, y, z, t ).blue()
1358 out( x, y, z, t ) = rescale<double,C>( val );
1362 template <
typename C>
1365 computeRuntimeMinMax<AimsRGBA,C>( in );
1368 long dimx = in.getSizeX(),
1369 dimy = in.getSizeY(),
1370 dimz = in.getSizeZ(),
1371 dimt = in.getSizeT();
1372 for(
long t=0; t< dimt; ++t )
1373 for(
long z=0; z< dimz; ++z )
1374 for(
long y=0; y< dimy; ++y )
1375 for(
long x=0; x< dimx; ++x )
1377 val = 0.5 * (double) in( x, y, z, t ).red()
1378 - 0.4187 * (double) in( x, y, z, t ).green()
1379 - 0.0813 * (double) in( x, y, z, t ).blue()
1381 out( x, y, z, t ) = rescale<double,C>( val );
1385 template <
typename C>
1388 computeRuntimeMinMax<AimsRGBA,C>( in );
1391 long dimx = in.getSizeX(),
1392 dimy = in.getSizeY(),
1393 dimz = in.getSizeZ(),
1394 dimt = in.getSizeT();
1395 for(
long t=0; t< dimt; ++t )
1396 for(
long z=0; z< dimz; ++z )
1397 for(
long y=0; y< dimy; ++y )
1398 for(
long x=0; x< dimx; ++x )
1400 val = std::atan2( std::sqrt(3) * (
1401 (
double) in( x, y, z, t ).green() -
1402 (
double) in( x, y, z, t ).blue() ),
1404 (
double) in( x, y, z, t ).red() -
1405 (
double) in( x, y, z, t ).green() -
1406 (
double) in( x, y, z, t ).blue() )
1408 out( x, y, z, t ) = rescale<double,C>( val );
1412 template <
typename C>
1415 computeRuntimeMinMax<AimsRGBA,C>( in );
1417 long dimx = in.getSizeX(),
1418 dimy = in.getSizeY(),
1419 dimz = in.getSizeZ(),
1420 dimt = in.getSizeT();
1421 for(
long t=0; t< dimt; ++t )
1422 for(
long z=0; z< dimz; ++z )
1423 for(
long y=0; y< dimy; ++y )
1424 for(
long x=0; x< dimx; ++x )
1426 min = ( in( x, y, z, t ).red() <= in( x, y, z, t ).green()
1427 ? (double) in( x, y, z, t ).red()
1428 : (double) in( x, y, z, t ).green() );
1429 min = (
min <= (double) in( x, y, z, t ).blue()
1431 : in( x, y, z, t ).blue() );
1432 max = ( in( x, y, z, t ).red() >= in( x, y, z, t ).green()
1433 ? (double) in( x, y, z, t ).red()
1434 : (double) in( x, y, z, t ).green() );
1435 max = (
max >= (double) in( x, y, z, t ).blue()
1437 : in( x, y, z, t ).blue() );
1439 out( x, y, z, t ) = rescale<double,C>( val );
1443 template <
typename C>
1446 computeRuntimeMinMax<AimsRGBA,C>( in );
1448 long dimx = in.getSizeX(),
1449 dimy = in.getSizeY(),
1450 dimz = in.getSizeZ(),
1451 dimt = in.getSizeT();
1452 for(
long t=0; t< dimt; ++t )
1453 for(
long z=0; z< dimz; ++z )
1454 for(
long y=0; y< dimy; ++y )
1455 for(
long x=0; x< dimx; ++x )
1457 max = ( in( x, y, z, t ).red() >= in( x, y, z, t ).green()
1458 ? (double) in( x, y, z, t ).red()
1459 : (double) in( x, y, z, t ).green() );
1460 max = (
max >= (double) in( x, y, z, t ).blue()
1462 : in( x, y, z, t ).blue() );
1463 out( x, y, z, t ) = rescale<double,C>(
max );
1467 template <
typename C>
1470 computeRuntimeMinMax<AimsRGBA,C>( in );
1473 long dimx = in.getSizeX(),
1474 dimy = in.getSizeY(),
1475 dimz = in.getSizeZ(),
1476 dimt = in.getSizeT();
1477 for(
long t=0; t< dimt; ++t )
1478 for(
long z=0; z< dimz; ++z )
1479 for(
long y=0; y< dimy; ++y )
1480 for(
long x=0; x< dimx; ++x )
1482 valin[0] = ((double) in( x, y, z, t ).red())/255;
1483 valin[1] = ((double) in( x, y, z, t ).green())/255;
1484 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1486 for(
int n=0; n<3; ++n){
1487 if( valin[n] > 0.04045 )
1488 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1490 valin[n] = valin[n]/12.92;
1493 valout = 0.412453*valin[0] + 0.357580*valin[1] + 0.180423*valin[2];
1496 out( x, y, z, t ) = rescale<double,C>( valout );
1500 template <
typename C>
1503 computeRuntimeMinMax<AimsRGBA,C>( in );
1506 long dimx = in.getSizeX(),
1507 dimy = in.getSizeY(),
1508 dimz = in.getSizeZ(),
1509 dimt = in.getSizeT();
1510 for(
long t=0; t< dimt; ++t )
1511 for(
long z=0; z< dimz; ++z )
1512 for(
long y=0; y< dimy; ++y )
1513 for(
long x=0; x< dimx; ++x )
1515 valin[0] = ((double) in( x, y, z, t ).red())/255;
1516 valin[1] = ((double) in( x, y, z, t ).green())/255;
1517 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1519 for(
int n=0; n<3; ++n){
1520 if( valin[n] > 0.04045 )
1521 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1523 valin[n] = valin[n]/12.92;
1526 valout = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
1529 out( x, y, z, t ) = rescale<double,C>( valout );
1533 template <
typename C>
1536 computeRuntimeMinMax<AimsRGBA,C>( in );
1539 long dimx = in.getSizeX(),
1540 dimy = in.getSizeY(),
1541 dimz = in.getSizeZ(),
1542 dimt = in.getSizeT();
1543 for(
long t=0; t< dimt; ++t )
1544 for(
long z=0; z< dimz; ++z )
1545 for(
long y=0; y< dimy; ++y )
1546 for(
long x=0; x< dimx; ++x )
1548 valin[0] = ((double) in( x, y, z, t ).red())/255;
1549 valin[1] = ((double) in( x, y, z, t ).green())/255;
1550 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1552 for(
int n=0; n<3; ++n){
1553 if( valin[n] > 0.04045 )
1554 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1556 valin[n] = valin[n]/12.92;
1559 valout = 0.019334*valin[0] + 0.119193*valin[1] + 0.950227*valin[2];
1562 out( x, y, z, t ) = rescale<double,C>( valout );
1566 template <
typename C>
1569 computeRuntimeMinMax<AimsRGBA,C>( in );
1571 double valX, valY, valZ, valout;
1572 long dimx = in.getSizeX(),
1573 dimy = in.getSizeY(),
1574 dimz = in.getSizeZ(),
1575 dimt = in.getSizeT();
1576 for(
long t=0; t< dimt; ++t )
1577 for(
long z=0; z< dimz; ++z )
1578 for(
long y=0; y< dimy; ++y )
1579 for(
long x=0; x< dimx; ++x )
1581 valin[0] = ((double) in( x, y, z, t ).red())/255;
1582 valin[1] = ((double) in( x, y, z, t ).green())/255;
1583 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1585 for(
int n=0; n<3; ++n){
1586 if( valin[n] > 0.04045 )
1587 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1589 valin[n] = valin[n]/12.92;
1592 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
1594 if( valY > 0.008856 ) {
1595 valout = std::pow(valY, 0.333333);
1597 valout = 7.787*valY + ((double)16/116);
1600 valout = 116*valout - 16;
1602 out( x, y, z, t ) = rescale<double,C>( valout );
1606 template <
typename C>
1609 computeRuntimeMinMax<AimsRGBA,C>( in );
1611 double valX, valY, valZ, valout;
1612 long dimx = in.getSizeX(),
1613 dimy = in.getSizeY(),
1614 dimz = in.getSizeZ(),
1615 dimt = in.getSizeT();
1616 for(
long t=0; t< dimt; ++t )
1617 for(
long z=0; z< dimz; ++z )
1618 for(
long y=0; y< dimy; ++y )
1619 for(
long x=0; x< dimx; ++x )
1621 valin[0] = ((double) in( x, y, z, t ).red())/255;
1622 valin[1] = ((double) in( x, y, z, t ).green())/255;
1623 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1625 for(
int n=0; n<3; ++n){
1626 if( valin[n] > 0.04045 )
1627 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1629 valin[n] = valin[n]/12.92;
1632 valX = (0.412453*valin[0] + 0.357580*valin[1] + 0.180423*valin[2])*((
double)100/95.047);
1633 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
1636 if( valX > 0.008856 ) {
1637 valout += std::pow(valX, 0.333333);
1639 valout += 7.787*valX + ((double)16/116);
1641 if( valY > 0.008856 ) {
1642 valout -= std::pow(valY, 0.333333);
1644 valout -= 7.787*valY + ((double)16/116);
1648 out( x, y, z, t ) = rescale<double,C>( valout );
1652 template <
typename C>
1655 computeRuntimeMinMax<AimsRGBA,C>( in );
1657 double valX, valY, valZ, valout;
1658 long dimx = in.getSizeX(),
1659 dimy = in.getSizeY(),
1660 dimz = in.getSizeZ(),
1661 dimt = in.getSizeT();
1662 for(
long t=0; t< dimt; ++t )
1663 for(
long z=0; z< dimz; ++z )
1664 for(
long y=0; y< dimy; ++y )
1665 for(
long x=0; x< dimx; ++x )
1667 valin[0] = ((double) in( x, y, z, t ).red())/255;
1668 valin[1] = ((double) in( x, y, z, t ).green())/255;
1669 valin[2] = ((double) in( x, y, z, t ).blue())/255;
1671 for(
int n=0; n<3; ++n){
1672 if( valin[n] > 0.04045 )
1673 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
1675 valin[n] = valin[n]/12.92;
1678 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
1679 valZ = (0.019334*valin[0] + 0.119193*valin[1] + 0.950227*valin[2])*((
double)100/108.883);
1682 if( valY > 0.008856 ) {
1683 valout += std::pow(valY, 0.333333);
1685 valout += 7.787*valY + ((double)16/116);
1687 if( valZ > 0.008856 ) {
1688 valout -= std::pow(valZ, 0.333333);
1690 valout -= 7.787*valZ + ((double)16/116);
1694 out( x, y, z, t ) = rescale<double,C>( valout );
1699 template <
typename C>
1709 void getChannelR( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1710 void getChannelG( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1711 void getChannelB( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1713 void getChannelYl( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1714 void getChannelCb( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1715 void getChannelCr( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1716 void getChannelH( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1717 void getChannelS( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1718 void getChannelV( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1719 void getChannelX( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1720 void getChannelY( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1721 void getChannelZ( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1722 void getChannelL( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1723 void getChannela( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1724 void getChannelb( carto::VolumeRef<AimsHSV>, carto::VolumeRef<C> );
1828 carto::VolumeRef<C> out( in.getSizeX(), in.getSizeY(),
1829 in.getSizeZ(), in.getSizeT() );
1830 out->copyHeaderFrom( in.header() );
1835 template <
typename C>
1838 computeRuntimeMinMax<AimsHSV,C>( in );
1840 double valS, valV, valC, valX, valM, val;
1841 long dimx = in.getSizeX(),
1842 dimy = in.getSizeY(),
1843 dimz = in.getSizeZ(),
1844 dimt = in.getSizeT();
1845 for(
long t=0; t< dimt; ++t )
1846 for(
long z=0; z< dimz; ++z )
1847 for(
long y=0; y< dimy; ++y )
1848 for(
long x=0; x< dimx; ++x ){
1849 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
1850 valS = ((double) in( x, y, z, t ).saturation())/255;
1851 valV = ((double) in( x, y, z, t ).value())/255;
1853 valX = valC*(1-abs((valH/60)%2-1));
1856 if (valH<120 || valH>=240){
1866 out( x, y, z, t ) = rescale<double,C>( val );
1870 template <
typename C>
1873 computeRuntimeMinMax<AimsHSV,C>( in );
1875 double valS, valV, valC, valX, valM, val;
1876 long dimx = in.getSizeX(),
1877 dimy = in.getSizeY(),
1878 dimz = in.getSizeZ(),
1879 dimt = in.getSizeT();
1880 for(
long t=0; t< dimt; ++t )
1881 for(
long z=0; z< dimz; ++z )
1882 for(
long y=0; y< dimy; ++y )
1883 for(
long x=0; x< dimx; ++x ){
1884 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
1885 valS = ((double) in( x, y, z, t ).saturation())/255;
1886 valV = ((double) in( x, y, z, t ).value())/255;
1888 valX = valC*(1-abs((valH/60)%2-1));
1901 out( x, y, z, t ) = rescale<double,C>( val );
1905 template <
typename C>
1908 computeRuntimeMinMax<AimsHSV,C>( in );
1910 double valS, valV, valC, valX, valM, val;
1911 long dimx = in.getSizeX(),
1912 dimy = in.getSizeY(),
1913 dimz = in.getSizeZ(),
1914 dimt = in.getSizeT();
1915 for(
long t=0; t< dimt; ++t )
1916 for(
long z=0; z< dimz; ++z )
1917 for(
long y=0; y< dimy; ++y )
1918 for(
long x=0; x< dimx; ++x ){
1919 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
1920 valS = ((double) in( x, y, z, t ).saturation())/255;
1921 valV = ((double) in( x, y, z, t ).value())/255;
1923 valX = valC*(1-abs((valH/60)%2-1));
1936 out( x, y, z, t ) = rescale<double,C>( val );
1940 template <
typename C>
1943 computeRuntimeMinMax<AimsHSV,C>( in );
1945 double valS, valV, valC, valX, valM, valR, valG, valB, val;
1946 long dimx = in.getSizeX(),
1947 dimy = in.getSizeY(),
1948 dimz = in.getSizeZ(),
1949 dimt = in.getSizeT();
1950 for(
long t=0; t< dimt; ++t )
1951 for(
long z=0; z< dimz; ++z )
1952 for(
long y=0; y< dimy; ++y )
1953 for(
long x=0; x< dimx; ++x ){
1954 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
1955 valS = ((double) in( x, y, z, t ).saturation())/255;
1956 valV = ((double) in( x, y, z, t ).value())/255;
1958 valX = valC*(1-abs((valH/60)%2-1));
1961 if (valH<120 || valH>=240){
1994 val = valR + valG + valB;
1996 out( x, y, z, t ) = rescale<double,C>( val );
2000 template <
typename C>
2003 computeRuntimeMinMax<AimsHSV,C>( in );
2005 double valS, valV, valC, valX, valM, valR, valG, valB, val;
2006 long dimx = in.getSizeX(),
2007 dimy = in.getSizeY(),
2008 dimz = in.getSizeZ(),
2009 dimt = in.getSizeT();
2010 for(
long t=0; t< dimt; ++t )
2011 for(
long z=0; z< dimz; ++z )
2012 for(
long y=0; y< dimy; ++y )
2013 for(
long x=0; x< dimx; ++x ){
2014 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2015 valS = ((double) in( x, y, z, t ).saturation())/255;
2016 valV = ((double) in( x, y, z, t ).value())/255;
2018 valX = valC*(1-abs((valH/60)%2-1));
2021 if (valH<120 || valH>=240){
2054 val = 0.299 * valR + 0.587 * valG + 0.114 * valB;
2055 out( x, y, z, t ) = rescale<double,C>( val );
2059 template <
typename C>
2062 computeRuntimeMinMax<AimsHSV,C>( in );
2064 double valS, valV, valC, valX, valM, valR, valG, valB, val;
2065 long dimx = in.getSizeX(),
2066 dimy = in.getSizeY(),
2067 dimz = in.getSizeZ(),
2068 dimt = in.getSizeT();
2069 for(
long t=0; t< dimt; ++t )
2070 for(
long z=0; z< dimz; ++z )
2071 for(
long y=0; y< dimy; ++y )
2072 for(
long x=0; x< dimx; ++x ){
2073 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2074 valS = ((double) in( x, y, z, t ).saturation())/255;
2075 valV = ((double) in( x, y, z, t ).value())/255;
2077 valX = valC*(1-abs((valH/60)%2-1));
2080 if (valH<120 || valH>=240){
2113 val = - 0.1687 * valR - 0.3313 * valG + 0.5 * valB + 128;
2114 out( x, y, z, t ) = rescale<double,C>( val );
2118 template <
typename C>
2121 computeRuntimeMinMax<AimsHSV,C>( in );
2123 double valS, valV, valC, valX, valM, valR, valG, valB, val;
2124 long dimx = in.getSizeX(),
2125 dimy = in.getSizeY(),
2126 dimz = in.getSizeZ(),
2127 dimt = in.getSizeT();
2128 for(
long t=0; t< dimt; ++t )
2129 for(
long z=0; z< dimz; ++z )
2130 for(
long y=0; y< dimy; ++y )
2131 for(
long x=0; x< dimx; ++x ){
2132 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2133 valS = ((double) in( x, y, z, t ).saturation())/255;
2134 valV = ((double) in( x, y, z, t ).value())/255;
2136 valX = valC*(1-abs((valH/60)%2-1));
2139 if (valH<120 || valH>=240){
2172 val = 0.5 * valR - 0.4187 * valG - 0.0813 * valB + 128;
2173 out( x, y, z, t ) = rescale<double,C>( val );
2177 template <
typename C>
2180 computeRuntimeMinMax<AimsHSV,C>( in, 0 );
2182 long dimx = in.getSizeX(),
2183 dimy = in.getSizeY(),
2184 dimz = in.getSizeZ(),
2185 dimt = in.getSizeT();
2186 for(
long t=0; t< dimt; ++t )
2187 for(
long z=0; z< dimz; ++z )
2188 for(
long y=0; y< dimy; ++y )
2189 for(
long x=0; x< dimx; ++x )
2190 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsHSV>::ChannelType,C>( in( x, y, z, t ).hue() );
2193 template <
typename C>
2196 computeRuntimeMinMax<AimsHSV,C>( in, 1 );
2198 long dimx = in.getSizeX(),
2199 dimy = in.getSizeY(),
2200 dimz = in.getSizeZ(),
2201 dimt = in.getSizeT();
2202 for(
long t=0; t< dimt; ++t )
2203 for(
long z=0; z< dimz; ++z )
2204 for(
long y=0; y< dimy; ++y )
2205 for(
long x=0; x< dimx; ++x )
2206 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsHSV>::ChannelType,C>( in( x, y, z, t ).saturation() );
2209 template <
typename C>
2212 computeRuntimeMinMax<AimsHSV,C>( in, 2 );
2214 long dimx = in.getSizeX(),
2215 dimy = in.getSizeY(),
2216 dimz = in.getSizeZ(),
2217 dimt = in.getSizeT();
2218 for(
long t=0; t< dimt; ++t )
2219 for(
long z=0; z< dimz; ++z )
2220 for(
long y=0; y< dimy; ++y )
2221 for(
long x=0; x< dimx; ++x )
2222 out( x, y, z, t ) = rescale<carto::DataTypeTraits<AimsHSV>::ChannelType,C>( in( x, y, z, t ).value() );
2225 template <
typename C>
2228 computeRuntimeMinMax<AimsHSV,C>( in );
2230 double valS, valV, valC, valX, valM, valout;
2232 long dimx = in.getSizeX(),
2233 dimy = in.getSizeY(),
2234 dimz = in.getSizeZ(),
2235 dimt = in.getSizeT();
2236 for(
long t=0; t< dimt; ++t )
2237 for(
long z=0; z< dimz; ++z )
2238 for(
long y=0; y< dimy; ++y )
2239 for(
long x=0; x< dimx; ++x )
2241 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2242 valS = ((double) in( x, y, z, t ).saturation())/255;
2243 valV = ((double) in( x, y, z, t ).value())/255;
2245 valX = valC*(1-abs((valH/60)%2-1));
2248 if (valH<120 || valH>=240){
2278 valout = 0.412453*valin[0] + 0.357580*valin[1] + 0.180423*valin[1];
2281 out( x, y, z, t ) = rescale<double,C>( valout );
2285 template <
typename C>
2288 computeRuntimeMinMax<AimsHSV,C>( in );
2290 double valS, valV, valC, valX, valM, valout;
2292 long dimx = in.getSizeX(),
2293 dimy = in.getSizeY(),
2294 dimz = in.getSizeZ(),
2295 dimt = in.getSizeT();
2296 for(
long t=0; t< dimt; ++t )
2297 for(
long z=0; z< dimz; ++z )
2298 for(
long y=0; y< dimy; ++y )
2299 for(
long x=0; x< dimx; ++x )
2301 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2302 valS = ((double) in( x, y, z, t ).saturation())/255;
2303 valV = ((double) in( x, y, z, t ).value())/255;
2305 valX = valC*(1-abs((valH/60)%2-1));
2308 if (valH<120 || valH>=240){
2338 valout = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
2341 out( x, y, z, t ) = rescale<double,C>( valout );
2345 template <
typename C>
2348 computeRuntimeMinMax<AimsHSV,C>( in );
2350 double valS, valV, valC, valX, valM, valout;
2352 long dimx = in.getSizeX(),
2353 dimy = in.getSizeY(),
2354 dimz = in.getSizeZ(),
2355 dimt = in.getSizeT();
2356 for(
long t=0; t< dimt; ++t )
2357 for(
long z=0; z< dimz; ++z )
2358 for(
long y=0; y< dimy; ++y )
2359 for(
long x=0; x< dimx; ++x )
2361 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2362 valS = ((double) in( x, y, z, t ).saturation())/255;
2363 valV = ((double) in( x, y, z, t ).value())/255;
2365 valX = valC*(1-abs((valH/60)%2-1));
2368 if (valH<120 || valH>=240){
2398 valout = 0.019334*valin[0] + 0.119193*valin[1] + 0.950227*valin[2];
2401 out( x, y, z, t ) = rescale<double,C>( valout );
2405 template <
typename C>
2408 computeRuntimeMinMax<AimsHSV,C>( in );
2410 double valS, valV, valC, valX, valY, valM, valout;
2412 long dimx = in.getSizeX(),
2413 dimy = in.getSizeY(),
2414 dimz = in.getSizeZ(),
2415 dimt = in.getSizeT();
2416 for(
long t=0; t< dimt; ++t )
2417 for(
long z=0; z< dimz; ++z )
2418 for(
long y=0; y< dimy; ++y )
2419 for(
long x=0; x< dimx; ++x )
2421 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2422 valS = ((double) in( x, y, z, t ).saturation())/255;
2423 valV = ((double) in( x, y, z, t ).value())/255;
2425 valX = valC*(1-abs((valH/60)%2-1));
2428 if (valH<120 || valH>=240){
2458 for(
int n=0; n<3; ++n){
2459 if( valin[n] > 0.04045 )
2460 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
2462 valin[n] = valin[n]/12.92;
2465 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
2467 if( valY > 0.008856 ) {
2468 valout = std::pow(valY, 0.333333);
2470 valout = 7.787*valY + ((double)16/116);
2473 valout = 116*valout - 16;
2475 out( x, y, z, t ) = rescale<double,C>( valout );
2479 template <
typename C>
2482 computeRuntimeMinMax<AimsHSV,C>( in );
2484 double valS, valV, valC, valX, valY, valM, valout;
2486 long dimx = in.getSizeX(),
2487 dimy = in.getSizeY(),
2488 dimz = in.getSizeZ(),
2489 dimt = in.getSizeT();
2490 for(
long t=0; t< dimt; ++t )
2491 for(
long z=0; z< dimz; ++z )
2492 for(
long y=0; y< dimy; ++y )
2493 for(
long x=0; x< dimx; ++x )
2495 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2496 valS = ((double) in( x, y, z, t ).saturation())/255;
2497 valV = ((double) in( x, y, z, t ).value())/255;
2499 valX = valC*(1-abs((valH/60)%2-1));
2502 if (valH<120 || valH>=240){
2532 for(
int n=0; n<3; ++n){
2533 if( valin[n] > 0.04045 )
2534 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
2536 valin[n] = valin[n]/12.92;
2539 valX = (0.412453*valin[0] + 0.357580*valin[1] + 0.180423*valin[2])*((
double)100/95.047);
2540 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
2543 if( valX > 0.008856 ) {
2544 valout += std::pow(valX, 0.333333);
2546 valout += 7.787*valX + ((double)16/116);
2548 if( valY > 0.008856 ) {
2549 valout -= std::pow(valY, 0.333333);
2551 valout -= 7.787*valY + ((double)16/116);
2555 out( x, y, z, t ) = rescale<double,C>( valout );
2559 template <
typename C>
2562 computeRuntimeMinMax<AimsHSV,C>( in );
2564 double valS, valV, valC, valX, valY, valZ, valM, valout;
2566 long dimx = in.getSizeX(),
2567 dimy = in.getSizeY(),
2568 dimz = in.getSizeZ(),
2569 dimt = in.getSizeT();
2570 for(
long t=0; t< dimt; ++t )
2571 for(
long z=0; z< dimz; ++z )
2572 for(
long y=0; y< dimy; ++y )
2573 for(
long x=0; x< dimx; ++x )
2575 valH = (int) (((
double) in( x, y, z, t ).hue())/255)*360;
2576 valS = ((double) in( x, y, z, t ).saturation())/255;
2577 valV = ((double) in( x, y, z, t ).value())/255;
2579 valX = valC*(1-abs((valH/60)%2-1));
2582 if (valH<120 || valH>=240){
2612 for(
int n=0; n<3; ++n){
2613 if( valin[n] > 0.04045 )
2614 valin[n] = std::pow((valin[n] + 0.055)/(1 + 0.055), 2.4);
2616 valin[n] = valin[n]/12.92;
2619 valY = 0.212671*valin[0] + 0.715160*valin[1] + 0.072169*valin[2];
2620 valZ = (0.019334*valin[0] + 0.119193*valin[1] + 0.950227*valin[2])*((
double)100/108.883);
2623 if( valY > 0.008856 ) {
2624 valout += std::pow(valY, 0.333333);
2626 valout += 7.787*valY + ((double)16/116);
2628 if( valZ > 0.008856 ) {
2629 valout -= std::pow(valZ, 0.333333);
2631 valout -= 7.787*valZ + ((double)16/116);
2635 out( x, y, z, t ) = rescale<double,C>( valout );
virtual ~bad_options_exception()
virtual const char * what() const
A Rescaler allows one to apply a linear transformation to a value of any type.
void setOutputMax(double val)
void setInputDynMinMax(bool val=true)
void computeInputDynMax(carto::VolumeRef< T > in, int ch=0)
void computeRuntimeMinMax(carto::VolumeRef< T > in, int ch=0)
void setOutputMin(double val)
void computeInputTypeMin()
void computeInputDynMin(carto::VolumeRef< T > in, int ch=0)
void setInputMax(double val)
void setInputDynMinMax(carto::VolumeRef< T > in)
void setRescale(bool val=true)
void computeInputTypeMax()
void setInputMin(double val)
float min(float x, float y)
float max(float x, float y)
ImageProcessors<AimsRGB, double> p(data, mask, "rgbm", options, ImageProcessorMode::Init); ImageProce...