반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

폴크(FOLC)

머신 비전 알고리즘 - OpenCV - 이미지처리28 본문

머신 비전/머신 비전 알고리즘 테크닉 CPP

머신 비전 알고리즘 - OpenCV - 이미지처리28

folcjin 2021. 8. 10. 09:03
728x90
반응형

# 디지털 이미지 처리
   # 이미지의 상태 정보에서 특별한 정보를 제거한다
      > 특별한 주파수 성분을 제거한다.

# 이미지 처리 - OpenCV 4.5.3 으로 테스트
   # 이미지의 상태 정보에서 특별한 정보를 제거
   > srcImage : 입력, dstImage : 결과

# cv::dft, cv::idft
   > cv::Mat padded, complexI;
   > const int m = cv::getOptimalDFTSize(srcImage.rows);
   > const int n = cv::getOptimalDFTSize(srcImage.cols);
   > cv::copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, cv::BORDER_CONSTANT,
   > cv::Scalar::all(0));
   > cv::Mat planes[] = {cv::Mat_<float>(padded), cv::Mat::zeros(padded.size(), CV_32F)};
   > cv::merge(planes, 2, complexI); // Add to the expanded another plane with zeros
   > cv::dft(complexI, complexI); // this way the result may fit in the source matrix

   > cv::split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
   > cv::magnitude(planes[0], planes[1], planes[0]); // planes[0] = magnitude

   > cv::Mat magI = planes[0];
   > magI += cv::Scalar::all(1); // switch to logarithmic scale
   > cv::log(magI, magI);

   > magI = magI(cv::Rect(0, 0, magI.cols & -2, magI.rows & -2));

   > const int cx = magI.cols/2;
   > const int cy = magI.rows/2;
   > cv::Mat q0(magI, cv::Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
   > cv::Mat q1(magI, cv::Rect(cx, 0, cx, cy));  // Top-Right
   > cv::Mat q2(magI, cv::Rect(0, cy, cx, cy));  // Bottom-Left
   > cv::Mat q3(magI, cv::Rect(cx, cy, cx, cy)); // Bottom-Right
   > cv::Mat tmp; // swap quadrants (Top-Left with Bottom-Right)
   > q0.copyTo(tmp);
   > q3.copyTo(q0);
   > tmp.copyTo(q3);
   > q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left)
   > q2.copyTo(q1);
   > tmp.copyTo(q2);

   > cv::normalize(magI, magI, 0.0, 1.0, cv::NORM_MINMAX);

 

{
   > cv::split(complexI, planes);
   > cv::Mat magI = planes[0];

   > const int cx = magI.cols / 2;
   > const int cy = magI.rows / 2;
   > cv::Mat q0(magI, cv::Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
   > cv::Mat q1(magI, cv::Rect(cx, 0, cx, cy));  // Top-Right
   > cv::Mat q2(magI, cv::Rect(0, cy, cx, cy));  // Bottom-Left
   > cv::Mat q3(magI, cv::Rect(cx, cy, cx, cy)); // Bottom-Right
   > cv::Mat tmp; // swap quadrants (Top-Left with Bottom-Right)
   > q0.copyTo(tmp);
   > q3.copyTo(q0);
   > tmp.copyTo(q3);
   > q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left)
   > q2.copyTo(q1);
   > tmp.copyTo(q2);

   > cv::Mat result;
   > cv::idft(complexI, result);
   > cv::Mat planes[] = { cv::Mat(complexI.size(), CV_32FC1), cv::Mat(complexI.size(), CV_32FC1) };
   > cv::split(result, planes);
   > cv::magnitude(planes[0], planes[1], result);
   > cv::normalize(result, result, 0.0, 1.0, cv::NORM_MINMAX);
   > result.convertTo(dstImage, CV_8UC1, 255.0);
}

728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --