Opencv 푸 리 엽 변환 실현
공식 에서 f 는 그림 이 공역 에 있 는 값 이 고 F 는 주파수 영역 에 있 는 값 입 니 다.변환 결 과 는 복수 이지 만 실제 이미지 와 복잡 한 그림 을 통 해 크기 와 위상 이미 지 를 통 해 이 그림 을 표시 할 수 없습니다.그러나 전체 이미지 처리 알고리즘 은 크기 이미지 에 만 관심 이 있 습 니 다.이것 은 우리 가 필요 로 하 는 모든 이미지 기하학 적 구조의 정 보 를 포함 하기 때 문 입 니 다.
다음 몇 단 계 를 통 해 푸 리 엽 이 변 경 된 그림 을 표시 할 수 있 습 니 다.
1.그림 을 가장 좋 은 크기 로 확장 합 니 다.DFT(직접 푸 리 엽 변환)의 성능 은 그림 의 크기 에 의존 합 니 다.그림 이 2,3,5 의 배수 일 때 가장 빠 릅 니 다.따라서 가장 좋 은 성능 을 얻 기 위해 서 는 보통 패드 경계 값 을 사용 하 는 방법 으로 가장 좋 은 사 이 즈 를 얻는다.
2.푸 립 엽 변환 결과 의 실제 부분 과 가상 부분 에 저장 공간 을 분배 합 니 다.푸 리 엽 변환 의 결 과 는 복수 이다.이것 은 모든 그림 의 결과 가 하나의 실제 부분 과 허 부 를 가 진 다 는 것 을 의미한다.그 밖 에 주파수 범위 가 그 에 대응 하 는 공간 범위 보다 훨씬 크다 는 것 을 의미한다.따라서 우 리 는 보통 최소한 하나의 부동 소수점 형식 으로 이 수 치 를 저장 합 니 다.따라서,우 리 는 우리 의 입력 이미 지 를 이런 형식 으로 변환 하고,다른 채널 과 복수 값 을 저장 하도록 확장 할 것 이다
3.푸 리 엽 변환 을 진행한다.
4.복 수 를 진폭 으로 전환 하고 DFT 의 진폭 은 다음 과 같은 공식 에서 얻 을 수 있다
5.로그 눈금 으로 전환 합 니 다.그림 에 대해 수 척도 의 크기 를 조정 한 결과 푸 립 엽 계수 행렬 의 동적 범위 가 너무 커서 화면 에 표시 할 수 없다 는 것 을 증명 했다.우 리 는 이렇게 해서 작은 것 과 높 은 변화 치 를 관찰 할 수 없다.따라서 높 은 수 치 는 흰 점 으로 바 뀌 고 작은 수 치 는 검 은 점 으로 바 뀌 며 그 레이스 케 일 수 치 를 시각 화 할 수 있 습 니 다.우 리 는 선형 눈금 을 대수 눈금 으로 바 꾸 어 관찰 하기에 편리 합 니 다.
6.절단 과 중 분포 폭 이미지,첫 번 째 단계 에서 우 리 는 이미 지 를 확장 했다.여기 서 우 리 는 확 장 된 부분 값 을 제거 하고 시각 화 된 목적 을 바탕 으로 결과 의 상한 선 을 다시 배열 하여 원점(0,0)을 이미지 중심 에 대응 시 킬 수 있다.
7.귀 일화.현재 얻 은 폭 치 이미 지 는 여전히 너무 커서 표 시 된 범 위 를 초과 하고 이 범위 내의 값 을 귀 일화 하면 가시 화 된 목적 을 더욱 달성 할 수 있다
실현 절차
void _DFT(){
//1
Mat srcImage = imread("miFan.jpg",0);
if (!srcImage.data){ cout << "Error
"; }
imshow(" ", srcImage);
//2 , 0
int m = getOptimalDFTSize(srcImage.rows);
int n = getOptimalDFTSize(srcImage.cols);
// 0
Mat padded;
copyMakeBorder(srcImage, padded, 0, m - srcImage.rows,
0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0));
//3 ( )
//
Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
Mat complexI;
merge(planes, 2, complexI);
//4
dft(complexI, complexI);
//5 , => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
//
split(complexI, planes);//planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
magnitude(planes[0], planes[1], planes[0]);
Mat magImage = planes[0];
//6
magImage += Scalar::all(1);
log(magImage, magImage);//
//7
// ,
magImage = magImage(Rect(0, 0, magImage.cols&-2, magImage.rows&-2));
// ,
int cx = magImage.cols / 2;
int cy = magImage.rows / 2;
Mat q0(magImage, Rect(0, 0, cx, cy));
Mat q1(magImage, Rect(cx, 0, cx, cy));
Mat q2(magImage, Rect(0,cy,cx,cy));
Mat q3(magImage, Rect(cx,cy,cx,cy));
// ( )
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
// ( )
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
//8 , 0 1
normalize(magImage, magImage, 0, 1, CV_MINMAX);
//9
imshow(" ", magImage);
waitKey();
}
푸 리 엽 변환 후의 그림
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Opencv 학습 노트 (2): Opencv 의 기본 데이터 형식 과 데이터 구조매트릭스 데이터 형식: C 언어 에서 2 차원 데이터 중의 데이터 형식, 예 를 들 어 int, float, char 등 과 같다.Opencv 에서 행렬 의 데이터 형식 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.