내가 보려고 만든 블로그

OpenCV에서 컨볼루션을 사용한 이미지 필터링(c++) 본문

OpenCV/c++

OpenCV에서 컨볼루션을 사용한 이미지 필터링(c++)

hjh1023 2024. 6. 13. 20:11
반응형

 

https://learnopencv.com/image-filtering-using-convolution-in-opencv/

main.cpp

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

int main() {
	// read image
	cv::Mat image = cv::imread("Lenna.png");
	if (image.empty()){
		std::cout << "Could not read image" << std::endl;
	}

	// Apply identity filter using kernel
	cv::Mat kernel1 = (cv::Mat_<double>(3,3) << 0, 0, 0, 0, 1, 0, 0, 0, 0);
	cv::Mat identity; 
	cv::filter2D(image, identity, -1 , kernel1, cv::Point(-1, -1), 0, 4);

	// Blurred using kernel
	// Initialize matrix with all ones
	cv::Mat kernel2 = cv::Mat::ones(5,5, CV_64F);
	// Normalize the elements
	kernel2 = kernel2 / 25;
	cv::Mat kernelBlur;
	cv::filter2D(image, kernelBlur, -1 , kernel2, cv::Point(-1, -1), 0, 4);

	// Blurred using OpenCV C++ blur() function
	cv::Mat img_blur;
	cv::blur(image, img_blur, cv::Size(5,5));

	// Performing Gaussian Blur
	cv::Mat gaussian_blur;
	cv::GaussianBlur(image, gaussian_blur, cv::Size(5,5), 0);

	// Apply Median Blur
	cv::Mat median_blurred;
	cv::medianBlur(image, median_blurred, (5,5));


	// Apply sharpening using kernel
	cv::Mat sharp_img;
	cv::Mat kernel3 = (cv::Mat_<double>(3,3) << 0, -1,  0, 
                                   -1,  5, -1, 
                                    0, -1, 0);
	cv::filter2D(image, sharp_img, -1 , kernel3, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);

	// Apply bilateral filtering
	cv::Mat bilateral_filter;
	cv::bilateralFilter(image, bilateral_filter, 9, 75, 75);
	
	// Display Image
	cv::imshow("Original", image);
	cv::imshow("Identity", identity);
	cv::imshow("Kernel blur", kernelBlur);
	cv::imshow("Blurred", img_blur);
	cv::imshow("Gaussian Blurred", gaussian_blur);
	cv::imwrite("median_blur.jpg", median_blurred);
	cv::imwrite("sharp_image.jpg", sharp_img);
	cv::imshow("Bilateral filtering", bilateral_filter);

	cv::waitKey(0);
	cv::destroyAllWindows();

	return 0;
}

 

 

반응형