我的平均过滤器是否正确?我需要改变什么来使它工作?

时间:2013-10-29 13:25:53

标签: c++ filter mean

问题是我不知道如何在使用均值滤波器时正确完成数学运算。所有9个内核中的3x3内核,权重值为1。我得到了一些使用总和部分的帮助,但我不知道它是否正常工作,我当然无法建立。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()

{
    Mat gray_image, convolued_image;

    gray_image = imread( "C:/1.jpg", CV_LOAD_IMAGE_GRAYSCALE);   // Read the file
    convolued_image = gray_image;


    if(!gray_image.data )                                     // Check for invalid input

    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }

    namedWindow( "RGB Input", CV_WINDOW_AUTOSIZE );    
    imshow( "RGB Input", gray_image );                 



     Mat meanImg;
       gray_image.copyTo(meanImg);

      namedWindow( "meanImg", CV_WINDOW_AUTOSIZE );    
    imshow( "meanImg", meanImg );  


        waitKey(0);    

        for (int y = 0; y < gray_image.rows; y++)
       {
               for (int x = 0; x < gray_image.cols; y++)
              {
                      int intesity = gray_image.at<uchar>(y,x);       
                      int sum = gray_image.at<uchar>(y+1,x+1);
                            sum = gray_image.at<uchar>(y+1,x);
                            sum = gray_image.at<uchar>(y+1,x-1);
                            sum = gray_image.at<uchar>(y,x-1);
                            sum = gray_image.at<uchar>(y,x+1);
                            sum = gray_image.at<uchar>(y-1,x-1);
                            sum = gray_image.at<uchar>(y+1,x);
                            sum = gray_image.at<uchar>(y+1,x+1);

                    int mean = sum/9;

                meanImg.at<uchar>(y,x) = mean;


              }
       }


    return 0;
}

2 个答案:

答案 0 :(得分:3)

sum = gray_image.at<uchar>(y+1,x);
sum = gray_image.at<uchar>(y+1,x-1);
sum = gray_image.at<uchar>(y,x-1);

您的变量名为sum,但您实际上并未在此处添加任何内容。

你也可以通过在图像边界外读取来开始你的循环。

答案 1 :(得分:0)

一旦你建立起来,你就会有这些错误:

你在

中遗漏了一个角色
sum = gray_image.at<uchar>(y+1,x);

这些行用新值替换sum的值。

要将它们实际添加到一起,请执行

sum += gray_image.at<uchar>(y+1,x);

您还要在图像范围之外编制索引 - 您需要正确处理xy为0或其各自最大值的情况。

在内部循环中,您说y++,您应该说x++