OpenCV 필터링 관련 기능들

Lily·2023년 10월 23일
0

TIL

목록 보기
8/21

공간적 필터링

2D 필터링 함수

void filter2D(InputArray src, OutputArray dst, 
			  int ddepth, InputArray kernel, 
              Point anchor=Point(-1,-1), double delta=0, 
              int borderType=BORDER_DEFAULT);
  • src: 입력 영상
  • dst: 출력 영상
  • ddepth: 원하는 결과 영상의 깊이를 지정. -1이면 src와 같은 깊이를 사용
    • 필터링 1번이 아니라, 여러번의 연산을 순차적으로 수행하고 싶을 경우 실수 값을 저장해서 가공할 수 있음
Input depth (src.depth())Output depth (ddepth)
CV_8U-1 / CV_16S / CV_32F / CV_64F
CV_16U / CV_16S-1 / CV_32F / CV_64F
CV_32F-1 / CV_32F / CV_64F
CV_64F-1 / CV_64F
  • kernel: 필터 마스크 행렬. 1채널 실수형.
  • anchor: 고정점 위치. (-1,-1)이면 필터 중앙을 고정점으로 사용.
  • delta: (optional) 추가적으로 더할 값
  • borderType: 가장자리 픽셀 처리 방법

\\
\\

블러링

평균 값 필터를 이용한 블러링 함수

  • 평균 값 필터(mean filter)
    • 영상에 평균 값 필터를 적용하면 인접한 픽셀 간의 급격한 그레이스케일 값 변화가 줄어들어, 날카로운 에지가 무뎌지고 영상에 있는 잡음이 감소하는 효과
    • 마스크의 크기(3x3 -> 5x5)가 커질수록 평균 값 필터 결과가 더욱 부드러워짐 -> 더 많은 연산량 필요
    • 단점: 같은 가중치를 사용하기 때문에 현재 위치의 픽셀값의 비중은 줄어들고, 상대적으로 멀리 떨어져 있는 픽셀들의 영향이 커짐
void blur(InputArray src, OutputArray dst, Size ksize,
		  Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT);
  • src: 입력 영상
  • dst: 출력 영상
  • ksize: 평균값 필터 크기
  • anchor: 고정점
  • borderType: 가장자리 픽셀 확장 방식

kernel=1kernel.width×kernel.height×ones(kernel.width×kernel.height)kernel = \frac {1}{kernel.width \times kernel.height} \times ones(kernel.width \times kernel.height)

가우시안 필터를 통한 블러링

void GaussianBlur(InputArray src, OutputArray dst, Size ksize,
				  double sigmaX, double sigmaY=0,
                  int borderType=BORDER_DEFAULT);
  • src: 입력 영상. 각 채널 별로 처리됨. (CV_8U, CV_16U, CV_16S, CV_32F, CV_64F)
  • dst: 출력 영상. src와 같은 크기, 같은 타입
  • ksize: 가우시안 필터 크기. Size()를 지정하면 sigma 값에 의해 자동 결정됨.
  • sigmaX: x 방향으로의 표준편차 sigma, 값이 크면 많이 blurring, 값이 작으면 적게 blurring 됨
  • sigmaY: y 방향으로의 표준편차 sigma. 0이면 sigmaX와 같게 설정.
  • borderType: 가장자리 픽셀 확장 방식

\\
\\

샤프닝

언샤프 마스크(unsharp mask) 필터링

  • 날카롭지 않은(unsharp) 영상, 즉, 블러링된 영상을 이용하여 날카로운 영상을 생성

1) f(x)f(x): original signal
2) fˉ(x)\bar{f}(x): blurred signal
3) g(x)=f(x)fˉ(x)g(x) = f(x) - \bar{f}(x)
4) h(x)=f(x)+g(x)=2f(x)fˉ(x)h(x) = f(x) + g(x) = 2f(x) - \bar{f}(x)

blur 함수를 활용한 코드 구현

Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
// src = {0,0,0,0,1,0,0,0,0};

Mat blr;
blur(src, blr, Size(3,3));
// src = {1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9};

Mat dst = 2 * src - blr;
// {0,0,0,0,2,0,0,0,0} - {1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9};

GaussianBlur 함수를 사용

