fpga_feixiang 发表于 2020-5-27 23:16:32

中值滤波C代码

/求九个数的中值
uchar Median(uchar n1, uchar n2, uchar n3, uchar n4, uchar n5,
        uchar n6, uchar n7, uchar n8, uchar n9) {
        uchar arr;
        arr = n1;
        arr = n2;
        arr = n3;
        arr = n4;
        arr = n5;
        arr = n6;
        arr = n7;
        arr = n8;
        arr = n9;
        for (int gap = 9 / 2; gap > 0; gap /= 2)//希尔排序
                for (int i = gap; i < 9; ++i)
                        for (int j = i - gap; j >= 0 && arr > arr; j -= gap)
                                swap(arr, arr);
        return arr;//返回中值
}

//图像椒盐化
void salt(Mat &image, int num) {
        if (!image.data) return;//防止传入空图
        int i, j;
        srand(time(NULL));
        for (int x = 0; x < num; ++x) {
                i = rand() % image.rows;
                j = rand() % image.cols;
                image.at<Vec3b>(i, j) = 255;
                image.at<Vec3b>(i, j) = 255;
                image.at<Vec3b>(i, j) = 255;
        }
}

//中值滤波函数
void MedianFlitering(const Mat &src, Mat &dst) {
        if (!src.data)return;
        Mat _dst(src.size(), src.type());
        for(int i=0;i<src.rows;++i)
                for (int j=0; j < src.cols; ++j) {
                        if ((i - 1) > 0 && (i + 1) < src.rows && (j - 1) > 0 && (j + 1) < src.cols) {
                                _dst.at<Vec3b>(i, j) = Median(src.at<Vec3b>(i, j), src.at<Vec3b>(i + 1, j + 1),
                                        src.at<Vec3b>(i + 1, j), src.at<Vec3b>(i, j + 1), src.at<Vec3b>(i + 1, j - 1),
                                        src.at<Vec3b>(i - 1, j + 1), src.at<Vec3b>(i - 1, j), src.at<Vec3b>(i, j - 1),
                                        src.at<Vec3b>(i - 1, j - 1));
                                _dst.at<Vec3b>(i, j) = Median(src.at<Vec3b>(i, j), src.at<Vec3b>(i + 1, j + 1),
                                        src.at<Vec3b>(i + 1, j), src.at<Vec3b>(i, j + 1), src.at<Vec3b>(i + 1, j - 1),
                                        src.at<Vec3b>(i - 1, j + 1), src.at<Vec3b>(i - 1, j), src.at<Vec3b>(i, j - 1),
                                        src.at<Vec3b>(i - 1, j - 1));
                                _dst.at<Vec3b>(i, j) = Median(src.at<Vec3b>(i, j), src.at<Vec3b>(i + 1, j + 1),
                                        src.at<Vec3b>(i + 1, j), src.at<Vec3b>(i, j + 1), src.at<Vec3b>(i + 1, j - 1),
                                        src.at<Vec3b>(i - 1, j + 1), src.at<Vec3b>(i - 1, j), src.at<Vec3b>(i, j - 1),
                                        src.at<Vec3b>(i - 1, j - 1));
                        }
                        else
                                _dst.at<Vec3b>(i, j) = src.at<Vec3b>(i, j);
                }
        _dst.copyTo(dst);//拷贝
}


void main() {
        Mat image = imread("路飞.jpg");

        Mat Salt_Image;
        image.copyTo(Salt_Image);
        salt(Salt_Image, 3000);

        Mat image3, image4;
        MedianFlitering(Salt_Image, image3);
        medianBlur(Salt_Image, image4, 3);
        imshow("自定义中值滤波处理后", image3);
        imshow("openCV自带的中值滤波", image4);
        waitKey();
}

大鹏 发表于 2020-5-28 16:39:07

中值滤波C代码
页: [1]
查看完整版本: 中值滤波C代码