opencv—— 비선형 필터링 원리 및 작동

opencv에서 가장 일반적으로 사용되는 두 가지 비선형 필터는 중앙값 필터와 양측 필터입니다.

중앙값 필터링 -medianBulr

중앙값 필터는 매우 간단합니다. 즉 , 특정 영역의 중앙값 이며 , 각 픽셀의 회색 값은 해당 지점의 특정 인접 창에있는 모든 픽셀의 회색 값 중앙값으로 설정됩니다. 이 영역은 정사각형 영역이고 정사각형의 측면 길이, 즉 영역의 행과 열의 수는 모두 홀수입니다. 중앙값은 소금 및 후추 소음에 대한 좋은 억제 효과가 있습니다.
여기에 사진 설명 삽입

API

void medianBlur(
    InputArray src,
    OutputArray dst, 
    int ksize
);

(1) InputArray 유형의 src, 입력 이미지. 1, 3 또는 4 채널 이미지를 입력합니다. ksize가 3 또는 5 인 경우 이미지 깊이는 CV_8U, CV_16U 또는 CV_32F 여야하며, 조리개가 클 경우 CV_8U 만 가능합니다.

(2) OutputArray 유형의 dst, 즉 대상 이미지는 입력 이미지와 크기 및 유형이 동일합니다.

(3) int 유형의 ksize, 선형 조리개 크기; 홀수 여야하고 1보다 커야합니다 (예 : 3, 5, 7…).

암호

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

using namespace std;
using namespace cv;

int main()
{
    
    
	Mat src, dst;
	src = imread("C:/Users/86176/Pictures/pics/house.jpg");
	if (!src.data)
	{
    
    
		cout << "could not load image !";
		return -1;
	}
	imshow("src", src);

	//中值滤波
	medianBlur(src, dst, 7);
	imshow("medianBlur_src", dst);

	waitKey(0);
	return 0;
}

효과

여기에 사진 설명 삽입

양방향 필터-양측 필터

양방향 필터링은 이미지의 공간적 근접성과 픽셀 값의 유사성결합하는 절충 처리 이며 공간 정보와 그레이 스케일 유사성을 고려하여 에지 보존 및 노이즈 제거의 목적을 달성합니다. 단순하고 반복적이지 않으며 부분적입니다. 양측 필터의 장점은 가장자리 보존에 사용할 수 있다는 것 입니다. 일반적으로 과거에 노이즈를 제거하는 데 사용 된 Wiener 필터 또는 Gaussian 필터는 가장자리를 더 분명하게 흐리게 처리하고 고주파 세부 정보에 대한 보호 효과가 분명하지 않습니다.

양방향 필터에는 가우스 필터보다 가우스 분산 sigma-d가 하나 더 있습니다. 공간 분포를 기반으로하는 가우스 필터 함수입니다. 따라서 가장자리 근처에서 멀리 떨어진 픽셀은 가장자리의 픽셀 값에 너무 많은 영향을주지 않습니다. 픽셀 보존을 확인하세요. 가장자리 근처의 값.
그러나 너무 많은 고주파 정보를 보존하기 때문에 양방향 필터는 컬러 이미지의 고주파 노이즈를 깨끗하게 필터링 할 수 없으며 저주파 정보 만 잘 필터링 할 수 있습니다.

여기에 사진 설명 삽입
중간에는 공간에서 이미지 가중치의 가우스 분포
가 있으며,이 이미지는 공간 커널과 범위 커널로 구성되어 있으며 양자 필터링의 연산자로 사용됩니다.

  • 공간적 코어 : 공간 측면에서 이미지는 각각 무게가있는 3 x 3 또는 5 x 5입니다.
  • 값 범위 커널 : 픽셀 값을위한 것입니다. 픽셀 값 차이가 일정 범위 내에 있으면 흐려집니다. 간격이 너무 크면 흐려지지 않으므로 가장자리를 유지할 수 있습니다.
  • 따라서 양측 흐림을 위해 두 개의 매개 변수를 입력해야합니다. 하나는 공간 도메인의 창 크기와 값 도메인의 창 크기입니다.

요약하자면 :

  • 평균 흐림은 가장자리 픽셀 정보 손실의 결함을 극복 할 수 없습니다. 그 이유는 평균 필터가 평균 가중치를 기반으로하기 때문입니다.

  • 가우시안 블러는이 결함을 부분적으로 극복하지만 픽셀 값의 차이를 고려하지 않기 때문에 완전히 피할 수 없습니다 (인접 픽셀 값이 0과 255 일 수 있음).

  • Gaussian bilateral blur-는 에지 보존을위한 필터링 방법으로 에지 정보의 손실을 방지하고 이미지 윤곽선을 보존합니다 (인접 픽셀 간의 차이 임계 값을 고려할 때 에지를 보존 할 수 있음).

API

void bilateralFilter(
    InputArray src, 
    OutputArray dst, 
    int d,
    double sigmaColor, 
    double sigmaSpace,
    int borderType = BORDER_DEFAULT  
);

(1) InputArray 유형의 src, 입력 이미지. 이 함수는 채널을 독립적으로 처리하고 여러 채널의 영상을 처리 할 수 ​​있지만 처리 할 영상의 깊이는 CV_8U, CV_16U, CV_16S, CV_32F 및 CV_64F 중 하나 여야합니다.

(2) OutputArray 유형의 dst, 즉 대상 이미지는 입력 이미지와 크기 및 유형이 동일합니다.

(3) Int type d, 필터링 프로세스에 사용되는 각 픽셀 이웃의 직경. 양수가 아니면 sigmaSpace에서 계산됩니다.

(4) 이중 유형 sigmaColor
색 공간 필터 시그마. 매개 변수 값이 클수록 픽셀 이웃 (sigmaSpace 참조)에서 더 많은 색상이 함께 혼합되어 반등 색 영역이 더 커집니다.

(5) 이중 유형 sigmaSpace, 좌표 공간에서 시그마를 필터링합니다. 매개 변수 값이 클수록 색상이 충분히 가까우면 멀리 떨어진 픽셀이 서로 영향을 미칩니다 (sigmaColor 참조). d가 0보다 크면 sigmaSpace에 관계없이 이웃의 크기를 지정합니다. 그렇지 않으면 d는 sigmaSpace에 비례합니다.

(6) int 유형의 borderType은 이미지 외부 픽셀의 경계 모드를 추정하는 데 사용됩니다. 자세한 내용은 cv :: BorderTypes를 참조하십시오.

암호

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

using namespace std;
using namespace cv;

int main()
{
    
    
	Mat src, dst;
	src = imread("C:/Users/86176/Pictures/pics/house1.jpg");
	if (!src.data)
	{
    
    
		cout << "could not load image !";
		return -1;
	}
	imshow("src", src);

	//双边滤波
	bilateralFilter(src, dst, 15, 150, 3);
	imshow("bilateralFilter_src", dst);


	waitKey(0);
	return 0;
}

효과

여기에 사진 설명 삽입
보시다시피 가장자리 유지가 매우 잘 수행됩니다.

추천

출처blog.csdn.net/qq_28258885/article/details/112647155