SaigeVision ImageProcess Quick Start - Photometric Stereo
이 문서는 ImageProcess 기능 중 Photometric Stereo에 대해서 사용하는 방법에 대해 설명합니다.
기능 소개
Overall pipeline
Photometric stereo 기술은 상, 하, 좌, 우 방향으로 조명을 가한 4장의 이미지를 제공받아 표면의 이물, 스크래치 등 결함으로 판단될 가능성이 있는 영역을 시각화해 보여주는 기술입니다.
Input data
같은 검사 대상물을 여러 방향으로 조명을 가해 촬영한 이미지 최소 3장 (권장 4장) 과 그에 해당하는 조명 방향각 값이 인풋으로 사용됩니다. 최대한 다양한 방향의 조명으로 촬영하는 것이 바람직하며, 기본적으로는 상, 하, 좌, 우 90도 단위로 4장을 촬영하는 것이 권장됩니다. 이미지 갯수와 조명 방향각 값 갯수는 동일하게 제공되어야 합니다.
Output data
모드별로 주요 영역을 시각화한 grayscale 이미지 1장이 반환됩니다. 원본 이미지와 height, width가 같습니다.
Shape
|
GradientX
|
GradientY
|
Albedo
|
API Detail
아래는 ‘Photometric Stereo’를 설명하기 위한 샘플 코드입니다.
{
SaigePhotometricStereo stereo = new SaigePhotometricStereo(0, CalculataionFlags.BASIC);
List<Bitmap> _images = new List<Bitmap>();
string path = @"..\..\images";
_images.Add(new Bitmap(Path.Combine(path, "upper.bmp")));
_images.Add(new Bitmap(Path.Combine(path, "right.bmp")));
_images.Add(new Bitmap(Path.Combine(path, "left.bmp")));
_images.Add(new Bitmap(Path.Combine(path, "bottom.bmp")));
var option = stereo.GetAnalyzeOptions();
option.Elevation = 30;
stereo.SetAnalyzeOptions(option);
stereo.SetImage(_images[0], _images[1], _images[2], _images[3]);
stereo.PhotometricStereoAnalyze();
var resultOption = stereo.GetResultOptions();
resultOption.Mode = ModeFlags.ALBEDO;
// ALBEDO, GRADIENT, SHAPE MODE 에서 적용되는 OPTION 입니다.
resultOption.Shader = ShaderFlags.LEVEL2;
resultOption.Contrast = 10;
resultOption.Brightness = 0;
resultOption.Normalize = true;
// DEPTH MODE 에서 적용되는 OPTION 입니다.
resultOption.Order = (double)num_Order.Value;
resultOption.Cutoff_Frequency = (int)num_CutoffFrequency.Value;
resultOption.Clip_Min = (double)num_ClipMin.Value;
resultOption.Clip_Max = (double)num_ClipMax.Value;
stereo.SetResultOptions(resultOption);
Bitmap bmp = stereo.GetResultImage();
stereo.Dispose();
}
Inspection
SaigePhotometricStereo 사용하기 위한 초기화 함수입니다. Build에 따른 시간이 소요될 수 있습니다.
SaigeVision V1과 동시에 사용할 경우 먼저 호출해줘야합니다.
CalculataionFlags 는 연산 속도를 선택할 수 있는 모드로 basic, fast 두가지 모드가 있습니다.
- BASIC: 기본모드 입니다.
- FAST: 연산 속도는 빨리지며 사용하는 GPU 메모리도 증가합니다.
SaigePhotometricStereo stereo = new SaigePhotometricStereo(int GPUIndex, Enum CalculataionFlags);
이미지 추론에 사용하는 Option에 대해서 설정 및 적용 가능한 함수 (GetOptions, SetOptions)
Elevation 촬영 시 이미지 중심점으로부터 조명까지의 고도각 (elevation angle) 을 degree 단위로 표현한 값입니다.
Tilt_Degree (이미지 우측이 0도, 반시계 방향)
- Top, Bottom, Left, Right: 광원의 방향입니다. Image에서 top과 매칭되며 촬영에 맞는 각도를 입력하면 됩니다.
var option = stereo.GetOptions();
option.Elevation = 30;
option.Tilt_Degree_Top = 90;
option.Tilt_Degree_Bottom = 270;
option.Tilt_Degree_Left = 180;
option.Tilt_Degree_Right = 0;
stereo.SetOptions(option);
SetImage의 경우 검사를 위한 이미지를 설정하는 함수입니다. 3장 또는 4장의 이미지가 입력되어야 합니다.
stereo.SetImage(Bitmap top, Bitmap right, Bitmap left, Bitmap bottom);
stereo.SetImage(Bitmap top, Bitmap right, Bitmap left, null);
null 의 경우 4개의 param 중 한곳에 입력 가능
PhotometricStereoAnalyze option에 대한 설정이 완료되면 PhotometricStereoAnalyze 을 통해 검사를 실시합니다
stereo.PhotometricStereoAnalyze();
결과 이미지를 받아로기 위한 SaigePhotometricStereoResultImageOption에 대해서 설정 및 적용 가능한 함수 (GetResultImageOptions, SetResultImageOptions)
ModeFlags 의 경우 이미지 분석 결과를 바탕으로 다섯가지 종류의 후 처리 된 이미지 결과를 얻는 API
- SHAPE: 흠집 검사에 적합합니다
- ALBEDO: 표면 반사도를 표현합니다
- GRADIENT_X: 표면의 X방향 경사 변화도를 나타냅니다
- GRADIENT_Y: 표면의 Y방향 경사 변화도를 나타냅니다
- DEPTH: 표면의 깊이를 나타냅니다.
Shader 낮을 수록 평평하고 높을 수록 입체감이 드러나며, 처리시간이 소폭 증가합니다. (1~5, 기본=2)
Contrast 명암비입니다. 낮을 수록 대비가 낮고 높을 수록 대비가 높아집니다. (-100~100, 기본=10)
Brightness 이미지의 밝기입니다. 낮을 수록 어두워지고 높을 수록 밝아집니다. (-30~30, 기본0)
normalize 결과물의 정규화 여부를 선택합니다. False일 경우 실제 이미지에 더 가깝습니다.
Order 고주파 통과 필터의 차수입니다. 값이 커질수록 저주파 성분이 더 많이 없어집니다. (0.1~5.0, 기본=1.0)
Cutoff Frequency 고주파 통과 필터의 cutoff frequency입니다. cutoff frequency 이상의 주파수 값은 없애지 않습니다. (1~, 기본=10)
Clip Min 이미지의 픽셀값 하한입니다. clip_min * 255 이하의 픽셀값이 모두 0으로 치환되고, 그 이상의 값은 0~255로 mapping 됩니다. (0.0~1.0, 기본=0.0)
Clip Max 이지지의 픽셀값 상한입니다. clip_min * 255 이상의 픽셀값이 모두 255로 치환되고, 그 이하의 값은 0~255로 mapping 됩니다. (0.0~1.0, 기본=1.0)
var resultOption = stereo.GetResultImageOptions();
resultOption.Mode = ModeFlags.ALBEDO;
// ALBEDO, GRADIENT, SHAPE MODE 에서 적용되는 OPTION 입니다.
resultOption.Shader = ShaderFlags.LEVEL2;
resultOption.Contrast = 10;
resultOption.Brightness = 0;
resultOption.Normalize = true;
// DEPTH MODE 에서 적용되는 OPTION 입니다.
resultOption.Order = (double)num_Order.Value;
resultOption.Cutoff_Frequency = (int)num_CutoffFrequency.Value;
resultOption.Clip_Min = (double)num_ClipMin.Value;
resultOption.Clip_Max = (double)num_ClipMax.Value;
stereo.SetResultImageOptions(resultOption);
PhotometricStereoAnalyze 후 GetResultImage 함수를 통하여 최종 이미지를 가져옵니다
Bitmap result_image =stereo.GetResultImage();
모든 검사가 완료되었다면 Dispose 를 통해 해제해 줍니다.
stereo.Dispose();