OpenCV 2.4.3 C++부 드 러 운 처리 분석

8118 단어 opencv평활 처리
의 원리
부 드 러 운 것 도 모호 하 다 고 하 는데 간단 하고 사용 빈도 가 높 은 이미지 처리 방법 이다.
부 드 럽 게 처리 할 때 필터 가 필요 합 니 다.가장 많이 사용 되 는 필 터 는 선형 필터 이 고 선형 필터 처리 의 출력 픽 셀 값(예 를 들 어g(i,j)은 입력 픽 셀 값(예 를 들 어f(i+k,j+l)의 가중 평균 이다.
     g(i,j) = \sum_{k,l} f(i+k, j+l) h(k,l)
h(k,l)핵 이 라 고 하 는데 그것 은 단지 가중 계수 일 뿐이다.
평균 값 부 드 러 움
다음은 blur 함 수 를 사용 하 는 평균 값 입 니 다.

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace cv;

int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("
");
return -1;
}

namedWindow( " - " );
namedWindow( " - " );

imshow( " - ", image );

Mat out;

blur( image, out, Size(3, 3));

imshow( " - ", out );

waitKey( 0 );
}
blur 함수 API 자료:
귀 일화 블록 필 터 를 사용 하여 모호 한 그림 조작 을 하 다.C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)인자 src C 는 그림 을 입력 하면 임의의 채널 수 를 사용 할 수 있 습 니 다.이 함 수 는 채널 에 대해 독립 적 으로 처리 하지만 깊이 는 CV 일 수 밖 에 없습니다.8U, CV_16U, CV_16S, CV_32F or CV_64F。dst C 출력 그림,입력 그림 과 같은 크기 와 깊이.ksize C 퍼 지 커 널 크기.anchor C 닻 점,기본 값 은(-1,-1),즉 닻 점 은 커 널 의 중심 에 있 습 니 다.borderType C 는 이미지 경 계 를 판단 하 는 데 사 용 됩 니 다.
이 함 수 는 그림 을 부 드 럽 게 처리 하여 아래 의 커 널 을 이용 하 였 습 니 다:
\texttt{K} = \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 & 1 \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \hdotsfor{6} \\ 1 & 1 & 1 & \cdots & 1 & 1 \\ \end{bmatrix}
blur(src,dst,ksize,anchor,borderType)를 호출 하 는 것 은 box Filter(src,dst,src.type(),anchor,true,borderType)를 호출 하 는 것 과 같 습 니 다.
blur 는 귀 일 화 된 블록 필 터 를 사용 합 니 다.출력 픽 셀 값 은 핵 창 내 픽 셀 값 의 평균 값(모든 픽 셀 가중 계수 가 같 음)입 니 다.
가우스 평활
다음 코드 는 GaussianBlur 를 사용 하여 부 드 러 움 을 실현 합 니 다:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("
");
return -1;
}

namedWindow( " - " );
namedWindow( " - " );

imshow( " - ", image );

Mat out;

GaussianBlur( image, out, Size( 3, 3 ), 0, 0 );

imshow( " - ", out );

waitKey( 0 );
}
GaussianBlur 함수 API 자료:
가우스 필터 로 퍼 지 조작 C+: void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT)파라미터 src C 그림 을 입력 하면 임의의 채널 수 를 사용 할 수 있 습 니 다.이 함 수 는 채널 에 대해 독립 적 으로 처리 하지만 깊이 는 CV 일 수 밖 에 없습니다.8U, CV_16U, CV_16S, CV_32F or CV_64F.dst C 그림 을 출력 합 니 다.입력 그림 과 같은 크기 와 깊이 입 니 다.ksize C.가우스 커 널 크기.ksize.width 와 ksize.height 는 다 를 수 있 지만 정수 여야 합 니 다.또는 0 과 같 습 니 다.매개 변수 sigma 의 탑승 에 의 해 결 정 됩 니 다.sigmaX C.가우스 커 널 은 X 방향 에서 의 표준 편차 이다.sigmaY C.가우스 커 널 은 Y 방향 에서 의 표준 편차 이다.sigmay 가 0 이 라면 sigmax 의 값 과 같 을 것 입 니 다.만약 그들 이 모두 0 이 라면 그들 은 ksize.width 와 ksize.height 로 계산 할 수 있 습 니 다.borderType C 그림 경 계 를 판단 하 는 모드 입 니 다.
가장 유용 한 필터.가우스 필 터 는 입력 배열 의 모든 픽 셀 점 과 가우스 커 널 볼 륨 을 출력 픽 셀 값 으로 합 니 다.
http://www.cnblogs.com/http://www.cnblogs.com/_images/Smoothing_Tutorial_theory_gaussian_0.jpg
1 차원 고 스 함 수 를 참고 하면 우 리 는 그 가 중간 에 크 고 양쪽 이 작은 함수 라 는 것 을 볼 수 있다.
그래서 고 스 필터 의 가중 수 는 중간 이 크 고 사방 이 작다.
그 2 차원 고 스 함 수 는:
     G_{0}(x, y) = A e^{ \dfrac{ -(x - \mu_{x})^{2} }{ 2\sigma^{2}_{x} } + \dfrac{ -(y - \mu_{y})^{2} }{ 2\sigma^{2}_{y} } }  
