滤波算法(4)

来源:互联网 发布:手机做淘宝客怎么做 编辑:程序博客网 时间:2024/06/05 03:34

保护带顶帽滤波

#include<opencv2\opencv.hpp>#include<iostream>#include<opencv2\core\mat.hpp>using namespace std;using namespace cv;

外环区域先膨胀

void out_ring_dilate(Mat src,Mat dst,int innerbox_size, int outerbox_size){//cvtColor(src, src, CV_BGR2GRAY);if ((innerbox_size >= outerbox_size) && (innerbox_size % 2 != outerbox_size % 2)){cout << "核大小出现错误!!!" << endl;}int inner_kernel_size = 0;int outer_kernel_size = 0;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;}vector<uchar> elementdata;elementdata.clear();//dst = src.clone();for (int i = outer_kernel_size; i <src.rows - outer_kernel_size; ++i){uchar* datadst = dst.ptr<uchar>(i);for (int j = outer_kernel_size; j < src.cols - outer_kernel_size; ++j){/*环形保护带切割成四块分别计算*/elementdata.clear();for (int l = i - outer_kernel_size; l < i - inner_kernel_size; ++l){for (int k = j - outer_kernel_size; k <= j + outer_kernel_size; ++k){elementdata.push_back(src.at<uchar>(l, k));}}for (int l = i - inner_kernel_size; l <= i + inner_kernel_size; ++l){for (int k = j - outer_kernel_size; k < j - inner_kernel_size; ++k){elementdata.push_back(src.at<uchar>(l, k));}}for (int l = i - inner_kernel_size; l <= i + inner_kernel_size; ++l){for (int k = j + inner_kernel_size + 1; k <= j + outer_kernel_size; ++k){elementdata.push_back(src.at<uchar>(l, k));}}for (int l = i + inner_kernel_size + 1; l <= i + outer_kernel_size; ++l){for (int k = j - outer_kernel_size; k <= j + outer_kernel_size; ++k){elementdata.push_back(src.at<uchar>(l, k));}}/*保护带内框计算*//*for (int l = i - inner_kernel_size; l < i + inner_kernel_size; l++){for (int k = j - inner_kernel_size; k < j + inner_kernel_size; k++){elementdata.push_back(0);}}*/sort(elementdata.begin(), elementdata.end());datadst[j] = elementdata[elementdata.size() - 1];}}return ;}
外框腐蚀

void outbox_erode(Mat src,Mat dst,int innerbox_size, int outerbox_size){//cvtColor(src, src, CV_BGR2GRAY);if ((innerbox_size >= outerbox_size) && (innerbox_size % 2 != outerbox_size % 2)){cout << "核大小出现错误!!!" << endl;}int inner_kernel_size = 0;int outer_kernel_size = 0;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;}//dst = src.clone();vector<uchar> elementdata;elementdata.clear();for (int i = outer_kernel_size; i <src.rows - outer_kernel_size; ++i){uchar* dstdata = dst.ptr<uchar>(i);for (int j = outer_kernel_size; j < src.cols - outer_kernel_size; ++j){/*保护带外框计算*/elementdata.clear();for (int l = i - outer_kernel_size; l < i + outer_kernel_size; l++){for (int k = j - outer_kernel_size; k < j + outer_kernel_size; k++){elementdata.push_back(src.at<uchar>(l, k));}}sort(elementdata.begin(), elementdata.end());dstdata[j] = elementdata[0];}}return ;}
顶帽操作

Mat cTophat_filter(Mat source, int innerbox_size, int outerbox_size){//Mat src = imread("1.jpg", 0);Mat dst1=source.clone();Mat dst2=source.clone();out_ring_dilate(source,dst1, innerbox_size, outerbox_size);//imshow("out_ring_dilate", dst1);outbox_erode(dst1,dst2, innerbox_size,outerbox_size);//imshow("outbox_erode", dst2);/*背景建模*/dst2 = dst2 - source;return dst2;}

主函数

void main_cTophat_filter(){Mat src = imread("1.jpg",0);Mat dst;dst=cTophat_filter(src, 5, 9);imshow("src", src);imshow("dst",dst);waitKey(0);}




原创粉丝点击