图像处理――(源)均值滤波(blue)、高斯滤波(GaussianBlue)函数编程实现

匿名 (未验证) 提交于 2019-12-02 23:48:02
  1 #include <opencv2/opencv.hpp>   2 #include <opencv2/core/core.hpp>   3 #include <opencv2/highgui/highgui.hpp>   4 #include<iostream>   5 #include<stdlib.h>   6 using namespace cv;   7 using namespace std;   8    9   10 void MeanFilter_my1(const Mat &src, Mat &dst, int ksize)//均值滤波  11 {  12     CV_Assert(ksize % 2 == 1);  13   14     int *kernel = new int[ksize*ksize];  15     for (int i = 0; i < ksize*ksize; i++)  16         kernel[i] = 1;  17     Mat tmp;  18     int len = ksize / 2;  19     tmp.create(Size(src.cols + len, src.rows + len), src.type());//添加边框  20     dst.create(Size(src.cols, src.rows), src.type());  21   22     int channel = src.channels();  23     uchar *ps = src.data;  24     uchar *pt = tmp.data;  25   26     for (int row = 0; row < tmp.rows; row++)//添加边框的过程  27     {  28         for (int col = 0; col < tmp.cols; col++)  29         {  30             for (int c = 0; c < channel; c++)  31             {  32                 if (row >= len && row < tmp.rows - len && col >= len && col < tmp.cols - len)  33                     pt[(tmp.cols * row + col)*channel + c] = ps[(src.cols * (row - len) + col - len) * channel + c];  34                 else  35                     pt[(tmp.cols * row + col)*channel + c] = 0;  36             }  37         }  38     }  39   40   41     uchar *pd = dst.data;  42     pt = tmp.data;  43     for (int row = len; row < tmp.rows - len; row++)//卷积的过程  44     {  45         for (int col = len; col < tmp.cols - len; col++)  46         {  47             for (int c = 0; c < channel; c++)  48             {  49                 short t = 0;  50                 for (int x = -len; x <= len; x++)  51                 {  52                     for (int y = -len; y <= len; y++)  53                     {  54                         t += kernel[(len + x) * ksize + y + len] * pt[((row + x) * tmp.cols + col + y) * channel + c];  55                     }  56                 }  57   58                 pd[(dst.cols * (row - len) + col - len) * channel + c] = saturate_cast<ushort> (t/(ksize*ksize));//防止数据溢出ushort是16为数据  59             }  60         }  61     }  62     delete[] kernel;  63 }  64 //方差可调节  65 void GaussFilter_my(const Mat &src, Mat &dst, int ksize, double sigmaX, double sigmaY = 0)  66 {  67     CV_Assert(ksize % 2 == 1);  68   69     if (fabs(sigmaY) < 1e-5)  70         sigmaY = sigmaX;  71   72     double *kernel = new double[ksize*ksize];  73     int center = ksize / 2;  74     double sum = 0;  75     for (int i = 0; i < ksize; i++)  76     {  77         for (int j = 0; j < ksize; j++)  78         {  79             kernel[i * ksize + j] = exp(-(i - center)*(i - center) / (2 * sigmaX*sigmaX) - (j - center)*(j - center) / (2 * sigmaY*sigmaY));  80             sum += kernel[i*ksize + j];  81         }  82     }  83     for (int i = 0; i < ksize; i++)  84     {  85         for (int j = 0; j < ksize; j++)  86         {  87             kernel[i*ksize + j] /= sum;  88         }  89     }  90     Mat tmp;  91     int len = ksize / 2;  92     tmp.create(Size(src.cols + len, src.rows + len), src.type());//添加边框  93     dst.create(Size(src.cols, src.rows), src.type());  94   95   96     int channel = src.channels();  97     uchar *ps = src.data;  98     uchar *pt = tmp.data;  99  100     for (int row = 0; row < tmp.rows; row++)//添加边框的过程 101     { 102         for (int col = 0; col < tmp.cols; col++) 103         { 104             for (int c = 0; c < channel; c++) 105             { 106                 if (row >= len && row < tmp.rows - len && col >= len && col < tmp.cols - len) 107                     pt[(tmp.cols * row + col)*channel + c] = ps[(src.cols * (row - len) + col - len) * channel + c]; 108                 else 109                     pt[(tmp.cols * row + col)*channel + c] = 0; 110             } 111         } 112     } 113  114     uchar *pd = dst.data; 115     pt = tmp.data; 116     for (int row = len; row < tmp.rows - len; row++)//卷积的过程 117     { 118         for (int col = len; col < tmp.cols - len; col++) 119         { 120             for (int c = 0; c < channel; c++) 121             { 122                 short t = 0; 123                 for (int x = -len; x <= len; x++) 124                 { 125                     for (int y = -len; y <= len; y++) 126                     { 127                         t += kernel[(len + x) * ksize + y + len] * pt[((row + x) * tmp.cols + col + y) * channel + c]; 128                     } 129                 } 130  131                 pd[(dst.cols * (row - len) + col - len) * channel + c] = saturate_cast<ushort> (t);//防止数据溢出ushort是16为数据 132             } 133         } 134     } 135     delete[] kernel; 136 } 137  138 int main() 139 { 140     Mat img=imread("E://lena.jpg"); 141     Mat dst=imread("E://heibai.jpg");     142     imshow("img",img); 143     imshow("dst",dst); 144     int k=7; 145     double sigmaX=0.001; 146     double sigmaY = 0.001; 147     MeanFilter_my1(img,dst,k); 148     imshow("dst1",dst); 149     GaussFilter_my(img,dst,k,sigmaX,sigmaY ); 150     imshow("dst1",dst); 151  152      153     waitKey(0); 154 }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!