• Home
  • About
    • back
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • back
    • All Posts
    • All Tags
  • Projects

[013] OpenCV 영상처리 블러링

16 Jan 2020

Reading time ~3 minutes

Table of Contents
  • 목차
  • 블러링 Blurring
    • 함수 원형
      • C++
      • python
    • 평균 블러링 Averaging Blurring
      • C++
      • python
    • 가우시안 블러링 Gaussian Blurring
      • 함수 원형
      • C++
      • Python
    • 중간값 블러링 Median Blurring
      • 함수 원형
      • C++
      • Python
    • 양방향 필터링 Bilateral Filtering
      • C++
      • Python

목차

  • 블러링 Blurring
    • 함수 원형
      • C++
      • python
    • 평균 블러링 Averaging Blurring
      • C++
      • python
    • 가우시안 블러링 Gaussian Blurring
      • 함수 원형
      • C++
      • Python
    • 중간값 블러링 Median Blurring
      • 함수 원형
      • C++
      • Python
    • 양방향 필터링 Bilateral Filtering
      • C++
      • Python

블러링 Blurring

이미지에서 노이즈를 제거하기 위해 사용.
노이즈가 사라지면서 동시에 이미지가 흐려짐
OpenCV에서는 컨볼루션을 쉽게 할 수있도록 filter2D함수를 제공
커널만 정의해주면 쉽게 컨볼루션 계산 가능.

image

image

여기서 커널은 입력 이미지의 현재 위치에서 5 × 5 범위의 주변 픽셀값의 평균을 구해서 결과 이미지의 픽셀값으로 입력.

마스크의 중앙 픽셀인 e에 저장 되는 것이 평균필터 즉, “커널”

  • Mat(5, 5, CV_32F, Scalar(1/25.0));
  • np.ones((5,5),np.float32)/25
    image

[ex]

image

  • Mat(3, 3, CV_32F, Scalar(1/9.0));
  • np.ones((3,3),np.float32)/9 이게 더 선명하다
    즉 값이 클수록 더 흐릿 image

실행 결과 다음처럼 이미지가 흐려

함수 원형

filter2D( src, dst, ddepth, kernel, Point anchor, delta, borderType)

  • src : 입력할 이미지 변수
  • dst : 필터가 적용되어 저장될 이미지 변수
  • ddepth : 저장될 이미지의 깊이 기본 값 : -1 / 건드릴 필요 없음
  • kernel : 이미지에 적용할 필터의 마스크와 연산 정보를 담고있는 행렬
    • 자신이 직접 평균필터 적용할 마스크와 연산식을 입력해야 함
  • Point anchor : 건드릴 필요 없음 기본값 Point(-1, -1) 사용
  • delta : 건드릴 필요 없음 기본값 (0,0) 사용
  • border Type : 이미지 테두리 밖의 필셀 처리방법
    • zero padding 또는 reflect(mirror) padding 을 적용할 수 있음
    • BORDER_CONSTANT 또는 0
    • BORDER_REPLICATE 또는 1
    • BORDER_REFLECT 또는 2
    • BORDER_DEFAULT 또는 4
    • BORDER_REFLECT101 또는 4
    • BORDER_TRANSPARENT 또는 5
    • BORDER_ISOLATED 또는 16

C++

# include < opencv2/opencv.hpp>

using namespace cv;

int main()
{
  Mat img;
  img = imread("test.png");
  
  Mat kernel = Mat(5, 5, CV_32F, Scalar(1/25.0));

  Mat dst;
  filter2D(img, dst, - 1, kernel);

  imshow("Original", img);
  imshow("Result", dst);
  waitKey(0);
}

python

import numpy as np 
import cv2

img = cv2.imread('cat.png') 
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img, - 1, kernel)

cv2.imshow('Original', img) 
cv2.imshow('Result', dst)

cv2.waitKey(0) 
cv2.destroyAllWindows()

평균 블러링 Averaging Blurring

커널을 만들어서 컨볼루션하는 번거로움을 줄이기 위해 OpenCV에서는 평균 블러링하는 함수 blur을 제공

