목차
블러링 Blurring
이미지에서 노이즈를 제거하기 위해 사용.
노이즈가 사라지면서 동시에 이미지가 흐려짐
OpenCV에서는 컨볼루션을 쉽게 할 수있도록 filter2D
함수를 제공
커널만 정의해주면 쉽게 컨볼루션 계산 가능.
여기서 커널은 입력 이미지의 현재 위치에서 5 × 5 범위의 주변 픽셀값의 평균을 구해서 결과 이미지의 픽셀값으로 입력.
마스크의 중앙 픽셀인 e에 저장 되는 것이 평균필터 즉, “커널”
Mat(5, 5, CV_32F, Scalar(1/25.0));
np.ones((5,5),np.float32)/25
[ex]
Mat(3, 3, CV_32F, Scalar(1/9.0));
np.ones((3,3),np.float32)/9
이게 더 선명하다
즉 값이 클수록 더 흐릿
실행 결과 다음처럼 이미지가 흐려
함수 원형
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함수
를 제공- 대상 픽셀에 가까울수록 많은 영향을 주고, 멀어질수록 적은 영향을 줌
- 원래의 영상과 비슷하면서도 노이즈를 제거하는 효과가 있음
- 보통 에지 검출 전 노이즈를 제거하기 위해 사용
(가우시안 분포) (가우시안 블러링)
함수 원형
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) 내의 픽셀을 크기순으로 정렬한 후 중간 값을 뽑아서 결과 이미지의 픽셀값으로 사용
무작위 노이즈를 제거하는데 효과적
하지만 에지가 있는 이미지의 경우에는 결과 이미지 에서 에지가 사라질 수 있음
함수 원형
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
에지를 보존하면서 노이즈를 감소시킬수 있는 방법
이미지에서 질감이 있는 부분만 블러링되고 에지 부분은 보존
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()