C++ 高斯模糊缩小缩放图像?

C++ 高斯模糊缩小缩放图像?,c++,opencv,image-processing,convolution,gaussian,C++,Opencv,Image Processing,Convolution,Gaussian,我正在尝试实现高斯模糊,我根据维基百科生成了高斯滤波器: void FilterCreation(double GKernel[][5]) { // intialising standard deviation to 1.0 double sigma = 1.0; double r, s = 2.0 * sigma * sigma; // sum is for normalization double sum = 0.0;

我正在尝试实现高斯模糊,我根据维基百科生成了高斯滤波器:

void FilterCreation(double GKernel[][5]) 
{ 
    // intialising standard deviation to 1.0 
    double sigma = 1.0; 
    double r, s = 2.0 * sigma * sigma; 
  
    // sum is for normalization 
    double sum = 0.0; 
  
    // generating 5x5 kernel 
    for (int x = -2; x <= 2; x++) { 
        for (int y = -2; y <= 2; y++) { 
            r = sqrt(x * x + y * y); 
            GKernel[x + 2][y + 2] = (exp(-(r * r) / s)) / (M_PI * s); 
            sum += GKernel[x + 2][y + 2]; 
        } 
    } 
  
    // normalising the Kernel 
    for (int i = 0; i < 5; ++i) 
        for (int j = 0; j < 5; ++j) 
            GKernel[i][j] /= sum; 
} 
如果我选择值为
7
(它有索引(1,1))的像素(在矩阵中),卷积将如下所示:

new_matrix(1,1) = ( 1 * 1 ) + ( 2 * 2 ) + ( 3 * 3 )
              ( 4 * 6 ) + ( 5 * 7 ) + ( 6 * 8 )
              ( 7 * 11 ) + ( 8 * 12 ) + ( 9 * 13 )
并对我可以使用的每个像素(因此我不能从第一行或最后一行/列中提取像素)执行此操作代码:

void CreateGaussFilter(int kernalHeight, int kernalWidth, double kernalArray[5][5]){

    Mat image = imread("konik.jpg");
  Mat filter(image.size(),CV_8UC1);

    int rows=image.rows;
    int cols=image.cols;


    int verticleImageBound=(kernalHeight-1)/2;
    int horizontalImageBound=(kernalWidth-1)/2;

    for(int row=0+verticleImageBound;row<rows-verticleImageBound;row++){
        for(int col=0+horizontalImageBound;col<cols-horizontalImageBound;col++){

            float value=0.0;

            for(int kRow=0;kRow<kernalHeight;kRow++){
                    for(int kCol=0;kCol<kernalWidth;kCol++){
                        float pixel=image.at<uchar>(kRow+row-verticleImageBound,kCol+col-horizontalImageBound)*kernalArray[kRow][kCol];
                        value+=pixel;
                    }
            }
        filter.at<uchar>(row,col)=cvRound(value);

        }

    }
  imwrite("myFilter.jpg",filter);

}
void CreateGaussFilter(int-kernalHeight,int-kernalWidth,double-kernalArray[5][5]){
Mat image=imread(“konik.jpg”);
Mat过滤器(image.size(),CV_8UC1);
int rows=image.rows;
int cols=image.cols;
int verticleImageBound=(内核高度-1)/2;
int horizontalImageBound=(内核宽度-1)/2;

对于(int row=0+verticleImageBound;row可能您在处理期间将3通道图像解释为1通道=>仅处理x维中的1/3,并且默认情况下,rowimread中彼此相邻的3个相同像素将图像读取为3通道。使用右标志可按原样读取或按灰度读取
void CreateGaussFilter(int kernalHeight, int kernalWidth, double kernalArray[5][5]){

    Mat image = imread("konik.jpg");
  Mat filter(image.size(),CV_8UC1);

    int rows=image.rows;
    int cols=image.cols;


    int verticleImageBound=(kernalHeight-1)/2;
    int horizontalImageBound=(kernalWidth-1)/2;

    for(int row=0+verticleImageBound;row<rows-verticleImageBound;row++){
        for(int col=0+horizontalImageBound;col<cols-horizontalImageBound;col++){

            float value=0.0;

            for(int kRow=0;kRow<kernalHeight;kRow++){
                    for(int kCol=0;kCol<kernalWidth;kCol++){
                        float pixel=image.at<uchar>(kRow+row-verticleImageBound,kCol+col-horizontalImageBound)*kernalArray[kRow][kCol];
                        value+=pixel;
                    }
            }
        filter.at<uchar>(row,col)=cvRound(value);

        }

    }
  imwrite("myFilter.jpg",filter);

}