[Computer Vision] Filtering

Filtering

 

실습1 Disoolve 구현

두 개의 파일을 읽고, 아래 수식의 디졸브를 구현합니다. a = 0.3, a = 0.7일 때를 각각 저장하세요.

 

실습1 정답

#include "opencv2/opencv.hpp"
#include <iostream>


int main(void)
{
	cv::Mat src1, src2, dissolve3, dissolve7;
	src1 = cv::imread("cat.bmp"); // cat.bmp
	src2 = cv::imread("tibetfox.bmp"); // tibetfox.bmp

	src1.copyTo(dissolve3);
	src1.copyTo(dissolve7);

	if (src1.empty() || src2.empty())
	{
		std::cerr << "Image load failed!" << std::endl;
		return -1;
	}

	for (int y = 0; y < src1.rows; y++)
	{
		for (int x = 0; x < src1.cols; x++)
		{
			dissolve3.at<cv::Vec3b>(y, x)[0] = src1.at<cv::Vec3b>(y, x)[0] * 0.7 + src2.at<cv::Vec3b>(y, x)[0] * 0.3;
			dissolve3.at<cv::Vec3b>(y, x)[1] = src1.at<cv::Vec3b>(y, x)[1] * 0.7 + src2.at<cv::Vec3b>(y, x)[1] * 0.3;
			dissolve3.at<cv::Vec3b>(y, x)[2] = src1.at<cv::Vec3b>(y, x)[2] * 0.7 + src2.at<cv::Vec3b>(y, x)[2] * 0.3;
		}
	}

	for (int y = 0; y < src1.rows; y++)
	{
		for (int x = 0; x < src1.cols; x++)
		{
			dissolve7.at<cv::Vec3b>(y, x)[0] = src1.at<cv::Vec3b>(y, x)[0] * 0.3 + src2.at<cv::Vec3b>(y, x)[0] * 0.7;
			dissolve7.at<cv::Vec3b>(y, x)[1] = src1.at<cv::Vec3b>(y, x)[1] * 0.3 + src2.at<cv::Vec3b>(y, x)[1] * 0.7;
			dissolve7.at<cv::Vec3b>(y, x)[2] = src1.at<cv::Vec3b>(y, x)[2] * 0.3 + src2.at<cv::Vec3b>(y, x)[2] * 0.7;
		}
	}

	cv::imshow("Original Image", src1);
	cv::imshow("dissolve_3 Image", dissolve3);
	cv::imwrite("dissolve_3.bmp", dissolve3);
	cv::imshow("dissolve_7 Image", dissolve7);
	cv::imwrite("dissolve_7.bmp", dissolve7);

	cv::waitKey();
	return 0;
}

 

dissolve_3 / dissolve_7

 

실습1 모범답안

결과 이미지에 넣기 전 clip 연산을 넣어주는 부분이 다르다.

 

실습2 Low Pass Filter 구현

주어진 파일을 읽고, Low Pass Filter를 구현하여 적용한 뒤 파일로 저장하세요.

※ 필터를 적용할 때는 Element-wise로 곱하여 구현하고, cv::filter2D를 사용하면 안됨.

 

실습2 정답

#include "opencv2/opencv.hpp"
#include <iostream>

int main(void)
{
	cv::Mat img, result;
	const int FilterSize = 3;
	float sum;
	int ix, iy;
	float Filter[FilterSize][FilterSize] = {
	   {1 / 9.0f, 1 / 9.0f, 1 / 9.0f},
	   {1 / 9.0f, 1 / 9.0f, 1 / 9.0f},
	   {1 / 9.0f, 1 / 9.0f, 1 / 9.0f}
	};

	img = cv::imread("salt_pepper.bmp", cv::IMREAD_GRAYSCALE); // salt_pepper.bmp
	img.copyTo(result);


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

	for (int y = 0; y < img.rows; y++) {
		for (int x = 0; x < img.cols; x++) {
			sum = 0.0;
			for (int dy = -1; dy <= 1; dy++) {
				for (int dx = -1; dx <= 1; dx++) {
					ix = x + dx;
					iy = y + dy;
					if (ix >= 0 && ix < img.cols && iy >= 0 && iy < img.rows) {
						sum += Filter[dy + 1][dx + 1] * img.at<uchar>(iy, ix);
					}
				}
			}
			result.at<uchar>(y, x) = static_cast<uchar>(sum);
		}
	}

	cv::imshow("Original Image", img);
	cv::imshow("salt_pepper_lpf Image", result);
	cv::imwrite("salt_pepper_lpf.bmp", result);

	cv::waitKey();
	return 0;
}

Low pass Filter 결과 이미지

 

실습2 모범답안

 

실습3  High Pass Filter 구현

주어진 파일을 읽고, High Pass Filter를 구현하여 적용한 뒤 파일로 저장하세요.

※ 필터를 적용할 때는 Element-wise로 곱하여 구현하고, cv::filter2D를 사용하면 안 됨..

 

실습3 정답

#include "opencv2/opencv.hpp"
#include <iostream>

int main(void)
{
	cv::Mat img, result;
	const int FilterSize = 3;
	int sum;
	int ix, iy;
	int Filter[FilterSize][FilterSize] = {
	   {-1, -1, -1},
	   {-1, 8, -1},
	   {-1, -1, -1}
	};

	img = cv::imread("tibetfox.bmp", cv::IMREAD_GRAYSCALE); // salt_pepper.bmp
	result = cv::Mat::zeros(img.size(), img.type());

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

	for (int y = 0; y < img.rows; y++)
	{
		for (int x = 0; x < img.cols; x++)
		{
			sum = 0;
			for (int dy = -1; dy <= 1; dy++)
			{
				for (int dx = -1; dx <= 1; dx++)
				{
					ix = x + dx;
					iy = y + dy;
					if (ix >= 0 && ix < img.cols && iy >= 0 && iy < img.rows)
						sum += img.at<uchar>(iy, ix) * Filter[dy + 1][dx + 1];
				}
			}
			result.at<uchar>(y, x) = cv::saturate_cast<uchar>(sum);
		}
	}
	cv::imshow("Original Image", img);
	cv::imshow("tibetfox_hpf Image", result);
	cv::imwrite("tibetfox_hpf.bmp", result);

	cv::waitKey();
	return 0;
}

Origianl Image / High Pass Filter

 

실습3 모범답안

 

'공부 > CV' 카테고리의 다른 글

[Computer Vision] 영상처리 기본 연산  (0) 2024.10.08