数学形态学的一个操作(2)
代码:
// //======用数学形态学去去掉厚的边缘============
IplImage *tmp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
cvCopy(src,tmp,0);
//cvCvtColor(dst_2, tmp, CV_RGB2GRAY);
CvScalar sss;
std::cout << "======哇 哈 哈===========" << endl;
int rect1[9] = { 0,0,0,1,1,1,0,0,0 };
int rect2[9] = { 0,0,1,0,1,0,1,0,0 };
int rect3[9] = { 0,1,0,0,1,0,0,1,0 };
int rect4[9] = { 1,0,0,0,1,0,0,0,1 };
int rect5[5] = { 1,1,1,1 };
IplConvKernel *element1 = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT, rect1);
IplConvKernel *element2 = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT, rect2);
IplConvKernel *element3 = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT, rect3);
IplConvKernel *element4 = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT, rect4);
IplConvKernel *element5 = cvCreateStructuringElementEx(2, 2, 0, 0, CV_SHAPE_RECT, rect5);
IplImage *dd3 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd2_3 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd3_3 = cvCreateImage(cvGetSize(tmp), IPL_DEPTH_8U, 1);
IplImage *dd4_3 = 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);
cvErode(tmp, dd_temp1, element5, 1);
cvDilate(tmp, dd_temp1, element5, 1);
cvDilate(tmp, dd_temp1, element1, 1);
cvDilate(tmp, dd_temp2, element5, 1);
cvErode(tmp, dd_temp2, element5, 1);
cvErode(tmp, dd_temp2, element1, 1);
cvAbsDiff(dd_temp1, dd_temp2, dd3);
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);
cvErode(tmp, dd_temp2_1, element5, 1);
cvDilate(tmp, dd_temp2_1, element5, 1);
cvDilate(tmp, dd_temp2_1, element2, 1);
cvDilate(tmp, dd_temp2_2, element5, 1);
cvErode(tmp, dd_temp2_2, element5, 1);
cvErode(tmp, dd_temp2_2, element2, 1);
cvAbsDiff(dd_temp2_1, dd_temp2_2, dd2_3);
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);
cvErode(tmp, dd_temp3_1, element5, 1);
cvDilate(tmp, dd_temp3_1, element5, 1);
cvDilate(tmp, dd_temp3_1, element3, 1);
cvDilate(tmp, dd_temp3_2, element5, 1);
cvErode(tmp, dd_temp3_2, element5, 1);
cvErode(tmp, dd_temp3_2, element3, 1);
cvAbsDiff(dd_temp3_1, dd_temp3_2, dd3_3);
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);
cvErode(tmp, dd_temp4_1, element5, 1);
cvDilate(tmp, dd_temp4_1, element5, 1);
cvDilate(tmp, dd_temp4_1, element4, 1);
cvDilate(tmp, dd_temp4_2, element5, 1);
cvErode(tmp, dd_temp4_2, element5, 1);
cvErode(tmp, dd_temp4_2, element4, 1);
cvAbsDiff(dd_temp4_1, dd_temp4_2, dd4_3);
cvReleaseImage(&dd_temp4_1);
cvReleaseImage(&dd_temp4_2);
std::cout << "======4we======嘻嘻嘻===" << endl;
cvAdd(dd3, dd2_3, dd3, 0);
cvAdd(dd3, dd3_3, dd3, 0);
cvAdd(dd3, dd4_3, dd3, 0);
cvReleaseImage(&dd2_3);
cvReleaseImage(&dd3_3);
cvReleaseImage(&dd4_3);
//=========以上为用数学形态学去掉厚的边缘============
//------------数学形态学----------
//dd3
int width2 = dd3->width;//图片宽度
int height2 = dd3->height;//图片高度
vector<int> v0;
int m_Gr[M][M] = {0};//int m_Graylevel[256][256];
for (size_t row = 0; row < height2; row++)
{
uchar* ptr = (uchar*)dd3->imageData + row*src->width;//获得灰度值数据指针
for (size_t cols = 0; cols < width2; cols++)
{
int intensity = ptr[cols];
v0.push_back(intensity);
}
}
int count2 = 0;
for (int i = 0; i < height2; ++i) //修改于7_12
{
for (int j = 0; j < width2; ++j)
{
m_Gr[i][j] = v0[count2++];
//cout <<i<<","<<j<<":"<<" "<< m_Graylevel[i][j] << " ";
}
//cout << endl;
//cout << m_Graylevel[255][255] << endl;
}
int ddd = otsuThreshold(dd3);
for (size_t row_dst1 = 0; row_dst1 < dd3->height - 1; row_dst1++)
{
for (size_t cols_dst1 = 0; cols_dst1 < dd3->width - 1; cols_dst1++) {
// cout << "pij" << Pij[row_dst / 3][cols_dst / 3] << " ";
if (m_Gr[(row_dst1)][(cols_dst1)]>=ddd) {
s3 = cvGet2D(dd3, row_dst1, cols_dst1);
//cvSet2D();
s3.val[0] = m_Graylevel[row_dst1][cols_dst1];
s3.val[1] = m_Graylevel[row_dst1][cols_dst1];
s3.val[2] = m_Graylevel[row_dst1][cols_dst1];
cvSet2D(dd3, row_dst1, (cols_dst1), s3);
}
else {
s3 = cvGet2D(dd3, row_dst1, cols_dst1);
//cvSet2D();
s3.val[0] = 0;
s3.val[1] = 0;
s3.val[2] = 0;
cvSet2D(dd3, row_dst1, (cols_dst1), s3);
}
}
}