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);
}