영상의 필터링&블러링

전종원·2022년 10월 19일
0

1. 필터링 개요

필터링이란?

영상에서 필요한 정보만 통과시키고 원치않는 정보는 걸러내는 작업

주파수 공간에서의 필터링

  • 푸리에 변환을 이용하여 영상을 주파수 공간으로 변환하여 필터링을 수행하는 방법

공간적 필터링

  • 영상의 픽셀값을 직접 이용하는 필터링 방법

  • 주로 마스크 연산을 이용
    -OpenCV에서는 공간적 필터링 마스크 크기가 커질 경우 주파수 공간에서의 필터링을 수행함.

  • 사용되는 마스크는 다양한 크기와 모양을 지정할 수 있지만, 대부분 3x3 정방향 필터를 사용한다.

  • 최외곽 픽셀들의 컨볼루션 연산은 가사으이 픽셀들이 있다고 가정하고 진행됨. 대칭되는 픽셀값으로 가정

void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, 
					int borderType, const Scalr& value = Scalar());
  • src: 입력영상
  • dst: 출력영상 Size(src.cols+left+right, src.rows+top+bottom)
  • top: 윗쪽 확장 크기
  • bottom: 아래쪽 확장 크기
  • left: 왼쪽 확장 크기
  • right: 오른쪽 확장 크기
  • boarderType: 가장자리 픽셀 확장 방법.
  • value: boarderType이 BORDER_CONSTANT인 경우 사용할 값

기본적인 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와 같은 깊이를 사용
  • kernel: 필터 마스크 행렬. 1채널 실수형.
  • anchor: 고정점 위치. (-1, -1)이면 필터 중앙을 고정점으로 사용.
  • delta: 추가적으로 더할 값
  • borderType: 가장자리 픽셀 처리 방법

2. 엠보싱 필터

엠보싱이란

  • 직물이나 종이, 금속판 등에 올록볼록한 형태로 만든 객체의 윤곽 또는 무늬.
  • 엠보싱 필터는 입력영상을 엠보싱 느낌이 나도록 변환하는 필터
  • 결과를 효과적으로 보여주기 위해 결과 영상에 128을 더해서 보여줌

실습코드

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

	if (src.empty()) {
		cerr << "Image laod failed!" << endl;
		return -1;
	}

	float data[] = {
		-1, -1, 0,
		-1, 0, 1,
		0, 1, 1
	};
	Mat kernel(3, 3, CV_32FC1, data);

	Mat dst;
	filter2D(src, dst, -1, kernel, Point(-1, -1), 125);

	imshow("src", src);
	imshow("dst", dst);
	waitKey();
}

결과 영상

3. 블러링(평균값 필터)

  • 영상의 특정 좌표값을 주변 픽셀 값들의 산술평균으로 설정
  • 픽셀들 간의 그레이스케일 값 변화가 줄어들어 날카로운 엣지가 무뎌지고, 영상에 있는 잡음의 영향이 사라지는 효과

실습코드

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

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}

	imshow("src", src);

	Mat dst;
	for (int ksize = 3; ksize <= 7; ksize += 2) {
		blur(src, dst, Size(ksize, ksize));

		String desc = format("Mean: %dx%d", ksize, ksize);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, 
			Scalar(255), 1, LINE_AA);

		imshow("dst", dst);
		waitKey();
	}

	return 0;
}

결과영상

0개의 댓글