opencv- 원리 및 선형 필터링 (박스 필터링, 평균 필터링, 가우스 필터링)의 작동

원리

  • Smooth / Blur는 이미지 처리에서 가장 간단하고 가장 일반적으로 사용되는 작업 중 하나입니다.

  • 이 작업을 사용하는 이유 중 하나는 이미지를 전처리 할 때 노이즈를 줄이기 위해서입니다.

  • Smooth / Blur 연산의 사용은 수학적 컨볼 루션 계산 뒤에 있습니다.
    여기에 사진 설명 삽입

  • 일반적으로 이러한 컨볼 루션 연산자 계산은 선형 연산이므로 선형 필터링이라고도합니다.

회선

컨볼 루션을 이해하는 방법
여기에 사진 설명 삽입
6x6 이미지 픽셀 매트릭스가 있다고 가정합니다.

컨볼 루션 프로세스 : 6x6은 3x3 창으로, 왼쪽에서 오른쪽으로, 위에서 아래로 이동하며, 각 노란색 픽셀과 해당 회색 픽셀 값의 합이 평균화되어 중앙 빨간색 픽셀에 컨볼 루션 처리 후 새 픽셀로 할당됩니다. 픽셀 값 . 한 번에 한 픽셀 격자를 이동합니다.

평균을 취하는 이유 : 픽셀 값은 255를 초과 할 수 없습니다.

이미지 흐림 원리

박스 필터

사용 된 코어는 다음과 같습니다.
여기에 사진 설명 삽입

평균 필터링 (정규화 된 상자 필터링)

여기에 사진 설명 삽입
위에서 언급 한 컨볼 루션의 종류는
가중치에 관계없이 평균 필터링 입니다.

가우스 필터링

가우시안 필터링은 이미지 흐림을 기반으로 이미지의 일부 특성을 보존합니다.
예를 들어, 특정 픽셀의 값이 매우 큰 경우 해당 값은 가우스 필터링 후에도 여전히 매우 크고 다른 작은 값의 영향을받지 않습니다.

따라서 가우스 필터링을 다음 같이 이해할 수 있습니다 : 가중치를 사용한 평균 필터링
여기에 사진 설명 삽입
참고 : σ의 크기는 가우스 함수의 너비를 결정합니다.

가우스 커널 (마스크)

이론적으로 가우스 분포는 모든 도메인에서 음이 아닌 값을 가지며 무한 컨볼 루션 커널이 필요합니다. 사실, 평균 주위의 표준 편차의 3 배 이내의 값만 취하고 다른 부분 만 제거하면됩니다.

Gaussian 필터링의 두 가지 중요한 단계는 Gaussian 템플릿을 찾은 다음 convolution을 수행하는 것 입니다. 템플릿 (참조의 일부 위치에서 마스크 또는 가우스 커널이라고도 함). 그래서 어떻게이 시간에 왔는지 알아야하나요? 이것을 어떻게 사용 하는가?

밤나무
취하기 : 중심점의 좌표가 (0,0)이라고 가정하고 가장 가까운 8 개 점의 좌표를 취하고 계산을 위해서는 σ 값을 설정해야합니다. σ = 1.5라고 가정하면 블러 반경이 1 인 Gaussian 템플릿은 다음과 같이 간주됩니다.이
여기에 사진 설명 삽입
때이 9 개의 점이 1이되는지 확인해야합니다 (이것이 Gaussian 템플릿 가중치 의 특성입니다 ). 이 9 개 포인트의 가중치 합은 0.4787147과 같으므로 위의 9 개 값을 각각 0.4787147로 나누어 최종 가우스 템플릿을 얻어야합니다.

여기에 사진 설명 삽입

가우스 필터 계산

