중앙값 필터
중앙값 필터는 이미지의 노이즈를 줄이는 데 사용되는 비선형 이미지 처리 기술이다. 주변 픽셀 값들을 정렬하여 그 중앙값으로 픽셀값을 대체 한다. 노이즈를 효과적으로 줄이면서 이미지의 가장자리를 보존하는 데 중앙값 필터가 더 효과적이다. 잡티 제거에 효과적이다.
적용하는 함수는 다음과 같다
medianBlur(src, dst, ksize);
- src – 입력 1, 3 또는 4채널 이미지; ksize가 3 또는 5일 때 이미지 깊이는 CV_8U, CV_16U 또는 CV_32F여야 하며 더 큰 조리개 크기의 경우 CV_8U만 가능
- dst – src와 동일한 크기 및 유형의 출력 이미지.
- ksize - 조리개 선형 크기; 홀수여야 하고 1보다 커야 함
소스코드
#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 median;
int ksize = 5; // kernel size
medianBlur(frame,median, ksize);
// Display the frame
imshow("Frame", frame);
imshow("Median Filtered", median);
// Press 'q' to exit the loop
if(waitKey(1) == 'q')
{
break;
}
}
// Release the camera
cap.release();
return 0;
}
출력
양방향 필터
가장자리를 유지하면서 이미지를 매끄럽게 만드는 데 사용되는 일종의 이미지 처리 필터이다. 각 픽셀의 값을 주변 픽셀의 가중 평균으로 대체한다는 점에서 가우시안 필터와 유사하지만 양방향 필터는 픽셀 간의 공간적 거리와 픽셀 간의 색상 차이를 모두 고려한다.
적용되는 함수는 다음과 같다.
bilateralFilter(src, dst, ksize, sigmaColor, sigmaSpace, borderType);
- src – 소스 8비트 또는 부동 소수점, 1채널 또는 3채널 이미지.
- dst – src와 동일한 크기 및 유형의 출력 이미지.
- ksize - 필터링 중에 사용되는 각 픽셀 이웃의 직경이다 양수가 아닌 경우 sigmaSpace에서 계산됨
- sigmaColor - 색 공간에서 시그마를 필터링한다. 매개변수의 값이 클수록 픽셀 이웃(sigmaSpace 참조) 내에서 더 먼 색상이 함께 혼합되어 반등 색상의 더 큰 영역이 생성됨을 의미
- sigmaSpace - 좌표 공간에서 시그마를 필터링한다. 매개변수의 값이 클수록 색상이 충분히 가까운 한 멀리 있는 픽셀이 서로 영향을 미칩니다( sigmaColor 참조).d>0이면 sigmaSpace와 관계없이 이웃 크기를 지정함 .그렇지 않으면 d는 sigmaSpace에 비례함
- 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;
}
// Define the kernel size, sigma color and sigma space
int ksize = 3;
double sigma_color = 75;
double sigma_space = 75;
Mat Bilateral;
bilateralFilter(frame, Bilateral, ksize, sigma_color, sigma_space);
// Display the frame
imshow("Frame", frame);
imshow("Bilateral", Bilateral);
// Press 'q' to exit the loop
if(waitKey(1) == 'q')
{
break;
}
}
// Release the camera
cap.release();
return 0;
}