编程练习:

1,中值滤波。3x3的区域内取中间值即第五个值。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main()
{
    // 创建一个大小为3x4的灰度图像
    Mat gray = (Mat_<uchar>(3, 4) <<
            20, 100, 150, 30,
            50,   0, 110, 90,
            70,  80, 130, 50
        );
    //进行中值滤波,并输出
    Mat filtered;
    medianBlur(gray, filtered, 3);

    namedWindow("gray", WINDOW_GUI_NORMAL);
    namedWindow("filtered", WINDOW_GUI_NORMAL);
    imshow("gray", gray);
    imshow("filtered", filtered);
    //打印出filtered的每个像素值
    for (int i = 0; i < filtered.rows; i++) {
        for (int j = 0; j < filtered.cols; j++) {
            cout << (int)filtered.at<uchar>(i, j) << " ";
        }
        cout << endl;
    }
    waitKey(0);

    return 0;
}

 

滤波结果: 

20 100 100 90
50 80 90 90
70 80 80 90

2:均值滤波 

 

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main()
{
    // 创建一个大小为3x4的灰度图像
    Mat gray = (Mat_<uchar>(3, 4) <<
        20, 100, 150, 30,
        50, 0, 110, 90,
        70, 80, 130, 50
        );
    //进行普通均值滤波,并输出
    Mat filtered;
    blur(gray, filtered, Size(3, 3));

    namedWindow("gray", WINDOW_GUI_NORMAL);
    namedWindow("filtered", WINDOW_GUI_NORMAL);
    imshow("gray", gray);
    imshow("filtered", filtered);
    //打印出filtered的每个像素值
    for (int i = 0; i < filtered.rows; i++) {
        for (int j = 0; j < filtered.cols; j++) {
            cout << (int)filtered.at<uchar>(i, j) << " ";
        }
        cout << endl;
    }
    waitKey(0);

    return 0;
}

 

 这是滤波后的像素值:

36 66 76 106
56 79 82 106
37 67 73 103

 3:简单的卷积核滤波

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main()
{
    // 创建一个大小为3x4的灰度图像
    Mat gray = (Mat_<uchar>(3, 4) <<
        20, 100, 150, 30,
        50, 0, 110, 90,
        70, 80, 130, 50
        );
    //卷积核
    Mat kernel = (Mat_<char>(3,3)<<
        1,0,0,
        0,0,0,
        0,0,1
        );
    //用kernel作为卷积核对gray进行滤波边缘像素保留原值,并输出
    Mat filtered;
    filter2D(gray, filtered, -1, kernel, Point(-1, -1), 0, BORDER_REPLICATE);

    namedWindow("gray", WINDOW_GUI_NORMAL);
    namedWindow("filtered", WINDOW_GUI_NORMAL);
    imshow("gray", gray);
    imshow("filtered", filtered);
    //打印出filtered的每个像素值
    for (int i = 0; i < filtered.rows; i++) {
        for (int j = 0; j < filtered.cols; j++) {
             cout << (int)filtered.at<uchar>(i, j) << " ";
          }
          cout << endl;
        }


    waitKey(0);

    return 0;
}

 滤波结果:

20 130 190 240
100 150 150 200
130 180 50 160

更多推荐