Parallel Image Processing ( Gaussian Blur Project )
OpenCV 기본 함수에는 Gaussian Blur를 사용하여 이미지에 blur 처리를 할 수 있다.
이번 프로젝트에서는 해당 Gaussian Blur를 OpenCV, OpenMP, CUDA, OpenCL 4가지로 구현해보려고 한다.
또한 혹시나 사용할 사람이 있을 수도 있으니, Gray, Color에서 Blur Code를 모두 작성해보겠다.
참고로 해당 포스트에서는 단순하게 Color image와 Gray image에서 cv::GaussianBlur 함수를 사용할 것이다.
Gaussian Blur
가우시안 기법은 영상 처리에서 다양하게 활용된다.
노이지한 이미지를 블러를 통해 깔끔하게 만들어 줄 수 있으며, Gaussian Noise를 통해 이미지에 노이즈를 더해줄 수 있다.
이번 포스트에서는 Gaussian Blur 처리에 대해 간단하게 첨부하고 OpenCV Code를 첨부하려고 한다!
가우시안 블러는 위 정규분포에서 kernel size만큼의 값을 일정 pixel range 곱하여 blur된 현재 pixel을 구한다.
정규분포는 적분 시 모든 합 1이 되어야하므로, kernel size 값에 따라 normalize를 해줄 필요가 있다.
이에 대한 내용은 다른 블로그에 레퍼런스가 굉장히 많으니 이론적인 것을 설명하기 보다는 code 내에서 구현과 함께 보여주도록 하겠다.
OpenCV Gaussian Blur
사실 이번 포스트는 크게 어렵지 않다. OpenCV 내 함수를 이용해 간단히 Gaussian Blur 함수를 사용해보려고 한다.
cv::GaussianBlur
OpenCV 내에서 Gaussian Blur를 사용하는 것은 매우 쉽다.
cv::GaussianBlur(input_img, output_img, Size(size, size), sigma_value);
물론 더 많은 변수를 사용할 수 있지만, 가장 간단하게 GaussianBlur 함수를 사용할 수 있는 방식이다.
input_img : Mat 형식으로 원하는 입력 이미지를 입력한다.
output_img : Mat 형식으로 출력하고자 하는 Mat 변수를 입력한다. 이때 input_img를 여기에 넣어 덮어씌울 수 있다.
size : 원하는 kernel Size를 입력한다. Size가 증가할수록 Blur의 정도가 더 심해진다. 이때 Size는 함수이고, size가 kernel size를 나타내는 변수이다!!
sigma : 정규분포 내의 시그마 값을 변화시켜, 정규분포의 범위를 조정한다. 따라서 시그마가 증가한다면 이미지의 Blur 정도가 증가한다.
나는 아주 간단하게 설명했나 자세한 내용은 꼭 아래 링크에서 확인하는걸 추천한다!
https://docs.opencv.org/4.5.2/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1
main code
OpenCV 내에서 color, sigma, size를 변경해가며 결과를 비교해보겠다.
Gray Scale with Color Scale
OpenCV Gaussian 함수를 통해 Gray, Color 이미지에서 정상 작동하는 것을 확인한다.
또한 나는 KNEE 이미지를 통해 실험을 진행했다.
int main() {
Mat img_1 = imread("KNEE.jpg", IMREAD_GRAYSCALE); // Gray Scale 불러오기
Mat img_2 = imread("KNEE.jpg", IMREAD_COLOR); // Color로 불러오기
Mat output_1, output_2;
// imshow를 통한 Console창 출력
imshow("img_1", img_1);
imshow("img_2", img_2);
// waitKey 함수를 통해 imread 확인
waitKey(0);
}
우선 IMREAD_GRAYSCALE, IMREAD_COLOR를 통해 두개의 input image를 불러온다.
imread 함수를 통해 아래와 같이 scale이 성공적으로 적용된 것을 알 수 있다.
이제 이미지에 가우시안 블러를 적용한다.
블러 적용 여부를 비교하므로, kernel size는 5 x 5, sigma는 3으로 고정하여 확인한다.
또한 결과는 hconcat을 통해 원본 이미지와 합쳐 저장할 것이다.
GaussianBlur(img_1, output_1, Size(5, 5), 3); // Gray 가우시안 블러
GaussianBlur(img_2, output_2, Size(5, 5), 3); // Color 가우시안 블러
GrayScale, ColorScale로 가우시안 Blur를 입힌다.
hconcat(img_1, output_1, output_1); // 수평으로 Gray 이미지 합치기
hconcat(img_2, output_2, output_2); // 수평으로 Color 이미지 합치기
해당 결과를 효과적으로 확인하기 위해 hconcat 함수를 통해 원본 이미지와 수평으로 합친다.
// imshow를 통한 Console창 출력
imshow("output_1", output_1);
imshow("output_2", output_2);
// waitKey 함수를 통해 imread 확인
waitKey(0);
// 이미지 저장
imwrite("output_1.png", output_1);
imwrite("output_2.png", output_2);
최종 이미지를 콘솔창에서 확인하고, 이를 저장한다.
이를 통해 GrayScale, Color Scale에서 성공적으로 Gaussian Blur가 진행됐음을 확인할 수 있다.
아래 그림에서 왼쪽은 원본, 오른쪽은 블러 처리 후 이미지이다.
두 이미지에서 블러가 성공적으로 진행됐음을 확인할 수 있다.
다음에는
다음에는 OpenCV 함수를 사용하지 않고 직접 data에 접근하여 가우시안 블러를 구현하려고 한다.
전체 Code
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat img_1 = imread("KNEE.jpg", IMREAD_GRAYSCALE); // Gray Scale 불러오기
Mat img_2 = imread("KNEE.jpg", IMREAD_COLOR); // Color로 불러오기
Mat output_1, output_2;
GaussianBlur(img_1, output_1, Size(5, 5), 3); // Gray 가우시안 블러
GaussianBlur(img_2, output_2, Size(5, 5), 3); // Color 가우시안 블러
hconcat(img_1, output_1, output_1); // 수평으로 Gray 이미지 합치기
hconcat(img_2, output_2, output_2); // 수평으로 Color 이미지 합치기
// imshow를 통한 Console창 출력
imshow("output_1", output_1);
imshow("output_2", output_2);
// waitKey 함수를 통해 imread 확인
waitKey(0);
// 이미지 저장
imwrite("output_1.png", output_1);
imwrite("output_2.png", output_2);
return 0;
}
'IT > Computer Vision' 카테고리의 다른 글
[OpenCV] 2D Gaussian Blur 만들기 (Gray Scale) with OpenMP (0) | 2021.08.22 |
---|