int main(void)
{
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);

	Mat blr;
	GaussianBlur(src, blr, Size(3,3));

	Mat dst = 2 * src - blr;
}
  • Sharpness 조절을 위한 가중치 : α\alpha
  • α\alpha를 크게 하면 날카로운 성분을 강조하고, 작게 하면 날카로운 성분을 약하게 만드는 가중치를 줌 (1을 기준으로 작고 커짐)

h(x,y)=f(x,y)+αg(x,y)h(x,y) = f(x,y) + \alpha * g(x,y)
h(x,y)=f(x,y)+α(f(x,y)fˉ(x,y))h(x,y) = f(x,y) + \alpha (f(x,y) - \bar{f}(x,y))
h(x,y)=(1+α)f(x,y)αfˉ(x,y)h(x,y) = (1+\alpha)f(x,y)-\alpha \bar{f}(x,y)
따라서,
h(x,y)=(1+α)f(x,y)αGσf(x,y)h(x,y) = (1+\alpha)f(x,y)-\alpha G_{\sigma}f(x,y)

\\
\\

잡음 제거 필터

  • 잡음의 종류:
    • Salt & peper 노이즈
    • Gaussian 노이즈

잡음 추가할 때 사용되는 randn 함수

void randn(InputOutputArray dst, InputArray mean, InputArray stddev);
  • dst: 정상 분포 난수 행렬, dst는 미리 생성되어 있어야 하며, 1~4 채널을 가질 수 있음
  • mean: 평균
  • stddev: 표준편차
  • 참고사항:
    • 생성된 난수는 dst 타입에 맞게 자동 변환됨
    • 만약 dstuchar 자료형을 사용하면 0보다 작은 난수는 모두 0으로 설정됨
    • 균일분포 난수를 발생하려면 randu() 함수를 사용

잡음 추가 함수 사용 예

int main(void)
{
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);

	// src type = CV_32S == signed int
	Mat noise(src.size(), CV_32S);
	randn(noise, 0, 10);

	Mat dst;
    // dst type = CV_8U 로 변환
	add(src, noise, dst, noArray(), CV_8U);
	...
}

프로파일을 이용한 잡음 분석

  • 프로파일(profile):
    • 영상에서 특정 경로(라인 또는 곡선) 상에 있는 픽셀의 밝기 값을 그래프 형태로 나타낸 것
    • Line profile, intensity profile

양방향 필터(bilateral filter)

  • 에지 보전 잡음 제거 필터(edge-preserving noise removal filter)의 하나
  • 평균 값 필터 또는 가우시안 필터는 에지 부근에서도 픽셀 값을 평탄하게 만드는 단점이 있음
  • 기준 픽셀과 이웃 픽셀과의 거리, 그리고 픽셀 값의 차이를 함께 고려하여 블러링 정도를 조절
  • 기본 가우시안 필터에 비해 연산 속도가 느려질 수 있음

    BF[I]p=1WpqSGσs(pq)Gσr(IpIq)IqBF[I]_{p} = \frac{\displaystyle 1}{\displaystyle W_{p}} \sum_{q\in S} G_{\sigma_{s}} \bigl(||p-q|| \bigr) G_{\sigma_{r}} \bigl( |I_{p} - I_{q}| \bigr) I_{q}

  • p,qp, q: p 점과 q 점의 픽셀 좌표(벡터)
  • Ip,IqI_{p}, I_{q}: p 점과 q 점에서 픽셀값
  • WpW_{p}: 필터 커널 합이 1이 되도록 만드는 정규화 상수

양방향 필터 함수 bilateralFilter

void bilateralFilter(InputOutputArray src, OutputArray dst, 
	 int d, double sigmaColor, double sigmaSpace,
     int borderType=BORDER_DEFAULT);
  • src: 입력 영상. 8비트 또는 실수형, 1채널 또는 3채널
  • dst: 출력 영상. src와 같은 크기, 같은 타입
  • d: 필터링에 사용될 이웃 픽셀의 거리(지름). 음수(-1)를 입력할 경우 sigmaSpace 값에 의해 자동 결정됨
  • sigmaColor: 색 공간에서 필터의 표준 편차, 픽셀 값 차이가 얼마 이하일 때만 블러링을 하고 픽셀 값 차이가 얼마 이상일 때는 블러링을 수행하지 않음
  • sigmaSpace: 좌표 공간에서 필터의 표준 편차, 가우시안 블러에서의 시그마 값과 비슷한 개념
  • borderType: 가장자리 픽셀 확장 방식

\\
\\

References

profile
First Attempt In Learning

0개의 댓글