그 속  \mu  평균치(피크 대응 위치),\sigma 표준 차 를 나타 낸다(변수x 변수 각각 하나의 평균치 도 있 고,또 하나의 표준 차이 도 있다.
중간 값 부 드 러 움
medianBlur 를 사용 하여 중간 값 을 부 드 럽 게 실행 합 니 다:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("
");
return -1;
}

namedWindow( " - " );
namedWindow( " - " );

imshow( " - ", image );

Mat out;
medianBlur( image, out, 3);

imshow( " - ", out );

waitKey( 0 );
}
medianBlur 함수 API 자료:
중간 값 필터 로 모호 조작 C++: void medianBlur(InputArray src, OutputArray dst, int ksize) Parameters:src C 는 1,3,4 채널 그림 입력 을 지원 합 니 다.ksize 가 3 또는 5 일 때 그림 의 깊이 는 CV 일 수 밖 에 없습니다.8U,,CV_16U 혹은 CV_32F,다른 대공 경 사이즈 에 대해 서 는 깊이 만 CV 로 지원 합 니 다.8U。dst C 그림 을 출력 합 니 다.입력 그림 과 같은 크기 와 깊이 입 니 다.ksize C 선형 지름 크기 는 1 보다 큰 홀수 일 수 밖 에 없다.예 를 들 어 3,5,7...
중간 값 필 터 는 그림 의 모든 픽 셀 을 인접 도 메 인(현재 픽 셀 중심의 정사각형 영역)픽 셀 의 중간 값 으로 대체 합 니 다. 
쌍무 가 매끄럽다.
bilateralFilter 를 사용 하여 쌍무 부 드 러 움 을 실행 합 니 다:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;int main( int argc, char** argv ){
Mat image;
image = imread( argv[1]);

if( argc != 2 || !image.data ){
printf("
");
return -1;
}

namedWindow( " - " );
namedWindow( " - " );

imshow( " - ", image );

Mat out;
bilateralFilter ( image, out, 3, 3*2, 3/2 );

imshow( " - ", out );

waitKey( 0 );
}
bilateralFilter 의 API 자료:
그림 에 쌍무 필 터 를 적용 합 니 다.C++: void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, intborderType=BORDER_DEFAULT ) Parameters:src C 소스 는 8 비트 또는 부동 소수점,1 또는 3 채널 그림 이 어야 합 니 다.dst C 그림 을 출력 합 니 다.입력 그림 과 같은 크기 와 깊이 입 니 다.d C.필터 과정 에서 사용 하 는 픽 셀 인접 도 메 인 지름 은 이것 이 비 정수 라면 이 값 은 sigmaSpace 에 의 해 결정 된다.sigmaColor C 색상 공간의 표준 분산.수치 가 클 수록 먼 색 이 이웃 지역 에 섞 여 더 큰 색 구간 에서 같은 색 을 얻 게 된다 는 뜻 이다.sigmaSpace C 좌표 공간의 레이 블 분산.수치 가 클 수록 멀리 있 는 픽 셀 이 서로 영향 을 줄 것 이 라 고 생각 하여 더 큰 지역 에서 비슷 한 색 을 가 져 올 수 있 습 니 다.d>0,d 는 인접 지역 의 크기 를 지정 하고 sigmaSpace 와 무관 합 니 다.그렇지 않 으 면,d 는 sigma Space 와 정비례 한다.
원 리 는 참고 할 수 있다.
http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
현재 우리 가 알 고 있 는 필 터 는 모두 그림 을 부 드 럽 게 하기 위해 서 이다.문 제 는 어떤 때 는 이 필터 들 이 소음 을 약화 시 킬 뿐만 아니 라 가장자리 도 지 워 버 렸 다 는 것 이다.이러한 상황 을 피하 기 위해 서 우 리 는 쌍무 필 터 를 사용 할 수 있다. 
고 스 필터 와 유사 하 며,쌍무 필터 도 모든 이웃 픽 셀 에 가중 계 수 를 분배 한다.이러한 가중 계 수 는 두 부분 을 포함 하고 첫 번 째 부분 가중 방식 은 고 스 필터 와 마찬가지 로 두 번 째 부분의 가중치 는 이 이웃 픽 셀 과 현재 픽 셀 의 그 레이스 케 일 차이 에 달 려 있다.

좋은 웹페이지 즐겨찾기