Opencv 푸 리 엽 변환 실현

푸 리 엽 변환 은 그림 을 사인 과 코사인 으로 분해 하고 그림 을 공역 에서 시간 영역 으로 변환 합 니 다.모든 함 수 는 무수 한 사인 과 코사인 함수 의 합 을 비슷 하 게 나 타 낼 수 있다.푸 리 엽 의 변환 은 바로 이 단 계 를 실현 하 는 것 이다.수학 에서 2 차원 이미지 의 푸 리 엽 은 다음 과 같이 바 뀌 었 다.
这里写图片描述  
공식 에서 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(); }

푸 리 엽 변환 후의 그림

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기