상세 컨텐츠

본문 제목

#OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 - 9

Programing/OpenCV

by CouqueD'asse 2022. 6. 13. 15:54

본문

6장 영상의 산술 및 논리 연산

 

6.1 영상의 산술 연산

두 개의 입력 영상에 대하여 다양한 형태의 덧셈 뺄셈 연산을 수행하는 방법

dst(x, y) = src1(x, y) + src2(x, y)

src1과 src2는 입력 영상, dst는 덧셈 연산의 결과 영상

그레이스케일 최댓값인 255보다 커지는 경우가 발생할 수 있어서 결과 영상의 픽셀 값을 255로 설정하는 포화 연산도 함께 수행

dst(x, y) = saturate(src1(x, y) + src2(x, y)) = add() // 덧셈

dst(x, y) = saturate(src1(x, y)*alpha + src2(x, y)*beta + gamma = addweighted() // 가중치 덧셈

 

dst(x, y) = saturate(src1(x, y) - src2(x, y)) = subtract() // 뺄셈

dst(x, y) = |src1(x, y) - src2(x, y)| = absdiff() // 차이 연산

차이 연산 : 뺄셈 연산 결과에 절댓값을 취하는 연산, 차이 연산으로 구한 결과 영상을 차영상이라고 함

int main(void)
{
	Mat src1 = imread("lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("square.bmp", IMREAD_GRAYSCALE);

	if (src1.empty() || src2.empty())
	{
		return -1;
	}
	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst1, dst2, dst3, dst4;

	add(src1, src2, dst1);
	addWeighted(src1, 0.5, src2, 0.5, 0, dst2);
	subtract(src1, src2, dst3);
	absdiff(src1, src2, dst4);

	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);
	imshow("dst4", dst4);

	waitKey();

	return 0;
}

 

6.2 영상의 논리 연산

입력 비트 논리 연산 결과
a b a AND b a OR b a XOR b NOT a
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0
int main(void)
{
	Mat src1 = imread("lenna256.bmp", IMREAD_GRAYSCALE);
	Mat src2 = imread("square.bmp", IMREAD_GRAYSCALE);

	if (src1.empty() || src2.empty())
	{
		return -1;
	}
	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst1, dst2, dst3, dst4;

	bitwise_and(src1, src2, dst1);
	bitwise_or(src1, src2, dst2);
	bitwise_xor(src1, src2, dst3);
	bitwise_not(src1, dst4);

	imshow("dst1", dst1);
	imshow("dst2", dst2);
	imshow("dst3", dst3);
	imshow("dst4", dst4);

	waitKey();

	return 0;
}

 

7장 필터링

 

7.1 영상의 필터링

 

7.1.1 필터링 연산 방법

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

void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point(-1,-1),
		double delta = 0, int borderType = BORDER_DEFAULT);

 

7.1.2 엠보싱 필터링

엠보싱 : 작물이나 종이, 금속판 등에 올록볼록한 형태로 만든 객체의 윤곽 또는 무늬를 뜻함

void filter_embossing()
{
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
	if(src.empty())
	{
		return;
	}
	float data[] = { -1, -1, 0, -1, 0, 1, 0, 1, 1 };
	Mat emboss(3, 3, CV_32FC1, data);

	Mat dst;
	filter2D(src, dst, -1, emboss, Point(-1, -1), 128);

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

	waitKey();
	destroyAllWindows();
}

 

7.2 블러링 : 영상 부드럽게 하기

블러링 : 마치 초접이 맞지 않은 사진처럼 영상을 부드럽게 만드는 필터링 기법 = 스무딩

거친 느낌의 입력 영상을 부드럽게 만드는 용도, 입력 영상에 존재하는 잡음의 영향을 제거하는 전처리 과정으로도 사용

 

7.2.1 평균값 필터

입력 영상에서 특정 픽셀과 주변 픽셀들의 산술 평균을 결과 영상 픽셀 값으로 설정하는 필터

픽셀 값의 급격한 변화가 출어들어 날카로운 에지가 무뎌지고 잡음의 영향이 크게 사라지는 효과

void blurring_mean()
{
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		return;
	}
	imshow("src", src);

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

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

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

	destroyAllWindows();
}

 

7.2.2 가우시안 필터

가우시안 필터 :가우시안 분포 함수를 근사하여 생성한 필터 마스크를 사용하는 필터링 기법

가우시안 분포 : 평균을 중심으로 좌우 대칭의 종 모양을 갖는 확률 분포를 말함 =  정규 분포

void blurring_gaussian()
{
	Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		return;
	}
	imshow("src", src);

	Mat dst;
	for (int sigma = 1; sigma <= 5; sigma++)
	{
		GaussianBlur(src, dst, Size(), (double)sigma);

		String desc = format("sigma = %d", sigma);
		putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255), 1, LINE_AA);
		imshow("dst", dst);
		waitKey();
	}

	destroyAllWindows();
}

관련글 더보기