滤波算法(3)

来源:互联网 发布:安迅网络 编辑:程序博客网 时间:2024/06/06 20:02

保护带均值

void cmean(Mat src, Mat dst, int innerbox_size, int outerbox_size) //innerbox_size, outerbox_size均为奇数{if ((innerbox_size >= outerbox_size) && (innerbox_size % 2 != outerbox_size % 2)){return;}//unsigned short centerpix;uchar centerpix;//vector<unsigned short> tempdata;vector<uchar> tempdata;tempdata.clear();//vector<unsigned short> tempdata2;vector<uchar> tempdata2;tempdata2.clear();int i = 0, j = 0, k = 0, l = 0;//循环变量int height, width, step;int inner_kernel_size = 0;int outer_kernel_size = 0;height = src.rows;width = src.cols;if (innerbox_size % 2 == 0){inner_kernel_size = innerbox_size / 2;outer_kernel_size = outerbox_size / 2;}else{inner_kernel_size = (innerbox_size - 1) / 2;outer_kernel_size = (outerbox_size - 1) / 2;}for (i = outer_kernel_size; i < height - outer_kernel_size; i++){/*unsigned short* data = src.ptr<unsigned short>(i);unsigned short* datadst = dst.ptr<unsigned short>(i);*/uchar* data = src.ptr<uchar>(i);uchar* datadst = dst.ptr<uchar>(i);for (j = outer_kernel_size; j < width - outer_kernel_size; j++){centerpix = data[j];tempdata.clear();tempdata2.clear();if (centerpix != 0){//计算保护带内像素值之和for (l = i - inner_kernel_size; l <= i + inner_kernel_size; l++){//unsigned short* datatemp = src.ptr<unsigned short>(l);uchar* datatemp = src.ptr<uchar>(l);for (k = j - inner_kernel_size; k <= j + inner_kernel_size; k++){tempdata.push_back(datatemp[k]);}}//计算大滤波框内像素值之和for (l = i - outer_kernel_size; l <= i + outer_kernel_size; ++l){//unsigned short* datatemp2 = src.ptr<unsigned short>(l);uchar* datatemp2 = src.ptr<uchar>(l);for (k = j - outer_kernel_size; k <= j + outer_kernel_size; k++){tempdata2.push_back(datatemp2[k]);}}size_t tempvec = tempdata.size();  //保护带内像素个数size_t tempvec2 = tempdata2.size();  //大滤波框内像素个数//unsigned short tempsum = 0, tempsum2 = 0;   //分别表示,保护带内像素值之和;大滤波框内像素值之和int tempsum = 0, tempsum2 = 0;int count = 0, count2 = 0;  //滤波框子里非零项个数for (size_t tempi = 0; tempi < tempvec; tempi++){tempsum += tempdata[tempi];if (tempdata[tempi] != 0) count++;}for (size_t tempi = 0; tempi < tempvec2; tempi++){tempsum2 += tempdata2[tempi];if (tempdata2[tempi] != 0) count2++;}tempsum2 = tempsum2 - tempsum;if (count2 == count) datadst[j] = 0;else{//unsigned short background = tempsum2 / (count2 - count);uchar background = tempsum2 / (count2 - count);datadst[j] = background;}}else{datadst[j] = 0;}}}return;}
保护带中值
void cmedian(Mat src, Mat dst, int innerbox_size, int outerbox_size) //innerbox_size, outerbox_size均为奇数{if ((innerbox_size >= outerbox_size) && (innerbox_size % 2 != outerbox_size % 2)){return;}//unsigned short centerpix;uchar centerpix;vector<uchar> dataForsort;dataForsort.clear();int i = 0, j = 0, k = 0, l = 0;//循环变量int height, width, step;int inner_kernel_size = 0;int outer_kernel_size = 0;height = src.rows;width = src.cols;if (innerbox_size % 2 == 0){inner_kernel_size = innerbox_size / 2;outer_kernel_size = outerbox_size / 2;}else{inner_kernel_size = (innerbox_size - 1) / 2;outer_kernel_size = (outerbox_size - 1) / 2;}for (i = outer_kernel_size; i < height - outer_kernel_size; ++i){/*unsigned short* data = src.ptr<unsigned short>(i);unsigned short* datadst = dst.ptr<unsigned short>(i);*/uchar* data = src.ptr<uchar>(i);uchar* datadst = dst.ptr<uchar>(i);for (j = outer_kernel_size; j < width - outer_kernel_size; ++j){centerpix = data[j];dataForsort.clear();if (centerpix != 0){/*环形保护带切割成四块分别计算*/for (l = i - outer_kernel_size; l < i - inner_kernel_size; ++l){for (k = j - outer_kernel_size; k <= j + outer_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}for (l = i - inner_kernel_size; l <= i + inner_kernel_size; ++l){for (k = j - outer_kernel_size; k < j - inner_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}for (l = i - inner_kernel_size; l <= i + inner_kernel_size; ++l){for (k = j + inner_kernel_size + 1; k <= j + outer_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}for (l = i + inner_kernel_size + 1; l <= i + outer_kernel_size; ++l){for (k = j - outer_kernel_size; k <= j + outer_kernel_size; ++k){dataForsort.push_back(src.at<uchar>(l, k));}}//排序sort(dataForsort.begin(), dataForsort.end());datadst[j] = dataForsort[dataForsort.size() / 2];}else{datadst[j] = 0;}}//j}//ireturn;}


原创粉丝点击