vs2015+opencv3.3.1 實現 c++ 雙邊濾波器

來源:互聯網
上載者:User

標籤:continue   大小   ace   ble   size   waitkey   複製   ++   sigma   

#include <opencv2\highgui\highgui.hpp>#include <iostream>#include<vector>using namespace  cv;using namespace  std;void GetGaussianKernel(double*& gaus_1, const int size, const double sigma_s);void gaussianFilter2(const vector<uchar>& corrupted, vector<uchar> &smooth, double*& templates,const int width,const int height, const double sigma_r, const int size_m);int main() {const double sigma_r = 30;//範圍的sigmaconst double PI = 4.0*atan(1.0); //圓周率π賦值const int size_m = 5;//模板大小const double sigma_s = 10;//空間域的sigmadouble *templates;templates = new double[size_m*size_m];GetGaussianKernel(templates, size_m, sigma_s);Mat img = imread("123.jpg", 3);//namedWindow("MyWindow");//imshow("MyWindow", img);vector<uchar> array(img.rows*img.cols*3);if (img.isContinuous()) { array.assign(img.datastart, img.dataend); }vector<uchar> no(img.rows*img.cols*3);gaussianFilter2(array, no, templates ,int(img.cols)*3, img.rows,sigma_r,size_m);Mat now((int)img.rows, (int)img.cols, CV_8UC3 );for (int i = 0; i < img.rows; i++)for (int j = 0; j < img.cols; j++) {now.at<Vec3b>(i, j)[0] = no[i*img.cols*3 + j*3];now.at<Vec3b>(i, j)[1] = no[i*img.cols*3 + j*3 + 1];now.at<Vec3b>(i, j)[2] =no[i*img.cols*3 + j*3 + 2];}imwrite("1123.jpg", now);namedWindow("MyWindow1");imshow("MyWindow1", now);waitKey(0);return 0;}void GetGaussianKernel(double*& gaus_1, const int size, const double sigma_s){double **gaus = new double*[size];for (int i = 0; i<size; i++)gaus[i] = new double[size];double sum = 0;for (int i = -size / 2; i<size / 2 + 1; i++) {for (int j = -size / 2; j<size / 2 + 1; j++) {gaus[i + size / 2][j + size / 2] = exp(-((i*i) + (j*j)) / (2 * sigma_s*sigma_s));sum += gaus[i + size / 2][j + size / 2];}}for (int i = 0; i<size; i++) {for (int j = 0; j<size; j++) {gaus[i][j] /= sum;gaus_1[i*size + j] = gaus[i][j];//使用一維更簡單}}return;}void gaussianFilter2(const vector<uchar>& corrupted, vector<uchar> &smooth,double*& templates,const int width,const int height,const double sigma_r, const int size_m) {int len = size_m / 2;smooth = corrupted;  //複製像素for (int j = 0; j<height ; j++) {  //邊緣不處理for (int i = 0; i<width ; i++) {double sum = 0;int index = 0;double sum_c = 0;double temp = 0;for (int m = j - len; m<j + len + 1; m++) {for (int n = i - 3 * len; n<i + 3 * len + 1; n += 3) {if (m<0 || n<0 || m>height - 1 || n>width - 1)continue;  //邊緣處理temp = templates[index++] * exp(-(corrupted[m*width + n] - corrupted[j*width + i])*(corrupted[m*width + n] - corrupted[j*width + i]) / (2.0*sigma_r*sigma_r));sum += corrupted[m*width + n] * temp;sum_c += temp;}}sum /= sum_c;if (sum > 255)sum = 255;if (sum < 0)sum = 0;smooth[j*width + i] = sum;}}}

  

vs2015+opencv3.3.1 實現 c++ 雙邊濾波器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.