【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);
}
相关推荐
leisoo809726 分钟前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
霸道流氓气质29 分钟前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
无名猿35 分钟前
constexpr 能力扩张:从 C++11 到 C++20 的编译期计算
c++·性能优化·现代c++·编译期
007张三丰35 分钟前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
weixin_4196583144 分钟前
CANoe 使用指南:从输出窗口到数据回放的完整实战教程
开发语言·功能测试·车载系统·自动化·汽车
当青春邂逅吉米多维奇1 小时前
C#图解教程(第5版) 同步方法
开发语言·c#
骇客野人1 小时前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质1 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
波力海苔夹心脆6751 小时前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net