본문 바로가기
Opencv

Opencv 이미지 전처리2(Sharpness, Rotate, MeasureFocus)

by 연원랑 2022. 6. 15.

Sharpness

- 이미지의 선명도를 높일때 사용합니다. 흐릿한 Kennel을 사용해 이미지를 좀더 거칠게 표현 합니다.

void TestSharpness()
{
	Mat MatImage, OutMat;

	MatImage = cv::imread("test.bmp");//이미지 로드		

	cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));// 커널 생성(모든 값을 0으로 초기화)	
	kernel.at<float>(1, 1) = 5.0; // 커널 값에 할당
	kernel.at<float>(0, 1) = -1.0;
	kernel.at<float>(2, 1) = -1.0;
	kernel.at<float>(1, 0) = -1.0;
	kernel.at<float>(1, 2) = -1.0;

	cv::filter2D(MatImage, OutMat, MatImage.depth(), kernel);

	cv::imshow("MatImage", MatImage);
	cv::imshow("OutMat", OutMat);

	waitKey(0);
}

Rotate

- 이미지 회전을 할때 사용합니다. 이미지의 중심을 기준으로 설정된 각도로 회전 시킵니다.

void TestRotate()
{	
	Mat MatImage, OutRotateMat;
	double dDgree = 45;//회전할 각도
	MatImage = cv::imread("audrey.bmp");//이미지 로드

	Point2f centralPoint((MatImage.cols - 1) / 2.0, (MatImage.rows - 1) / 2.0);//이미지 중심 포인트	
	Mat rotationmatix = getRotationMatrix2D(centralPoint, dDgree, 1.0);
	warpAffine(MatImage, OutRotateMat, rotationmatix, MatImage.size());

	cv::imshow("MatImage", MatImage);
	cv::imshow("OutRotateMat", OutRotateMat);

	waitKey(0);
}

Measure Focus

- 이미지 포커스값을 수치로 계산하는 방식입니다. 좀더 선명한 이미지일수록 높은 값이 나옵니다.

좌측 이미지 계산값은 1392.1  우측 이미지는 45.5

double OCV_FocusMeasure(Mat &src)
{
	Mat dst, src_gray;
	cv::Scalar mean, stddev;

	if (src.channels() == 1)//Mono 면 바로 Laplacian
	{
		cv::Laplacian(src, dst, CV_64F);
	}
	else//RGB 컬러면 Gray로 변경후 Laplacian
	{
		cvtColor(src, src_gray, CV_RGB2GRAY);// Convert the image to grayscale
		cv::Laplacian(src_gray, dst, CV_64F);
	}

	cv::meanStdDev(dst, mean, stddev);
	return stddev.val[0] * stddev.val[0];
}

void TestMeasureFocus()
{
	Mat MatImage1, MatImage2;
	double dFocus1, dFocus2;
	CString szFocus1, szFocus2;

	MatImage1 = cv::imread("test1.bmp");//이미지 로드
	MatImage2 = cv::imread("test2.bmp");//이미지 로드

	dFocus1 = OCV_FocusMeasure(MatImage1);
	szFocus1.Format("MatImage1(%.1f)", dFocus1);

	dFocus2 = OCV_FocusMeasure(MatImage2);	
	szFocus2.Format("MatImage2(%.1f)", dFocus2);

	cv::imshow(szFocus1.GetBuffer(), MatImage1);
	cv::imshow(szFocus2.GetBuffer(), MatImage2);

	waitKey(0);
}

댓글