가우시안 필터 구현 - gausian pilteo guhyeon

이번 문제의 경우 수업시간에 교수님께서 해결하는 방법을 모두 가르쳐 주셔서 큰 어려움 없이 할 수 있었다. 그냥 mask를 구하고 계산한 뒤 값을 복사하는 작업과 마지막에 계산되지 않는 부분을 0으로 변경하는 것만 잘 하면 쉽게 해결할 수 있는 문제였던 것 같다. 주어진 이미지 말고 여러 가지 이미지에 추가적으로 더 적용 시켜보아야겠다.
  • 평균값 필터에 의한 블러링의 단점
    • 필터링 대상 위치에서 가까이 있는 픽셀과 멀리 있는 픽셀이 모두 같은 가중치를 사용하여 평균을 계산
    • 멀리 있는 픽셀의 영향을 많이 받을 수 있음
가우시안 필터 구현 - gausian pilteo guhyeon
  • (1차원) 가우시안 함수 (Gaussian function)
가우시안 필터 구현 - gausian pilteo guhyeon

가우시안 필터 구현 - gausian pilteo guhyeon
가우시안 필터 구현 - gausian pilteo guhyeon

가우시안 필터 구현 - gausian pilteo guhyeon
cv2.GaussianBlur(src,ksize,sigmaX,dst=None,sigmaY=None,borderType=None) -> dst

 • src : 입력 영상 . 각 채널 별로 처리됨
 • dst : 출력 영상 . src 와 같은 크기 , 같은 타입
 • ksize : 가우시안 커널 크기 . (0,0) 을 지정하면 sigma 값에 의해 자동 결정됨
 • sigmaX : x 방향 sigma.
 • sigmaY : y 방향 sigma. 0 이면 sigmaX 와 같게 설정
 • borderType: 가장자리 픽셀 확장 방식

  • 다양한 크기의 sigma를 사용한 가우시안 필터링
import sys
import numpy as np
import cv2


src = cv2.imread('rose.bmp', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

cv2.imshow('src', src)

for sigma in range(1, 6):
    # sigma 값을 이용하여 가우시안 필터링
    dst = cv2.GaussianBlur(src, (0, 0), sigma)

    desc = 'sigma = {}'.format(sigma)
    cv2.putText(dst, desc, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                1.0, 255, 1, cv2.LINE_AA)

    cv2.imshow('dst', dst)
    cv2.waitKey()

cv2.destroyAllWindows()
가우시안 필터 구현 - gausian pilteo guhyeon
1차원 가우시안 필터, c++ 가우시안 필터, c++프로그래밍, C++프로그램, Gaussian, opencv 가우시안 필터, 가우시안, 가우시안 스무딩, 가우시안 필터 공식, 가우시안 필터 마스크, 가우시안 필터 소스, 가우시안 필터 시그마, 가우시안 필터 원리, 가우시안 필터 정의, 가우시안 필터란, 보정, 알고리즘, 알고리즘소스, 영상처리, 필터

%gaussian filter rad = floor(5 / 2); [a, b] = meshgrid(-rad:rad, -rad:rad); sigma = 2; kernel = (1/(2*pi*(sigma.^2)))*exp(-1 * (a.^2 + b.^2)./ (2*sigma*sigma) ); kernel = kernel / sum(kernel(:)); %합계가 1이 되도록 환산함

이 행렬을 이제 이미지에 컨볼류션 하면 될 것이다.

가우시안 필터 구현 - gausian pilteo guhyeon

(출처 : https://www.imageeprocessing.com/2015/11/convolution-in-matlab.html)

이미지 컨볼루션은 위와 같다. 설명이 깔끔하게 되어있어서 가져왔다.

쉽게 설명하자면 우리가 만든 5*5행렬을 이미지에 맞춰 해당 픽셀 주위 5*5만큼 곱한 후 다시 해당 픽셀에 집어넣는 과정이다.

컨볼루션 하기 전에, 이미지에 적절히 노이즈를 첨부한다.

첨부하는 이유는 가우시안 필터링을 적용할 때 노이즈가 어느정도 지워졌는지 확인하기 위해서이다.

이미지를 로드하고, 노이즈를 첨부하는 코드는 다음과 같다.

%load image image = (imread('wtf.png')); image = rgb2gray(image); [x, y] = size(image); %noise image noise_value = 30; noise = randn([x,y]) * noise_value; noised_image = uint8(double(image) + 0.5 * noise);

이제 noised_image에 컨볼루션을 적용한다.

두가지의 방법이 있는데 그중 한개는 conv2함수를 이용하는 것이다,

filtered = conv2(noised_image, z, 'same');

그냥 이렇게 하면 noised image에 가우시안함수 z를 컨볼루션해 자동으로 filtered image에 들어간다.

하지만 for문으로 직접 연산을 해 집어넣으려면,

for i = 1 : x - (size - 1) for j = 1 : y - (size - 1) temp = (double(noised_image(i : i + (size - 1), j : j + (size - 1)))).*z; filtered(i,j) = sum(temp(:)); end end

이렇게 코드를 작성하면 각 픽셀마다 컨볼루션을 적용하여 들어갈 것이다.

이렇게 해서 만들어진 전체 코드는

clear %% load image image = (imread('lena.png')); image = rgb2gray(image); % image = image(:,:,1); [x, y] = size(image); rad = floor(5 / 2); %% noise image noise_value = 30; noise = randn([x,y]) * noise_value; noised_image = (double(image) + 0.5 * noise); %% gaussian filter [a, b] = meshgrid(-rad:rad, -rad:rad); sigma = 2; kernel = (1/(2*pi*(sigma.^2)))*exp(-1 * (a.^2 + b.^2)./ (2*sigma*sigma) ); kernel = kernel / sum(kernel(:)); noised_image = double(noised_image); gaussian_filtered = conv2(noised_image, kernel, 'same'); %% output subplot(1,3,1); imshow(image); title('raw'); subplot(1,3,2); imshow(uint8(noised_image)); title('noised'); subplot(1,3,3); imshow(uint8(gaussian_filtered)); title('gaussian');