일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JSON
- 이미지파일 특성으로 폴더분류
- 2D 이미지 높이 측정
- Phase Map 이미지
- Generative Adversarial Networks
- music data
- labeling
- 데이터 전처리
- 논문리뷰
- CelebA
- 자체 데이터 제작
- PAPER
- CT 영상에서 U-Net 기반 변형가능 컨볼루션 GAN을이용한 잡음제거
- Image Inpainting
- Generative Adversarial Nets
- Phase Map
- AI 대회
- gan
- 논문 리뷰
- json 파일 정보 csv파일로 저장
- 이미지 특징
- Python
- 이미지 복원
- json 파일로 image 라벨링
- 백준
- Moire 이미지
- C-RNN-GAN:Continuous recurrent neural networkswith adversarial training
- horse2zebra
- Coherent Semantic Attention for Image Inpainting
- mnist
- Today
- Total
Deep Learning through deep learning
#1 Phase Map Image 제작 (C++) 본문
2D 이미지에 Moire 패턴을 투영시켜 얻은 이미지를 토대로 3D 높이 측정을 할 수 있다.
수많은 공장 부품이나 소자들의 높이를 2D 이미지만으로 측정할 수 있으며, 이를 위해서는 Moire 패턴이 투영된 이미지가 필요하다.
이미지는 총 4장의 이미지가 사용되며 0도, 90도, 180도, 270도로 투영된 Moire 이미지이다.
높이 측정에 앞서 Phase Map 이미지를 제작해보고자 한다.
Introduction
PCB 부품의 4장의 Moire 패턴이 투영된 이미지는 다음과 같다.
각각 각도가 다른 Moire 패턴이 투영되어 cos파를 이훈다.
픽셀값이 점차 어두워졌다가 밝아졌다를 반복하며 Moire 패턴이 만들어진다.
이 4장의 사진을 통해 Phase Map 으로 변환한 결과 이미지는 다음과 같다.
4장의 Moire 이미지를 입력으로 넣어, 그림과 같은 Phase Map 이미지를 얻었다.
Phase Map에 그라데이션으로 그려진 선과 소자들간의 선 위치 차이를 가지고 높이를 추정할 수 있다.
Coding C++
전체 코드이다.
void make_phase_with_shadow() {
cv::Mat moire_000 = imread("moire_180.bmp", 0);
cv::Mat moire_090 = imread("moire_090.bmp", 0);
cv::Mat moire_180 = imread("moire_000.bmp", 0);
cv::Mat moire_270 = imread("moire_270.bmp", 0);
moire_000.convertTo(moire_000, CV_32FC1);
moire_090.convertTo(moire_090, CV_32FC1);
moire_180.convertTo(moire_180, CV_32FC1);
moire_270.convertTo(moire_270, CV_32FC1);
int height = moire_000.rows;
int width = moire_000.cols;
cv::Mat phase = cv::Mat::zeros(height, width, CV_32FC1);
float intensity = 30;
int freq = height / 3;
int count = (height / freq) + 1;
std::vector<float> gap;
gap.clear();
for (int g = 0; g < count; g++)
{
float temp_length = freq * g * 1.0;
gap.push_back(temp_length);
}
gap.push_back(height);
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
phase.at<float>(i, j) = std::atan2(double(moire_270.at<float>(i, j) - moire_090.at<float>(i, j)), double(moire_000.at<float>(i, j) - moire_180.at<float>(i, j)));
}
}
normalize(phase, phase, 0., 255.0, NORM_MINMAX);
imwrite("phase_map.bmp", phase);
int a = 0;
}
메인 코드는 아래와 같다.
int main()
{
make_phase_with_shadow();
}
이미지를 함수에서 일일이 변경하기는 귀찮지만 이는 참고하길 바란다.
코드 분석이다.
cv::Mat moire_000 = imread("moire_180.bmp", 0);
cv::Mat moire_090 = imread("moire_090.bmp", 0);
cv::Mat moire_180 = imread("moire_000.bmp", 0);
cv::Mat moire_270 = imread("moire_270.bmp", 0);
1. 먼저 4장의 moire 이미지를 불러온다. 각도가 0도와 180도가 바뀌었는데, 이는 육안으로 결과이미지를 확인하고 필요에 맞게 조정하면 된다.
moire_000.convertTo(moire_000, CV_32FC1);
moire_090.convertTo(moire_090, CV_32FC1);
moire_180.convertTo(moire_180, CV_32FC1);
moire_270.convertTo(moire_270, CV_32FC1);
2. 4장의 사진을 float 형식으로 바꾸어준다.
int height = moire_000.rows;
int width = moire_000.cols;
cv::Mat phase = cv::Mat::zeros(height, width, CV_32FC1);
3. height은 이미지 높이, width 는 이미지 가로길이를 의미한다, phase라는 이미지를 생성하여 모든 픽셀값을 0으로 초기화해준다. 결과이미지는 phase에 저장된다.
float intensity = 30;
int freq = height / 3;
std::vector<float> gap;
gap.clear();
for (int g = 0; g < count; g++)
{
float temp_length = freq * g * 1.0;
gap.push_back(temp_length);
}
gap.push_back(height);
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
phase.at<float>(i, j) = std::atan2(double(moire_270.at<float>(i, j) - moire_090.at<float>(i, j)), double(moire_000.at<float>(i, j) - moire_180.at<float>(i, j)));
}
}
4. phase map 이미지를 만들기 위한 변수들을 선언, for문을 이용해 4장의 moire 이미지를 조합하여 phase map 이미지를 생성한다.
normalize(phase, phase, 0., 255.0, NORM_MINMAX);
imwrite("phase_map.bmp", phase);
int a = 0;
5. 결과 이미지를 정규화하여 원하는 위치에 저장한다.
else
4각도 (0,90,180,270) 에서 Moire 패턴을 투영한 이미지를 Phase Map 이미지로 변환하는 과정을 살펴보았다.
Phase Map 이미지를 가지고 3D 높이 측정이 가능하다.
해당 블로그를 참고하였다.
https://todamfather.tistory.com/52
3D Moire Scanner 개발 - 모아레(Moire) 현상을 이용한 3차원 형상 측정의 원리
개인 개발의 첫 프로젝트로 3D scanner의 핵심 알고리즘을 구현해 볼까 합니다. 3차원(3D) 측정 알고리즘에는 여러 가지가 있겠지만 산업현장에서 보편적으로 널리 쓰이는 모아레 알고리즘을 구현
todamfather.tistory.com