일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Binary
- compare
- public
- Overloading
- parameter
- atmega328
- Barcode
- sensor
- mfc
- stream
- UNO
- Read
- preprocessing
- file access
- Unity
- flutter
- Class
- memory
- java
- inheritance
- Android
- length
- Contour
- APP
- SERIAL
- Pointer
- wpf
- Encapusulation
- aduino
- digitalRead
- Today
- Total
폴크(FOLC)
C# - 머신 비전 알고리즘 - OpenCV - 이미지처리28 본문
# 디지털 이미지 처리
# 이미지의 상태 정보에서 특별한 정보를 제거한다
> 특별한 주파수 성분을 제거한다.
# 이미지 처리 - 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);
}
'머신 비전 > 머신 비전 알고리즘 테크닉 C#' 카테고리의 다른 글
C# - 머신 비전 알고리즘 - OpenCV - 이미지처리31 (0) | 2021.10.22 |
---|---|
C# - 머신 비전 알고리즘 - OpenCV - 이미지처리21 (0) | 2021.10.22 |
C# - 머신 비전 알고리즘 - OpenCV - 이미지처리20 (0) | 2021.10.20 |
C# - 머신 비전 알고리즘 - OpenCV - 이미지처리19 (0) | 2021.10.20 |
C# - 머신 비전 알고리즘 - OpenCV - 이미지처리18 (0) | 2021.10.20 |