img_blur = cv2.blur (img,(5,5)

실행 결과는 위와 동일

C++

# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{ 
Mat img;
img = imread("test.png");

Mat img_blur;
blur(img, img_blur, Size(5,5));

imshow("Original", img);
imshow("Result", img_blur);
waitKey(0);
}

python

import cv2
img = cv2.imread('test.png') 
img_blur = cv2.blur(img,(5,5))

cv2.imshow('Original', img) 
cv2.imshow('Result', img_blur)

cv2.waitKey(0) 
cv2.destroyAllWindows()

가우시안 블러링 Gaussian Blurring

평균 블러링

  • 모든 픽셀에 똑같은 가중치를 부여
  • 에지 포함해서 전체적으로 이미지가 흐림

가우시안 블러링

  • 마스크 중심에 있는 원소에 높은 가중치를 부여합니다.
  • GaussianBlur함수를 제공
  • 대상 픽셀에 가까울수록 많은 영향을 주고, 멀어질수록 적은 영향을 줌
  • 원래의 영상과 비슷하면서도 노이즈를 제거하는 효과가 있음
  • 보통 에지 검출 전 노이즈를 제거하기 위해 사용

(가우시안 분포) image (가우시안 블러링) image

image

함수 원형

cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType) 커널 크기와 표준 편차를 전달하면 가우시안 블러링을 적용해줌

  • src: 입력 영상
  • ksize: 커널 크기 (주로 홀수)
  • sigmaX: X 방향 표준편차 (0: auto)
  • sigmaY(optional): Y 방향 표준편차 (default: sigmaX)
  • borderType(optional): 외곽 테두리 보정 방식

ret = cv2.getGaussianKernel(ksize, sigma, ktype) 커널 크기와 표준 편차를 전달하면 가우시안 필터를 반환

  • ret: 가우시안 커널 (1차원이므로 ret * ret.T 형태로 사용해야 함)
  • 반환된 필터는 1차원

C++

# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img;
img = imread("test.png");

Mat img_blur;
GaussianBlur(img, img_blur, Size(5,5), 0);

imshow("Original", img);
imshow("Result", img_blur);
waitKey(0);
}

Python

import cv2
img = cv2.imread('test.png') 
img_blur = cv2.GaussianBlur(img,(5,5),0)

cv2.imshow('Original', img) 
cv2.imshow('Result', img_blur)
cv2.waitKey(0) 
cv2.destroyAllWindows()

중간값 블러링 Median Blurring

중간값 블러링은 관심 화소 주변으로 지정한 커널 크기 (5 × 5) 내의 픽셀을 크기순으로 정렬한 후 중간 값을 뽑아서 결과 이미지의 픽셀값으로 사용
무작위 노이즈를 제거하는데 효과적
하지만 에지가 있는 이미지의 경우에는 결과 이미지 에서 에지가 사라질 수 있음

image

함수 원형

dst = cv2.medianBlur(src, ksize)

  • src: 입력 영상
  • ksize: 커널 크기

C++

# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img;
img = imread("median.png");
Mat img_blur;
medianBlur(img, img_blur, 5);
imshow("Original", img);
imshow("Result", img_blur);
waitKey(0);
}

Python

import cv2
img = cv2.imread('median.png') 
median = cv2.medianBlur(img, 5)

cv2.imshow('Original', img) 
cv2.imshow('Result', median)
cv2.waitKey(0) cv2.destroyAllWindows()


양방향 필터링 Bilateral Filtering

에지를 보존하면서 노이즈를 감소시킬수 있는 방법
이미지에서 질감이 있는 부분만 블러링되고 에지 부분은 보존

image

C++

# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img;
img = imread("book.png");

Mat img_blur;
bilateralFilter(img, img_blur, 9,75,75);

imshow("Original", img);
imshow("Result", img_blur);

waitKey(0);
}

Python

import cv2
img = cv2.imread('book.png') 
blur = cv2.bilateralFilter(img,9,75,75)

cv2.imshow('Original', img) 
cv2.imshow('Result', blur)

cv2.waitKey(0) 
cv2.destroyAllWindows()


OpenCV Share Tweet +1