【c++|opencv】二、灰度变换和空间滤波---5.中值滤波

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

1. 中值滤波

cpp 复制代码
#include<iostream>
#include<opencv2/opencv.hpp>
#include"Salt.h"


using namespace cv;
using namespace std;

void myfilter(int filter_size,Mat& img_input,Mat& img_output);
int mysort(Mat& sortarray,int filter_size);


int main(){
    Mat img,img_gray,img_output,img_output2;
    img = imread("/home/v/home.png");
    if (img.empty()){
        cout<<"could not load image"<<endl;
        return -1;
    }
 
    imshow("img",img);
    cvtColor(img,img_gray,COLOR_BGR2GRAY);
    Salt(img_gray,1000);
    imshow("img gray",img_gray);

    //OpenCV自带滤波器
    int a=7;
    medianBlur(img_gray,img_output,a);
    imshow("medianBlur",img_output);

    // 自编函数
    myfilter(a,img_gray,img_output2);
    imshow("myfilter",img_output2);

    waitKey(0);
    return 0;
}

void myfilter(int filter_size,Mat& img_input,Mat& img_output){
    img_output = img_input.clone();
    Mat sortarray(1,filter_size*filter_size,CV_8U);
    int k = (filter_size-1)/2;

    for (int i=k;i<img_input.rows-k;i++){
        for (int j=k;j<img_input.cols-k;j++){
            int h = 0;
            for (int m=-k;m<=k;m++){
                for (int n=-k;n<=k;n++){
                    sortarray.at<uchar>(h) = img_input.at<uchar>(i+m,j+n);
                    h++;
                }
            }
            img_output.at<uchar>(i,j) = mysort(sortarray,filter_size*filter_size);
        }
    }
}

// 找中值
int mysort(Mat& sortarray,int filter_size){

    int exchange;
    int m;
    for (int i=1;i<=filter_size-1;i++){
        for (int j=1;j<filter_size-1;j++){
            if (sortarray.at<uchar>(j-1) > sortarray.at<uchar>(j)){
                exchange = sortarray.at<uchar>(j-1);
                sortarray.at<uchar>(j-1) = sortarray.at<uchar>(j);
                sortarray.at<uchar>(j) = exchange;
            }
        }
    }
    return sortarray.at<uchar>((filter_size+1)/2);
}
相关推荐
爱吃牛肉的大老虎13 分钟前
Rust对象之结构体,枚举,特性
开发语言·后端·rust
bbq粉刷匠25 分钟前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
迷途之人不知返42 分钟前
lambda表达式
c++
@三十一Y1 小时前
C++:红黑树的实现
开发语言·c++
_wyt0011 小时前
拓扑排序:有向无环图的排队艺术
c++·拓扑排序·队列
皓月斯语1 小时前
B2118 验证子串
c++·题解
乐观勇敢坚强的老彭1 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
a1117762 小时前
中文优先的企业 RAG 知识库 开源项目
开发语言·开源·kotlin
2301_777998342 小时前
C/C++:预处理详解
c语言·c++