代码:
//----------数学形态学--- 2 2 2 2 2 2-----------
//==== 2==用数学形态学去去掉厚的边缘======= 2=====
IplImage *tmp = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
cvCopy(src,tmp,0);
//cvCvtColor(src, tmp, CV_RGB2GRAY);
CvScalar sss;
//for (size_t row_dst = 0; row_dst < height-1; row_dst++)
//{
// for (size_t cols_dst = 0; cols_dst <width -1; cols_dst++) {
// // cout << "pij" << Pij[row_dst / 3][cols_dst / 3] << " ";
// if (tempPij[(row_dst)][(cols_dst )] >= 2) {//修改于8——15,引入中间变量标记
// sss = cvGet2D(tmp, (row_dst), (cols_dst));
// //cvSet2D();
// sss.val[0] = 1;
// cvSet2D(tmp, (row_dst), (cols_dst), sss);
// }
// else {
// sss = cvGet2D(tmp, (row_dst), (cols_dst));
// //cvSet2D();
// sss.val[0] = 0;
// cvSet2D(tmp, (row_dst), (cols_dst), sss);
// }
// }
//}
std::cout << "======哇 哈 哈===========" << endl;
int b1[9] = {0,1,0,1,1,1,0,1,0};
int b2[25] = {0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0};
int b31[9] = {0,0,0,1,1,1,0,0,0};
int b32[9] = {0,0,1,0,1,0,1,0,0};
int b33[9] = {0,1,0,0,1,0,0,1,0};
int b34[9] = {1,0,0,0,1,0,0,0,1};
IplConvKernel *elementb1 = cvCreateStructuringElementEx(3,3,0,0,CV_SHAPE_RECT,b1);
IplConvKernel *elementb2 = cvCreateStructuringElementEx(5,5,0,0,CV_SHAPE_RECT,b2);
IplConvKernel *elementb31 = cvCreateStructuringElementEx(3,3,0,0,CV_SHAPE_RECT,b31);
IplConvKernel *elementb32 = cvCreateStructuringElementEx(3,3,0,0,CV_SHAPE_RECT,b32);
IplConvKernel *elementb33 = cvCreateStructuringElementEx(3,3,0,0,CV_SHAPE_RECT,b33);
IplConvKernel *elementb34 = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT, b34);
IplImage *gg1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *gg2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *gg3 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *gg4 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
//IplImage *dd_temp3_1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
//IplImage *dd_temp3_2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
//IplImage *dd_temp4_1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
//IplImage *dd_temp4_2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
// IplImage *dd_temp1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
// IplImage *dd_temp2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
//cvMorphologyEx(dd3,tmp,dd1,element1)
IplImage *dd_temp1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd_temp2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
cvDilate(tmp,dd_temp1,elementb1,1);
cvErode(tmp, dd_temp1, elementb1, 1);
cvErode(dd_temp1, dd_temp1, elementb2, 1);
cvDilate(dd_temp1,dd_temp1,elementb2,1);
cvDilate(dd_temp1, dd_temp1, elementb31, 1);
////
cvErode(tmp, dd_temp2, elementb1, 1);
cvDilate(tmp, dd_temp2, elementb1, 1);
cvDilate(dd_temp2, dd_temp2, elementb2, 1);
cvErode(dd_temp2, dd_temp2, elementb2, 1);
cvErode(dd_temp2, dd_temp2, elementb31, 1);
cvAbsDiff(dd_temp1, dd_temp2, gg1);
cvReleaseImage(&dd_temp1);
cvReleaseImage(&dd_temp2);
std::cout << "============嘻嘻嘻===" << endl;
//==========================================
IplImage *dd_temp2_1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd_temp2_2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
cvDilate(tmp, dd_temp2_1, elementb1, 1);
cvErode(tmp, dd_temp2_1, elementb1, 1); //
cvErode(dd_temp2_1, dd_temp2_1, elementb2, 1);
cvDilate(dd_temp2_1, dd_temp2_1, elementb2, 1);
cvDilate(dd_temp2_1, dd_temp2_1, elementb32, 1);
////
cvErode(tmp, dd_temp2_2, elementb1, 1);
cvDilate(tmp, dd_temp2_2, elementb1, 1);//
cvDilate(dd_temp2_2, dd_temp2_2, elementb2, 1);
cvErode(dd_temp2_2, dd_temp2_2, elementb2, 1);
cvErode(dd_temp2_2, dd_temp2_2, elementb32, 1);
cvAbsDiff(dd_temp2_1, dd_temp2_2, gg2);//
cvReleaseImage(&dd_temp2_1);
cvReleaseImage(&dd_temp2_2);
std::cout << "======2we======嘻嘻嘻===" << endl;
//cvAdd
//=================================
IplImage *dd_temp3_1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd_temp3_2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
cvDilate(tmp, dd_temp3_1, elementb1, 1);
cvErode(tmp, dd_temp3_1, elementb1, 1);//
cvErode(dd_temp3_1, dd_temp3_1, elementb2, 1);
cvDilate(dd_temp3_1, dd_temp3_1, elementb2, 1);
cvDilate(dd_temp3_1, dd_temp3_1, elementb33, 1);//
////
cvErode(tmp, dd_temp3_2, elementb1, 1);
cvDilate(tmp, dd_temp3_2, elementb1, 1);//
cvDilate(dd_temp3_2, dd_temp3_2, elementb2, 1);
cvErode(dd_temp3_2, dd_temp3_2, elementb2, 1);
cvErode(dd_temp3_2, dd_temp3_2, elementb33, 1);//
cvAbsDiff(dd_temp3_1, dd_temp3_2, gg3);
cvReleaseImage(&dd_temp3_1);
cvReleaseImage(&dd_temp3_2);
std::cout << "======3we======嘻嘻嘻===" << endl;
//=======================
IplImage *dd_temp4_1 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd_temp4_2 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
cvDilate(tmp, dd_temp4_1, elementb1, 1);
cvErode(tmp, dd_temp4_1, elementb1, 1);//
cvErode(dd_temp4_1, dd_temp4_1, elementb2, 1);
cvDilate(dd_temp4_1, dd_temp4_1, elementb2, 1);
cvDilate(dd_temp4_1, dd_temp4_1, elementb34, 1);
////
cvErode(tmp, dd_temp4_2, elementb1, 1);
cvDilate(tmp, dd_temp4_2, elementb1, 1);
cvDilate(dd_temp4_2, dd_temp4_2, elementb2, 1);
cvErode(dd_temp4_2, dd_temp4_2, elementb2, 1);
cvErode(dd_temp4_2, dd_temp4_2, elementb34, 1);
cvAbsDiff(dd_temp4_1, dd_temp4_2, gg4);
cvReleaseImage(&dd_temp4_1);
cvReleaseImage(&dd_temp4_2);
std::cout << "======4we======嘻嘻嘻===" << endl;
cvAdd(gg1,gg2,gg1,0);
cvAdd(gg1,gg3,gg1,0);
cvAdd(gg1,gg4,gg1,0);
cvReleaseImage(&gg2);
cvReleaseImage(&gg3);
cvReleaseImage(&gg4);
//===== 2 2====以上为用数学形态学去掉厚的边缘==== 2 2========
//------- 2 2-----数学形态学- 2 2 2---------
cvNamedWindow("src2", CV_WINDOW_AUTOSIZE);
cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);
//cvNamedWindow("dst_2", CV_WINDOW_AUTOSIZE);
//cvNamedWindow("dd3", CV_WINDOW_AUTOSIZE);
//
cvShowImage("src2", src2);
cvShowImage("dst", dst);
//cvShowImage("dst_2", dst_2);
//cvShowImage("dd3", dd3);
cvShowImage("gg1", gg1);
//cvSaveImage("E:\\二值像素图像保存\\8_3\\aa\\5_28\\mor\\2)第2处理二值标记的结果_种数学形态学方法的结果.bmp", dd3);//dst
cvSaveImage("E:\\二值像素图像保存\\8_3\\aa\\5_28\\mor\\3)第2处理二值标记的结果_种数学形态学方法的结果.bmp",gg1);//dst
//cvSaveImage("E:\\二值像素图像保存\\8_3\\aa\\11_6\\(1)_放大三倍.bmp", dst_2);
cvWaitKey(0);
cvReleaseImage(&src2);
cvReleaseImage(&dst);
cvReleaseImage(&dst_2);
//cvReleaseImage(&dd3);
cvReleaseImage(&gg1);
cvDestroyAllWindows();