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