击中-击不中变换(约束)—lhMorpHMTC

击中-击不中变换(约束)
击中-击不中变换(约束)—lhMorpHMTC - 海水和火焰 - 形态学与OpenCV

 所采用的9*1 自定义结构为:

击中-击不中变换(约束)—lhMorpHMTC - 海水和火焰 - 形态学与OpenCV

 

函数:lhMorpHMTC

说明:形态学约束击中-击不中变换,当为二值图像时,结果与lhMorpHMTB相同。

参数:

src 输入图像,灰度或二值图像

dst 输出图像

sefg 前景结构元素

sebg 背景结构元素,如为空,则默认为前景结构元素sefg的取反

源码:

void lhMorpHMTC(const IplImage* src, IplImage* dst, IplConvKernel* sefg, IplConvKernel* sebg =NULL)

{

       assert(src != NULL && dst != NULL && src != dst && sefg!= NULL && sefg!=sebg);

       if (sebg == NULL)

              sebg = lhStructuringElementNot(sefg);

       IplImage*  temp1 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  temp2 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  temp3 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  temp4 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  mask1 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  mask2 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  mask3 = cvCreateImage(cvGetSize(src), 8, 1);

       IplImage*  mask4 = cvCreateImage(cvGetSize(src), 8, 1);

       cvZero(mask1);

       cvZero(mask2);

       cvZero(mask3);

       cvZero(mask4);

       cvZero(dst);

       cvErode( src, temp1, sebg);

       cvDilate( src, temp2, sebg);

       cvErode( src, temp3, sefg);

       cvDilate( src, temp4, sefg);

       cvCmp(src, temp3, mask1, CV_CMP_EQ);

       cvCmp(temp2, src,  mask2, CV_CMP_LT);

       cvAnd(mask1, mask2, mask2);

       cvCmp(src, temp4, mask3 , CV_CMP_EQ);

       cvCmp(temp1, src, mask4 , CV_CMP_GT);

       cvAnd(mask3, mask4, mask4);

       cvSub(src, temp2, dst, mask2);

       cvSub(temp1, src, dst, mask4);

       cvReleaseImage(&mask1);

       cvReleaseImage(&mask2);

       cvReleaseImage(&mask3);

       cvReleaseImage(&mask4);

       cvReleaseImage(&temp1);

       cvReleaseImage(&temp2);

       cvReleaseImage(&temp3);

       cvReleaseImage(&temp4);

       cvReleaseStructuringElement(&sebg);

}

posted on 2011-12-21 22:14  carekee  阅读(1394)  评论(0编辑  收藏  举报