블러링필터
이미지의 노이즈나 디테일을 줄이는 데 사용되는 이미지 처리 기술로, 결과적으로 이미지가 매끄럽거나 흐려진다.
OpenCV에서 사용할 수 있는 블러링 필터는 다음과 같다.
- 평균화 필터: 정사각형 커널을 사용하여 창에 있는 픽셀의 평균값을 계산하고 중앙 픽셀을 계산된 평균값으로 바꾼다
- 가우시안 필터: 가우시안 커널(종 모양 곡선)을 사용하여 창에 있는 픽셀의 가중 평균을 계산하고 중앙 픽셀을 계산된 평균값으로 바꾼다
- 중앙값 필터: 필터는 중앙 픽셀을 창에 있는 픽셀의 중앙값으로 바꾼다
- 양방향 필터: 필터는 가우시안 필터와 유사하지만 중앙 픽셀과 주변 픽셀 간의 픽셀 강도 차이도 고려하므로 이미지의 가장자리를 보존하는 데 유용할 수 있다.
평균화 필터
각 픽셀의 값을 주변 픽셀의 평균값으로 대체하여 이미지를 매끄럽게 만드는 데 사용되는 일종의 이미지 처리 필터이다. 커널은 일반적으로 3x3 또는 5x5와 같은 작은 크기로 선택되며 이미지의 각 픽셀 위에 배치되며, 커널 내의 픽셀 값을 합산하고 커널의 픽셀 수로 나누어 평균을 계산한다 그런 다음 결과 값이 커널 중앙의 픽셀에 할당된다. 이 과정은 이미지의 모든 픽셀에 대해 반복되어 매끄럽거나 "흐릿한" 이미지를 생성합니다.
적용하는 함수는 다음과 같다
blur(src, dst, ksize, anchor, borderType)
- src – 입력 이미지 독립적으로 처리되는 여러 채널을 가질 수 있지만 깊이는 CV_8U, CV_16U, CV_16S, CV_32F 또는 CV_64F여야 합니다.
- dst – src와 동일한 크기 및 유형의 출력 이미지.
- ksize - 블러 커널 사이즈
- anchor – 앵커 포인트; 기본값 Point(-1,-1)은 앵커가 커널 중심에 있음을 의미합니다.
- borderType – 아래의 링크를 참조하십시오 .https://docs.opencv.org/4.7.0/d2/de8/group__core__array.html#ga209f2f4869e304c82d07739337eae7c5
소스 코드
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
string url = "http://192.168.0.123";
// Open the default camera
VideoCapture cap(url);
// Check if the camera is opened
if(!cap.isOpened())
{
cout << "Error opening camera" << endl;
return -1;
}
// Capture frames from the camera in a loop
while(true)
{
// Capture a frame
Mat frame;
cap >> frame;
// Check if the frame is empty
if(frame.empty())
{
cout << "Empty frame" << endl;
break;
}
Mat Frame1;
Size size1(3,3); //kerner size;
blur(frame, Frame1, size1);
Mat Frame2;
Size size2(5,5); //kerner size;
blur(frame, Frame2, size2);
Mat Frame3;
Size size3(7,7); //kerner size;
blur(frame, Frame3, size3);
// Display the frame
imshow("Frame", frame);
imshow("Frame1", Frame1);
imshow("Frame2", Frame2);
imshow("Frame3", Frame3);
// Press 'q' to exit the loop
if(waitKey(1) == 'q')
{
break;
}
}
// Release the camera
cap.release();
return 0;
}
출력
왼쪽위부터 필터전(frame) 3x3(frame1) 5x5(frame2) 7x7(frame3)이다.
커널 사이즈가 커질수록 점점 흐릿해 지는것을 확인할 수 있다.
가우시안 필터
가우시안 필터는 각 픽셀의 값을 주변 픽셀의 가중 평균으로 대체하여 이미지를 매끄럽게 만드는 데 사용되는 이미지 처리 필터 유형이다.
사용하는 함수는 가우시안 함수로 종 모양의 곡선으로 중심에 있는 픽셀에 더 많은 가중치를 부여하고 가장자리에 있는 픽셀에 더 적은 가중치를 부여합니다.(중앙값만 도드라지게 함)
그 결과 평균화 필터와 유사한 스무딩 효과가 발생하지만 보다 자연스러운 "흐리게" 보이는 효과가 있다.
가우시안 필터는 이미지를 흐리게 하여 이미지에서 노이즈와 디테일을 제거하는 저역 통과 필터이다. 에지를 보존하면서 잡음을 줄일 수 있기 때문에 평균화 필터보다 더 효과적이다.
적용하는 함수는 다음과 같다.
GaussianBlur(src, dst, ksize, sigmaX, sigmaY, borderType)
- src – 입력 이미지 독립적으로 처리되는 여러 채널을 가질 수 있지만 깊이는 CV_8U, CV_16U, CV_16S, CV_32F 또는 CV_64F여야 합니다.
- dst – src와 동일한 크기 및 유형의 출력 이미지.
- ksize - 가우스 커널 크기 (0,0)을 지정하면 sigma값에 의해 자동 결정됨, whith, height 값이 다를수 있지만 홀수이며 양수여야함.
- sigmaX – x 방향의 sigma ( 가우스 표준편차)
- sigmaY - y 방향의 sigma ( 가우스 표준편차) 0일때 x와 같음 x y 모두 0일경우 ksize에 계산됨
- borderType – 아래의 링크를 참조하십시오 .https://docs.opencv.org/4.7.0/d2/de8/group__core__array.html#ga209f2f4869e304c82d07739337eae7c5
OpenCV: Operations on arrays
Divides a multi-channel array into several single-channel arrays. The function cv::split splits a multi-channel array into separate single-channel arrays: If you need to extract a single channel or do some other sophisticated channel permutation, use mixCh
docs.opencv.org
소스코드
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
string url = "http://192.168.0.123";
// Open the default camera
VideoCapture cap(url);
// Check if the camera is opened
if(!cap.isOpened())
{
cout << "Error opening camera" << endl;
return -1;
}
// Capture frames from the camera in a loop
while(true)
{
// Capture a frame
Mat frame;
cap >> frame;
// Check if the frame is empty
if(frame.empty())
{
cout << "Empty frame" << endl;
break;
}
int ksize = 3;
double sigma = 1.0;
// Apply the Gaussian filter
Mat Gaussian;
GaussianBlur(frame, Gaussian, Size(ksize, ksize), sigma, sigma);
// Display the frame
imshow("Frame", frame);
imshow("Gaussian", Gaussian);
// Press 'q' to exit the loop
if(waitKey(1) == 'q')
{
break;
}
}
// Release the camera
cap.release();
return 0;
}
출력
'Open CV' 카테고리의 다른 글
opencv c++ Hough 확률적 라인 변환 (1) | 2023.01.17 |
---|---|
opencv c++ Hough 라인 변환 (0) | 2023.01.17 |
opencv c++ gray scale, HSV scale 적용하기 (0) | 2023.01.13 |
xcode c++ cURL 사용법 (0) | 2023.01.13 |
OPENCV C++ 스트리밍 영상 출력하기 (0) | 2023.01.12 |