반응형
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)

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

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

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

folcjin 2021. 10. 22. 19:56
728x90
반응형

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

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

# Cv2.Dft, Cv2.Idft
   > Mat padded = new Mat(), complexI = new Mat();
   > int m = Cv2.GetOptimalDFTSize(srcImage.Rows);
   > int n = Cv2.GetOptimalDFTSize(srcImage.Cols);
   > Cv2.CopyMakeBorder(srcImage, padded, 0, m - srcImage.Rows, 0, n - srcImage.Cols, BorderTypes.Constant, Scalar.All(0));
      Mat[] planes = new Mat[2];
      planes[0] = new Mat<float>(padded);
      planes[1] = Mat.Zeros(padded.Size(), MatType.CV_32F);
      Cv2.Merge(planes, complexI);                        // Add to the expanded another plane with zeros
      Cv2.Dft(complexI, complexI);                        // this way the result may fit in the source matrix
      Cv2.Split(complexI, out planes);                    // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
      Cv2.Magnitude(planes[0], planes[1], planes[0]);     // planes[0] = magnitude
      Mat magI = planes[0];
      magI += Scalar.All(1);                              // switch to logarithmic scale
      Cv2.Log(magI, magI);

      magI = magI.Clone(new Rect(0, 0, magI.Cols & -2, magI.Rows & -2));

      int cx = magI.Cols / 2;
      int cy = magI.Rows / 2;
      Mat q0 = new Mat(magI, new Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
      Mat q1 = new Mat(magI, new Rect(cx, 0, cx, cy));  // Top-Right
      Mat q2 = new Mat(magI, new Rect(0, cy, cx, cy));  // Bottom-Left
      Mat q3 = new Mat(magI, new Rect(cx, cy, cx, cy)); // Bottom-Right
      Mat tmp = new Mat();                              // 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);

      
Cv2.Normalize(magI, magI, 0.0, 1.0, NormTypes.MinMax);
}

{
      Mat complexI = new Mat();
      Mat[] planes = new Mat[2];
      Cv2.Split(complexI, out planes);
      Mat magI = planes[0];

      int cx = magI.Cols / 2;
      int cy = magI.Rows / 2;
      Mat q0 = new Mat(magI, new Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
      Mat q1 = new Mat(magI, new Rect(cx, 0, cx, cy));  // Top-Right
      Mat q2 = new Mat(magI, new Rect(0, cy, cx, cy));  // Bottom-Left
      Mat q3 = new Mat(magI, new Rect(cx, cy, cx, cy)); // Bottom-Right
      Mat tmp = new Mat();                                // 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);

      Mat result = new Mat();
      Cv2.Idft(complexI, result);
      planes[0] = complexI.Clone();
      planes[1] = complexI.Clone();
      Cv2.Split(result, out planes);
      Cv2.Magnitude(planes[0], planes[1], result);
      Cv2.Normalize(result, result, 0.0, 1.0, NormTypes.MinMax);
      result.ConvertTo(dstImage, MatType.CV_8UC1, 255.0);
 }

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