// assign1_medianFiltering.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include <iostream>
#include <algorithm>
#include <opencv2/highgui.hpp>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
using namespace std;
void myMedianFilter(InputArray input, OutputArray output, int windowSize) {
//windowSize의 입력이 2n+1의 형태로 들어오므로 반대로 n 찾기
windowSize = (windowSize - 1) / 2;
const Mat& img = input.getMat();
output.create(img.size(), img.type()); //새로운 행렬 생성
Mat dst = output.getMat();
vector<uchar> vec((2*windowSize +1)*(2 * windowSize + 1));
for (int y = 0; y < img.rows; y++) {
for (int x = 0; x < img.cols; x++) {
for (int t = -windowSize; t <= windowSize; t++) {
for (int s = -windowSize; s <= windowSize; s++) {
vec.push_back(img.at<uchar>((y + t), (x + s)));
dst.at<uchar>(y,x) = img.at<uchar>(min(img.rows - 1, max(0, y + t)), min(img.cols - 1, max(0, x + s))); //Padding 조치
}
}
sort(vec.begin(), vec.end());
dst.at<uchar>(y, x) = vec.at(vec.size()/2);
vec.clear();
}
}
}
int main()
{
Mat img = imread("C://Users/User/Desktop/MedianFilterInput.png", 0);
Mat out1, out2;
int windowsize = 5;
myMedianFilter(img, out1, windowsize);
//medianBlur(img, out2, windowsize);
imshow("image", img);
imshow("MedianFilter", out1);
//imshow("medianBlur", out2);
waitKey();
return 0;
}