Spatial Filtering
- Spatial Filter를 사용하여 전처리를 하는 것
- Spatial filters = spatial masks, kernels, templates, windows
spatial filter의 개수에 따라 다양한 결과를 만들 수 있다.
Averaging filter
- 특정한 픽셀 값을 이웃 픽셀들의 평균값으로 대체시키는 것이다.
- low pass filters라고 불리기도 한다.
- 랜덤 한 잡음들을 줄일 수 있는 장점이 있다.
- 영상이 흐릿해지는(블러링) 단점이 있다.
Gaussian filter
Mask size
- 마스크의 크기가 작으면 작을수록 작은 잡음들을 없앨 수 있다.
- 작은 물체를 블러 처리하고 싶으면 마스크의 크기를 줄이면 된다.
- 크기가 큰 마스크를 사용하면 계산량이 많아지는 단점이 있다.
Sharpening
- 밝기 값의 차이가 있는 부분을 더 강조시킴으로써 영상이 보다 에지 있게 만드는 것이다.
- 인접한 픽셀의 값들을 공간 도메인에서의 미분함으로써 수행할 수 있다.
Mask for applying second derivative
Sharpening using unsharp masking
- Median filter
- 주어져 있는 픽셀들 중에 중간값을 구해서 그 값으로 대체시켜주는 것
- 잡음들을 제거시킬 수 있는데 m*m 크기의 필터를 사용했을 때 𝑚^2/2 크기의 잡음들을 제거할 수 있다.
- salt-and pepper noise 란 영상의 이미 없는 흰색과 검정색의 잡음을 의미한다.
- 블러링이 생기지 않으면서 잡음을 제거할 수 있는 장점이 있다.
- 하지만 averaging filter와 가우시안 필터에 비해 연산량이 많고 salt-and pepper noise에서만 효과적이라는 단점이 있다.
Averaging filter
int main() {
Mat image, AvgImg, GaussianImg;
image = imread("lena.png");
// Blurs an image using the normalized box filter
// image: input image, AvgImg: output image, Size(5, 5): blurring kernel size
blur(image, AvgImg, Size(5, 5));
// Blurs an image using a Gaussian filter
// image: input image, GaussianImg: output image, Size(5, 5): Gaussian kernel size
// 1.5: Gaussian kernel standard deviation in X direction
// 1.5 : 가우시안 필터의 표준편차 값 (x축)
GaussianBlur(image, GaussianImg, Size(5, 5), 1.5);
imshow("Input image", image);
imshow("Average image", AvgImg);
imshow("Gaussian blurred image", GaussianImg);
waitKey(0);
return 0;
}
Sharpening using second derivative
int main() {
Mat image, laplacian, abs_laplacian, sharpening;
image = imread("moon.jpg", 0);
//가우시안 블러링 수행
GaussianBlur(image, image, Size(3, 3), 0, 0, BORDER_DEFAULT);
// calculates the Laplacian of an image
// image: src, laplacian: dst, CV_16S: desire depth of dst,
// 1: aperture size used to compute second-derivative (optional)
// 1: optional scale factor for the computed Laplacian values
// 0: optional delta value that is added to the result
Laplacian(image, laplacian, CV_16S, 1, 1, 0); // Laplacian : 이차 미분 수행
convertScaleAbs(laplacian, abs_laplacian); //8비트 영상으로 변환
sharpening = abs_laplacian + image;
imshow("Input image", image);
imshow("Laplacian", laplacian);
imshow("abs_Laplacian", abs_laplacian);
imshow("Sharpening", sharpening);
waitKey(0);
}
Using unsharp masking
int main() {
Mat input = imread("lena.png");
Mat gray, blur, sharp;
cvtColor(input, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, blur, Size(5, 5), 3);
//gray영상에 1.5를 곱하고 blur영상에 -0.5를 곱하여 더한 결과가 sharp
addWeighted(gray, 1.5, blur, -0.5, 0, sharp);
imshow("gray", gray);
imshow("sharp", sharp);
waitKey(0);
}
Median filter
int main() {
Mat image = imread("saltnpepper.png", 0);
imshow("SaltAndPepper", image);
Mat mf1, mf2;
// Blurs an image using the median filter
// image: src, mf1: dst, 3: aperture size(must be odd and greater than 1)
medianBlur(image, mf1, 3); // 입력, 결과, 마스크 크기
imshow("MedianFiltered1", mf1);
medianBlur(image, mf2, 9);
imshow("MedianFiltered2", mf2);
waitKey(0);
return 0;
}
출처 - 컴퓨터 비전 한동대학교 황성수
'openCV' 카테고리의 다른 글
[openCV] 영상 분할 (0) | 2020.01.18 |
---|---|
[openCV] 컬러영상 처리 (0) | 2020.01.18 |
[openCV] 히스토그램 평활화 (0) | 2020.01.18 |
[openCV] 밝기 값 변환 (1) | 2020.01.18 |
[openCV] 메모리 관리 및 픽셀 엑세스 (0) | 2020.01.11 |
댓글