@@ -277,7 +277,7 @@ icvCalcFMM(const CvMat *f, CvMat *t, CvPriorityQueueFloat *Heap, bool negate) {
277
277
}
278
278
}
279
279
280
-
280
+ template < typename data_type>
281
281
static void
282
282
icvTeleaInpaintFMM (const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueueFloat *Heap ) {
283
283
int i = 0 , j = 0 , ii = 0 , jj = 0 , k, l, q, color = 0 ;
@@ -463,31 +463,31 @@ icvTeleaInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQu
463
463
464
464
if (CV_MAT_ELEM (*f,uchar,k,l+1 )!=INSIDE) {
465
465
if (CV_MAT_ELEM (*f,uchar,k,l-1 )!=INSIDE) {
466
- gradI.x =(float )((CV_MAT_ELEM (*out,uchar ,km,lp+1 )-CV_MAT_ELEM (*out,uchar ,km,lm-1 )))*2 .0f ;
466
+ gradI.x =(float )((CV_MAT_ELEM (*out,data_type ,km,lp+1 )-CV_MAT_ELEM (*out,data_type ,km,lm-1 )))*2 .0f ;
467
467
} else {
468
- gradI.x =(float )((CV_MAT_ELEM (*out,uchar ,km,lp+1 )-CV_MAT_ELEM (*out,uchar ,km,lm)));
468
+ gradI.x =(float )((CV_MAT_ELEM (*out,data_type ,km,lp+1 )-CV_MAT_ELEM (*out,data_type ,km,lm)));
469
469
}
470
470
} else {
471
471
if (CV_MAT_ELEM (*f,uchar,k,l-1 )!=INSIDE) {
472
- gradI.x =(float )((CV_MAT_ELEM (*out,uchar ,km,lp)-CV_MAT_ELEM (*out,uchar ,km,lm-1 )));
472
+ gradI.x =(float )((CV_MAT_ELEM (*out,data_type ,km,lp)-CV_MAT_ELEM (*out,data_type ,km,lm-1 )));
473
473
} else {
474
474
gradI.x =0 ;
475
475
}
476
476
}
477
477
if (CV_MAT_ELEM (*f,uchar,k+1 ,l)!=INSIDE) {
478
478
if (CV_MAT_ELEM (*f,uchar,k-1 ,l)!=INSIDE) {
479
- gradI.y =(float )((CV_MAT_ELEM (*out,uchar ,kp+1 ,lm)-CV_MAT_ELEM (*out,uchar ,km-1 ,lm)))*2 .0f ;
479
+ gradI.y =(float )((CV_MAT_ELEM (*out,data_type ,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type ,km-1 ,lm)))*2 .0f ;
480
480
} else {
481
- gradI.y =(float )((CV_MAT_ELEM (*out,uchar ,kp+1 ,lm)-CV_MAT_ELEM (*out,uchar ,km,lm)));
481
+ gradI.y =(float )((CV_MAT_ELEM (*out,data_type ,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type ,km,lm)));
482
482
}
483
483
} else {
484
484
if (CV_MAT_ELEM (*f,uchar,k-1 ,l)!=INSIDE) {
485
- gradI.y =(float )((CV_MAT_ELEM (*out,uchar ,kp,lm)-CV_MAT_ELEM (*out,uchar ,km-1 ,lm)));
485
+ gradI.y =(float )((CV_MAT_ELEM (*out,data_type ,kp,lm)-CV_MAT_ELEM (*out,data_type ,km-1 ,lm)));
486
486
} else {
487
487
gradI.y =0 ;
488
488
}
489
489
}
490
- Ia += (float )w * (float )(CV_MAT_ELEM (*out,uchar ,km,lm));
490
+ Ia += (float )w * (float )(CV_MAT_ELEM (*out,data_type ,km,lm));
491
491
Jx -= (float )w * (float )(gradI.x *r.x );
492
492
Jy -= (float )w * (float )(gradI.y *r.y );
493
493
s += w;
@@ -497,7 +497,7 @@ icvTeleaInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQu
497
497
}
498
498
sat = (float )((Ia/s+(Jx+Jy)/(sqrt (Jx*Jx+Jy*Jy)+1 .0e-20f )+0 .5f ));
499
499
{
500
- CV_MAT_ELEM (*out,uchar ,i-1 ,j-1 ) = cv::saturate_cast<uchar >(sat);
500
+ CV_MAT_ELEM (*out,data_type ,i-1 ,j-1 ) = cv::saturate_cast<data_type >(sat);
501
501
}
502
502
}
503
503
@@ -509,7 +509,7 @@ icvTeleaInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQu
509
509
}
510
510
}
511
511
512
-
512
+ template < typename data_type>
513
513
static void
514
514
icvNSInpaintFMM (const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueueFloat *Heap) {
515
515
int i = 0 , j = 0 , ii = 0 , jj = 0 , k, l, q, color = 0 ;
@@ -640,28 +640,28 @@ icvNSInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueue
640
640
641
641
if (CV_MAT_ELEM (*f,uchar,k+1 ,l)!=INSIDE) {
642
642
if (CV_MAT_ELEM (*f,uchar,k-1 ,l)!=INSIDE) {
643
- gradI.x =(float )(abs (CV_MAT_ELEM (*out,uchar ,kp+1 ,lm)-CV_MAT_ELEM (*out,uchar ,kp,lm))+
644
- abs (CV_MAT_ELEM (*out,uchar ,kp,lm)-CV_MAT_ELEM (*out,uchar ,km-1 ,lm)));
643
+ gradI.x =(float )(std:: abs (CV_MAT_ELEM (*out,data_type ,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type ,kp,lm))+
644
+ std:: abs (CV_MAT_ELEM (*out,data_type ,kp,lm)-CV_MAT_ELEM (*out,data_type ,km-1 ,lm)));
645
645
} else {
646
- gradI.x =(float )(abs (CV_MAT_ELEM (*out,uchar ,kp+1 ,lm)-CV_MAT_ELEM (*out,uchar ,kp,lm)))*2 .0f ;
646
+ gradI.x =(float )(std:: abs (CV_MAT_ELEM (*out,data_type ,kp+1 ,lm)-CV_MAT_ELEM (*out,data_type ,kp,lm)))*2 .0f ;
647
647
}
648
648
} else {
649
649
if (CV_MAT_ELEM (*f,uchar,k-1 ,l)!=INSIDE) {
650
- gradI.x =(float )(abs (CV_MAT_ELEM (*out,uchar ,kp,lm)-CV_MAT_ELEM (*out,uchar ,km-1 ,lm)))*2 .0f ;
650
+ gradI.x =(float )(std:: abs (CV_MAT_ELEM (*out,data_type ,kp,lm)-CV_MAT_ELEM (*out,data_type ,km-1 ,lm)))*2 .0f ;
651
651
} else {
652
652
gradI.x =0 ;
653
653
}
654
654
}
655
655
if (CV_MAT_ELEM (*f,uchar,k,l+1 )!=INSIDE) {
656
656
if (CV_MAT_ELEM (*f,uchar,k,l-1 )!=INSIDE) {
657
- gradI.y =(float )(abs (CV_MAT_ELEM (*out,uchar ,km,lp+1 )-CV_MAT_ELEM (*out,uchar ,km,lm))+
658
- abs (CV_MAT_ELEM (*out,uchar ,km,lm)-CV_MAT_ELEM (*out,uchar ,km,lm-1 )));
657
+ gradI.y =(float )(std:: abs (CV_MAT_ELEM (*out,data_type ,km,lp+1 )-CV_MAT_ELEM (*out,data_type ,km,lm))+
658
+ std:: abs (CV_MAT_ELEM (*out,data_type ,km,lm)-CV_MAT_ELEM (*out,data_type ,km,lm-1 )));
659
659
} else {
660
- gradI.y =(float )(abs (CV_MAT_ELEM (*out,uchar ,km,lp+1 )-CV_MAT_ELEM (*out,uchar ,km,lm)))*2 .0f ;
660
+ gradI.y =(float )(std:: abs (CV_MAT_ELEM (*out,data_type ,km,lp+1 )-CV_MAT_ELEM (*out,data_type ,km,lm)))*2 .0f ;
661
661
}
662
662
} else {
663
663
if (CV_MAT_ELEM (*f,uchar,k,l-1 )!=INSIDE) {
664
- gradI.y =(float )(abs (CV_MAT_ELEM (*out,uchar ,km,lm)-CV_MAT_ELEM (*out,uchar ,km,lm-1 )))*2 .0f ;
664
+ gradI.y =(float )(std:: abs (CV_MAT_ELEM (*out,data_type ,km,lm)-CV_MAT_ELEM (*out,data_type ,km,lm-1 )))*2 .0f ;
665
665
} else {
666
666
gradI.y =0 ;
667
667
}
@@ -676,13 +676,13 @@ icvNSInpaintFMM(const CvMat *f, CvMat *t, CvMat *out, int range, CvPriorityQueue
676
676
dir = (float )fabs (VectorScalMult (r,gradI)/sqrt (VectorLength (r)*VectorLength (gradI)));
677
677
}
678
678
w = dst*dir;
679
- Ia += (float )w * (float )(CV_MAT_ELEM (*out,uchar ,km,lm));
679
+ Ia += (float )w * (float )(CV_MAT_ELEM (*out,data_type ,km,lm));
680
680
s += w;
681
681
}
682
682
}
683
683
}
684
684
}
685
- CV_MAT_ELEM (*out,uchar ,i-1 ,j-1 ) = cv::saturate_cast<uchar >((double )Ia/s);
685
+ CV_MAT_ELEM (*out,data_type ,i-1 ,j-1 ) = cv::saturate_cast<data_type >((double )Ia/s);
686
686
}
687
687
688
688
CV_MAT_ELEM (*f,uchar,i,j) = BAND;
@@ -744,11 +744,13 @@ cvInpaint( const CvArr* _input_img, const CvArr* _inpaint_mask, CvArr* _output_i
744
744
if ( !CV_ARE_SIZES_EQ (input_img,output_img) || !CV_ARE_SIZES_EQ (input_img,inpaint_mask))
745
745
CV_Error ( CV_StsUnmatchedSizes, " All the input and output images must have the same size" );
746
746
747
- if ( (CV_MAT_TYPE (input_img->type ) != CV_8UC1 &&
747
+ if ( (CV_MAT_TYPE (input_img->type ) != CV_8U &&
748
+ CV_MAT_TYPE (input_img->type ) != CV_16U &&
749
+ CV_MAT_TYPE (input_img->type ) != CV_32F &&
748
750
CV_MAT_TYPE (input_img->type ) != CV_8UC3) ||
749
751
!CV_ARE_TYPES_EQ (input_img,output_img) )
750
752
CV_Error ( CV_StsUnsupportedFormat,
751
- " Only 8-bit 1-channel and 3-channel input/output images are supported" );
753
+ " 8-bit, 16-bit unsigned or 32-bit float 1-channel and 8-bit 3-channel input/output images are supported" );
752
754
753
755
if ( CV_MAT_TYPE (inpaint_mask->type ) != CV_8UC1 )
754
756
CV_Error ( CV_StsUnsupportedFormat, " The mask must be 8-bit 1-channel image" );
@@ -798,10 +800,36 @@ cvInpaint( const CvArr* _input_img, const CvArr* _inpaint_mask, CvArr* _output_i
798
800
cvSub (out,band,out,NULL );
799
801
SET_BORDER1_C1 (out,uchar,0 );
800
802
icvCalcFMM (out,t,Out,true );
801
- icvTeleaInpaintFMM (mask,t,output_img,range,Heap);
803
+ switch (CV_MAT_DEPTH (output_img->type ))
804
+ {
805
+ case CV_8U:
806
+ icvTeleaInpaintFMM<uchar>(mask,t,output_img,range,Heap);
807
+ break ;
808
+ case CV_16U:
809
+ icvTeleaInpaintFMM<ushort>(mask,t,output_img,range,Heap);
810
+ break ;
811
+ case CV_32F:
812
+ icvTeleaInpaintFMM<float >(mask,t,output_img,range,Heap);
813
+ break ;
814
+ default :
815
+ CV_Error ( cv::Error::StsBadArg, " Unsupportedformat of the input image" );
816
+ }
802
817
}
803
818
else if (flags == cv::INPAINT_NS) {
804
- icvNSInpaintFMM (mask,t,output_img,range,Heap);
819
+ switch (CV_MAT_DEPTH (output_img->type ))
820
+ {
821
+ case CV_8U:
822
+ icvNSInpaintFMM<uchar>(mask,t,output_img,range,Heap);
823
+ break ;
824
+ case CV_16U:
825
+ icvNSInpaintFMM<ushort>(mask,t,output_img,range,Heap);
826
+ break ;
827
+ case CV_32F:
828
+ icvNSInpaintFMM<float >(mask,t,output_img,range,Heap);
829
+ break ;
830
+ default :
831
+ CV_Error ( cv::Error::StsBadArg, " Unsupported format of the input image" );
832
+ }
805
833
} else {
806
834
CV_Error ( cv::Error::StsBadArg, " The flags argument must be one of CV_INPAINT_TELEA or CV_INPAINT_NS" );
807
835
}
0 commit comments