Gaussian 템플릿을 사용하면 Gaussian 필터의 계산이 원활 해집니다.
밤나무 가져 오기 :
9 픽셀이 있다고 가정하면 회색 값 (0-255)의 가우스 필터는 다음과 같이 계산됩니다.
여기에 사진 설명 삽입
참조 소스 : (https://blog.csdn.net/nima1994/article/details/79776802)

이 9 개 값을 더하면 중심점의 가우스 필터 값이됩니다.
모든 포인트에 대해이 과정을 반복하고 가우시안 블러 이미지를 얻습니다.

가우스 필터링 단계

요약하면 단계를 요약 할 수 있습니다.

(1) 해당 코어의 중심 요소를 입력 이미지에서 처리 할 픽셀 바로 위에 있도록 이동합니다.
(2) 입력 이미지 의 픽셀 값을 가중치로 취하고 해당 코어를 곱합니다
(3 ) 위의 단계에서 얻은 결과를
더하여 할 일 출력은 단순히 가우시안 분포에 따라 가우스 템플릿을 얻은 다음 convolution과 덧셈을하는 과정입니다.

관련 기능

상자 필터링 -boxblur

void boxFilter(
    InputArray src,
    OutputArray dst, 
    int ddepth, 
    Size ksize, 
    Point anchor=Point(-1,-1), 
    boolnormalize=true, 
    int borderType=BORDER_DEFAULT 
);

함수 매개 변수의 의미는 다음과 같습니다.

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

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

(3) Int type ddepth, 출력 이미지의 깊이, -1은 원본 이미지의 깊이, 즉 src.depth ()를 나타냅니다.

(4) 크기 유형의 ksize (나중에 크기 유형에서 설명 됨), 커널 크기. 일반적으로 커널의 크기를 나타 내기 위해 Size (w, h)를 작성합니다 (여기서 w는 픽셀 너비이고 h는 픽셀 높이). Size (3,3)는 3x3 코어 크기를 의미하고 Size (5,5)는 5x5 코어 크기를 의미합니다.

(5) Point 유형의 앵커는 앵커 포인트 (즉, 다듬을 포인트)를 나타내며 기본값은 Point (-1, -1)입니다. 이 점의 좌표가 음수이면 코어의 중심이 앵커 포인트이므로 기본값 Point (-1, -1)은 앵커 포인트가 코어의 중심에 있음을 의미합니다.

(6) 부울 유형의 정규화, 기본값은 커널이 해당 영역에 의해 정규화되었는지 여부를 나타내는 식별자 인 true입니다.

(7) int 유형의 borderType은 이미지 외부 픽셀의 특정 경계 모드를 유추하는 데 사용됩니다. 기본값은 BORDER_DEFAULT입니다.

암호

#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);

	//方框滤波
	boxFilter(src, dst, -1, Size(5, 5));
	imshow("boxFilter_src", dst);

	waitKey(0);
	return 0;
}

효과

여기에 사진 설명 삽입

평균 필터링 흐림

void blur(
    InputArray src, 
    OutputArray dst, 
    Size ksize, 
    Point anchor=Point(-1,-1), 
    int borderType=BORDER_DEFAULT 
);

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

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

(3) 커널의 크기 인 크기 유형 (나중에 크기 유형에서 설명 됨)의 ksize. 일반적으로 커널의 크기를 나타 내기 위해 Size (w, h)를 작성합니다 (여기서 w는 픽셀 너비이고 h는 픽셀 높이). Size (3,3)는 3x3 코어 크기를 의미하고 Size (5,5)는 5x5 코어 크기를 의미합니다.

(4) Point 유형의 앵커는 앵커 포인트 (즉, 다듬을 포인트)를 나타내며 기본값은 Point (-1, -1)입니다. 이 점의 좌표가 음수이면 코어의 중심이 앵커 포인트이므로 기본값 Point (-1, -1)은 앵커 포인트가 코어의 중심에 있음을 의미합니다.

(5) int 유형의 borderType은 이미지의 외부 픽셀의 특정 경계 모드를 유추하는 데 사용됩니다. 기본값은 BORDER_DEFAULT입니다.

암호

#include <opencv2 \ opencv.hpp>
#include

네임 스페이스 std 사용;
네임 스페이스 cv 사용;

int main ()
{ Mat src, dst; src = imread (“E : /image/Girl2.png”); if (! src.data) { cout << "이미지를로드 할 수 없습니다!"; 반환 -1; } imshow (“src”, src);







//均值滤波
blur(src, dst, Size(3, 3), Point(-1, -1));
imshow("blur_src", dst);

waitKey(0);
return 0;

}

효과

여기에 사진 설명 삽입

가우스 필터링 -GaussianBlur

void GaussianBlur(
    InputArray src,
    OutputArray dst, 
    Size ksize, 
    double sigmaX, 
    double sigmaY=0, 
    intborderType=BORDER_DEFAULT 
);

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

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

(3) 커널의 크기 인 크기 유형 (나중에 크기 유형에서 설명 됨)의 ksize. 일반적으로 커널의 크기를 나타 내기 위해 Size (w, h)를 작성합니다 (여기서 w는 픽셀 너비이고 h는 픽셀 높이). Size (3,3)는 3x3 코어 크기를 의미하고 Size (5,5)는 5x5 코어 크기를 의미합니다.

(4) double 유형의 sigmaX는 X 방향에서 가우시안 커널 함수의 표준 편차를 나타냅니다.

(5) double 형의 sigmaY는 Y 방향에서 가우시안 커널 함수의 표준 편차를 나타냅니다. sigmaY가 0이면 sigmaX로 설정하고, sigmaX와 sigmaY가 모두 0이면 ksize.width와 ksize.height로 계산됩니다.

(6) int 유형의 borderType은 이미지의 외부 픽셀의 특정 경계 모드를 유추하는 데 사용됩니다. 기본값은 BORDER_DEFAULT입니다.

암호

#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);

	//高斯滤波
	GaussianBlur(src, dst, Size(3, 3), 0, 0);
	imshow("GaussianBlur_src", dst);



	waitKey(0);
	return 0;
}

효과

여기에 사진 설명 삽입

추천

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