[Opencv] Median Filter 구현

김모씨·2023년 5월 30일
0

image processing

목록 보기
1/3

Median filtering 을 구현해봤다.

실행과정은 다음과 같다.

  1. 첨부된 영상을 imread 함수를 이용하여 흑백으로 읽어드린다.
  2. Median filtering을 수행하기 위한 함수를 만든다.
  3. 함수의 결과로 얻은 결과 image를 imshow 한다.
//
//  main.cpp
//  m2ntae
//
//  Created by 김민태
//

#include <iostream>
#include <array>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;


void MyMedianFilter(InputArray input, OutputArray &output, int windowSize) {
    
    Mat input_ = input.getMat();
   Mat output_ = output.getMat();
    
     int ww = (windowSize - 1) / 2;
     int wh = (windowSize - 1) / 2;
     Mat Newsrc;
     copyMakeBorder(input, Newsrc, ww, ww, wh, wh, BORDER_REFLECT_101);
    
     output_ = Mat::zeros(input_.rows, input_.cols, input_.type());
     

     for (int i = 0; i < input_.rows; i++)
     {
    
         for (int j = 0; j < input_.cols; j++)
         {
    
             double valueSum = 0.0;
             #define SIZE 256
             int iVec[SIZE];
             for (int k = 0; k < ww*2+1; k++)
             {
    
                 for (int z = 0; z < wh*2+1; z++)
                 {
    
                     int srcValue = (int)Newsrc.at<uchar>(i + k, j + z);
                     valueSum += srcValue;
                     iVec[z+k] = srcValue;
                 }
             }
        
             int iSize = ww*2+1 + wh*2+1;
             for(int h = 0; h < iSize;h++)
             {
                 for(int w = 1; w < iSize - h; w++)
                 {
    
                     int temp =  iVec[w-1];
                     if(iVec[w-1]>iVec[w])
                     {
                         iVec[w-1] = iVec[w];
                         iVec[w] = temp;
                     }
                 }
             }

             int iValue = iSize % 2 == 0 ? (iVec[iSize/2]+iVec[iSize/2-1])/2 : iVec[iSize/2];
          output_.at<uchar>(i, j) = (uchar)iValue;
         }
     }

 }




int main()
{
    Mat img = imread ("/Users/liupei/desktop/ty04.jpeg", 0);
    
    Mat out1 = img.clone();
    
    MyMedianFilter(img, out1,5);
    imshow("Image", img);
    imshow("MedianFilter",out1);

    waitKey();
    return 0;
}
profile
아주대학교 디지털미디어학과 & 소프트웨어학과(재학 중)

0개의 댓글