본문 바로가기
Open CV

opencv c++ 블러링필터 적용하기 - 평균화, 가우시안 필터

by 빈이쥬 2023. 1. 13.

블러링필터

이미지의 노이즈나 디테일을 줄이는 데 사용되는 이미지 처리 기술로, 결과적으로 이미지가 매끄럽거나 흐려진다.

OpenCV에서 사용할 수 있는 블러링 필터는 다음과 같다.

  • 평균화 필터: 정사각형 커널을 사용하여 창에 있는 픽셀의 평균값을 계산하고 중앙 픽셀을 계산된 평균값으로 바꾼다
  • 가우시안 필터: 가우시안 커널(종 모양 곡선)을 사용하여 창에 있는 픽셀의 가중 평균을 계산하고 중앙 픽셀을 계산된 평균값으로 바꾼다
  • 중앙값 필터: 필터는 중앙 픽셀을 창에 있는 픽셀의 중앙값으로 바꾼다
  • 양방향 필터: 필터는 가우시안 필터와 유사하지만 중앙 픽셀과 주변 픽셀 간의 픽셀 강도 차이도 고려하므로 이미지의 가장자리를 보존하는 데 유용할 수 있다.

평균화 필터

각 픽셀의 값을 주변 픽셀의 평균값으로 대체하여 이미지를 매끄럽게 만드는 데 사용되는 일종의 이미지 처리 필터이다. 커널은 일반적으로 3x3 또는 5x5와 같은 작은 크기로 선택되며 이미지의 각 픽셀 위에 배치되며, 커널 내의 픽셀 값을 합산하고 커널의 픽셀 수로 나누어 평균을 계산한다 그런 다음 결과 값이 커널 중앙의 픽셀에 할당된다. 이 과정은 이미지의 모든 픽셀에 대해 반복되어 매끄럽거나 "흐릿한" 이미지를 생성합니다.

 

적용하는 함수는 다음과 같다 

blur(src, dst, ksize, anchor, borderType)

 

  • src – 입력 이미지 독립적으로 처리되는 여러 채널을 가질 수 있지만 깊이는 CV_8U, CV_16U, CV_16S, CV_32F 또는 CV_64F여야 합니다.
  • dst – src와 동일한 크기 및 유형의 출력 이미지.
  • ksize - 블러 커널 사이즈
  • anchor – 앵커 포인트; 기본값 Point(-1,-1)은 앵커가 커널 중심에 있음을 의미합니다.
  • borderType – 아래의 링크를 참조하십시오 .https://docs.opencv.org/4.7.0/d2/de8/group__core__array.html#ga209f2f4869e304c82d07739337eae7c5

소스 코드

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    
    string url = "http://192.168.0.123";
    
    // Open the default camera
    VideoCapture cap(url);

    // Check if the camera is opened
    if(!cap.isOpened())
    {
        cout << "Error opening camera" << endl;
        return -1;
    }
 
    // Capture frames from the camera in a loop
    while(true)
    {
        // Capture a frame
        Mat frame;
        cap >> frame;

        // Check if the frame is empty
        if(frame.empty())
        {
            cout << "Empty frame" << endl;
           break;
        }
 
        Mat Frame1;
        Size size1(3,3); //kerner size;
        blur(frame, Frame1, size1);
        
        Mat Frame2;
        Size size2(5,5); //kerner size;
        blur(frame, Frame2, size2);
        
        Mat Frame3;
        Size size3(7,7); //kerner size;
        blur(frame, Frame3, size3);
        
        // Display the frame
        imshow("Frame", frame);
        imshow("Frame1", Frame1);
        imshow("Frame2", Frame2);
        imshow("Frame3", Frame3);
        // Press 'q' to exit the loop
        if(waitKey(1) == 'q')
        {
            break;
        }
    }

    // Release the camera
    cap.release();

    return 0;
}

 

출력

왼쪽위부터 필터전(frame) 3x3(frame1) 5x5(frame2) 7x7(frame3)이다.

커널 사이즈가 커질수록 점점 흐릿해 지는것을 확인할 수 있다.

 

 

가우시안 필터

가우시안 필터는 각 픽셀의 값을 주변 픽셀의 가중 평균으로 대체하여 이미지를 매끄럽게 만드는 데 사용되는 이미지 처리 필터 유형이다.

사용하는 함수는 가우시안 함수로 종 모양의 곡선으로 중심에 있는 픽셀에 더 많은 가중치를 부여하고 가장자리에 있는 픽셀에 더 적은 가중치를 부여합니다.(중앙값만 도드라지게 함)

그 결과 평균화 필터와 유사한 스무딩 효과가 발생하지만 보다 자연스러운 "흐리게" 보이는 효과가 있다.

가우시안 필터는 이미지를 흐리게 하여 이미지에서 노이즈와 디테일을 제거하는 저역 통과 필터이다. 에지를 보존하면서 잡음을 줄일 수 있기 때문에 평균화 필터보다 더 효과적이다.

 

적용하는 함수는 다음과 같다.

GaussianBlur(src, dst, ksize, sigmaX, sigmaY, borderType)
  • src – 입력 이미지 독립적으로 처리되는 여러 채널을 가질 수 있지만 깊이는 CV_8U, CV_16U, CV_16S, CV_32F 또는 CV_64F여야 합니다.
  • dst – src와 동일한 크기 및 유형의 출력 이미지.
  • ksize - 가우스 커널 크기 (0,0)을 지정하면 sigma값에 의해 자동 결정됨, whith, height 값이 다를수 있지만 홀수이며 양수여야함.
  • sigmaX – x 방향의 sigma ( 가우스 표준편차) 
  • sigmaY - y 방향의 sigma ( 가우스 표준편차) 0일때 x와 같음 x y 모두 0일경우 ksize에 계산됨
  • borderType – 아래의 링크를 참조하십시오 .https://docs.opencv.org/4.7.0/d2/de8/group__core__array.html#ga209f2f4869e304c82d07739337eae7c5
 

OpenCV: Operations on arrays

Divides a multi-channel array into several single-channel arrays. The function cv::split splits a multi-channel array into separate single-channel arrays: If you need to extract a single channel or do some other sophisticated channel permutation, use mixCh

docs.opencv.org

 

소스코드

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    
    string url = "http://192.168.0.123";
    
    // Open the default camera
    VideoCapture cap(url);

    // Check if the camera is opened
    if(!cap.isOpened())
    {
        cout << "Error opening camera" << endl;
        return -1;
    }
 
    // Capture frames from the camera in a loop
    while(true)
    {
        // Capture a frame
        Mat frame;
        cap >> frame;

        
        // Check if the frame is empty
        if(frame.empty())
        {
            cout << "Empty frame" << endl;
           break;
        }
        
        int ksize = 3;
        double sigma = 1.0;

        // Apply the Gaussian filter
        Mat Gaussian;
        GaussianBlur(frame, Gaussian, Size(ksize, ksize), sigma, sigma);
        
        // Display the frame
        imshow("Frame", frame);
        imshow("Gaussian", Gaussian);
        
        // Press 'q' to exit the loop
        if(waitKey(1) == 'q')
        {
            break;
        }
    }

    // Release the camera
    cap.release();

    return 0;
}

 

출력

'Open CV' 카테고리의 다른 글

opencv c++ Hough 확률적 라인 변환  (1) 2023.01.17
opencv c++ Hough 라인 변환  (0) 2023.01.17
opencv c++ gray scale, HSV scale 적용하기  (0) 2023.01.13
xcode c++ cURL 사용법  (0) 2023.01.13
OPENCV C++ 스트리밍 영상 출력하기  (0) 2023.01.12