Sie sind auf Seite 1von 4

#include "cv.h" #include "cxcore.h" #include "highgui.

h" void lhMorpGradient(const IplImage* src, IplImage* dst, IplConvKernel* se=NULL, int iterations=1) { assert(src != NULL && dst != NULL && src != dst); IplImage* temp = cvCloneImage(src); cvErode( src, temp, se, iterations ); cvDilate( src, dst, se, iterations ); cvSub( dst, temp, dst ); cvReleaseImage(&temp); } void lhMorpRDilate(const IplImage* src, const IplImage* msk, IplImage* dst, IplC onvKernel* se = NULL, int iterations=-1) { assert(src != NULL && msk != NULL && dst != NULL && src != dst ); if(iterations < 0) { // cvMin(src, msk, dst); cvDilate(dst, dst, se); cvMin(dst, msk, dst); IplImage* temp1 = cvCreateImage(cvGetSize(src), 8, 1); IplImage* temp2 = cvCreateImage(cvGetSize(src), 8, 1); do { //record last result cvCopy(dst, temp1); cvDilate(dst, dst, se); cvMin(dst, msk, dst); cvCmp(temp1, dst, temp2, CV_CMP_NE ); } while(cvSum(temp2).val[0] != 0); cvReleaseImage(&temp1); cvReleaseImage(&temp2); return; } else if (iterations == 0) { cvCopy(src, dst); } else { // p136(6.1) cvMin(src, msk, dst); cvDilate(dst, dst, se); cvMin(dst, msk, dst);

for(int i=1; i<iterations; i++) { cvDilate(dst, dst, se); cvMin(dst, msk, dst); } } } // void lhMorpRErode(const IplImage* src, const IplImage* msk, IplImage* dst, IplC onvKernel* se = NULL, int iterations=-1) { assert(src != NULL && msk != NULL && dst != NULL && src != dst ); if(iterations < 0) { // cvMax(src, msk, dst); cvErode(dst, dst, se); cvMax(dst, msk, dst); IplImage* temp1 = cvCreateImage(cvGetSize(src), 8, 1); IplImage* temp2 = cvCreateImage(cvGetSize(src), 8, 1); do { //record last result cvCopy(dst, temp1); cvErode(dst, dst, se); cvMax(dst, msk, dst); cvCmp(temp1, dst, temp2, CV_CMP_NE); } while(cvSum(temp2).val[0] != 0); cvReleaseImage(&temp1); cvReleaseImage(&temp2); return; } else if (iterations == 0) { cvCopy(src, dst); } else { // p137(6.2) cvMax(src, msk, dst); cvErode(dst, dst, se); cvMax(dst, msk, dst); for(int i=1; i<iterations; i++) { cvErode(dst, dst, se); cvMax(dst, msk, dst);

} } } // void lhMorpROpen(const IplImage* src, IplImage* dst, IplConvKernel* se = NULL, i nt iterations=1) { assert(src != NULL && dst != NULL && src != dst ); //p155(6.16) IplImage* temp = cvCreateImage(cvGetSize(src), 8, 1); cvErode(src, temp, se, iterations); lhMorpRDilate(temp, src, dst, se, -1); cvReleaseImage(&temp); } // void lhMorpRClose(const IplImage* src, IplImage* dst, IplConvKernel* se = NULL, int iterations=1) { assert(src != NULL && dst != NULL && src != dst ); //p155(6.17) IplImage* temp = cvCreateImage(cvGetSize(src), 8, 1); cvDilate(src, temp, se, iterations); lhMorpRErode(temp, src, dst, se, -1); cvReleaseImage(&temp); } void main() { IplImage*imgin=cvLoadImage("smooth.bmp"); IplImage*img=cvCreateImage(cvGetSize(imgin),IPL_DEPTH_8U,1); IplImage*img_o=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); IplImage*img_c=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); cvCvtColor(imgin,img,CV_RGB2GRAY); IplImage*img_grad=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); lhMorpGradient(img, img_grad, NULL, 1); int mask[9]={0,1,0,1,1,1,0,1,0}; IplConvKernel*element= cvCreateStructuringElementEx( 3, 3, 1, 1, CV_SHAP E_CUSTOM, mask ); IplImage *tmp = cvCloneImage(img); cvMorphologyEx(img_grad, img_o, tmp, element, CV_MOP_OPEN, 1); lhMorpROpen(img_grad, img_o, element, /*int iterations=*/2); lhMorpRClose(img_o,img_c , element, 2); cvNamedWindow("test",CV_WINDOW_AUTOSIZE); cvShowImage("test",img_grad); cvNamedWindow("test1",CV_WINDOW_AUTOSIZE); cvShowImage("test1",img_c); cvWaitKey(); cvDestroyAllWindows();

Das könnte Ihnen auch gefallen