출처가 없는 이미지는 Digital Image Processing 교재 (Gonzalez 저자) 이미지입니다.


영상처리 수업에서 배운 내용을 정리한 포스팅입니다.


Intensity Transformation은 이미지의 명도가 사용자가 보기 불편할 때 편하게 해주는 변환입니다.



Power-law (gamma) transformations


https://tutorialhunk.com/power-law-transformation-in-digital-image-processing/



이미지를 위의 그래프에서 적절한 값을 찾아서 인풋 명도를 아웃풋 명도로 매칭시킵니다.



그러면 어두운 부분이 밝아지고 잘 보이지 않았던 영역을 잘 보고 판단할 수 있습니다.


반면에 밝은 부분의 차이는 적어질 수 있습니다.


Contrast Stretching


https://www.researchgate.net/figure/Explanatory-illustration-of-contrast-stretching-transformation_fig9_44650125    

Contrast stretching도 원하는 부분의 명도의 차이를 확대시켜 구별하기 좋게 변환하는 기법입니다.


Intensity level slicing

ict.udlap.mx/people/oleg/docencia/imagenes/chapter3/image_313_IS548.html



일종의 임계값을 줘서 원하는 부분을 밝게 보는 기법입니다.


특정 부위를 더 뚜렷하게 볼 때 사용할 수 있겠습니다.


Histogram Equalization

https://digitalpadm.com/image-contrast-enhancement-cumulative-histogram-equalization/


몰려있는 명도값들을 골고루 퍼뜨려 주는 기법입니다.


히스토그램의 PDF, CDF를 통해서 명도값들을 매칭해주고 재배치 시켜주면 


명도값들이 골고루 퍼지는 원리입니다.


제일 광범위하게 쓰입니다. 



인공지능개론을 듣고 있는데 교수님이 매우 칭찬하셨던 영상이 기억에 남았습니다.


바로 욜로입니다.


여기서 YOLO의 뜻은 You Only Look Once 입니다.


수천 번의 분류와 수천 번의 신경망의 판독을 거치지 않고 


단일 네트워크로 한 번에 빠르게 판단하기 때문에 붙여진 이름입니다.    



사물 인식이 빠른 속도로 비교적 정확하게 잘 됩니다.

https://pjreddie.com/darknet/yolo/


교수님은 우선 기술 자체도 대단하지만 컨셉, 작품성이 뛰어나다고 하셨습니다.



홈페이지도 다크넷에 맞게 어둡고 신비롭습니다.


또한 영상도 적절한 음악을 넣어서 보기 좋게 만들어서 어필 또한 잘했다고 생각합니다.


https://pjreddie.com/darknet/yolo/ 에 친절하게 코드와 사용법까지 모두 첨부되어있습니다.



https://tv.naver.com/v/2494042/list/179826 는 테드 강연입니다.


가진 기술을 무료로 배포하고 사용할 수 있게하다니 정말 멋있는 사람입니다.


관심있는 분들은 시청해보세요 ㅎ



opencv를 사용하여 AI프로그램을 개발해보았습니다.


팀원들과 졸업작품으로 제작하였고


영상을 입력으로 넣어주면 학습된 데이터를 토대로 영상이 실내 영상인지 실외 영상인지 판단해주는 프로그램입니다.



사용된 기술은 SVM (Support Vector Machine), BOW (Bag of Word), BlkDFT 입니다.


Scene Recognition는 장면을 인식하는 것입니다.



SVM은 기계학습 중 패턴인식이나 자료분석을 위한 지도학습 모델이고


데이터를 분류하는 최적선을 찾는 원리입니다.


BOW는 원래 문서를 자동으로 분류하기 위한 기법으로 영상처리에는 이미지 분류, 검색에 사용됩니다. 


C++, Opencv로 비교적 쉽게 접근할 수 있었습니다.


BlkDFT 즉 Block DFT는 이미지를 부분적으로 DFT한 기법입니다.



(Depth Estimation from Image Structure IEEE 2002년 논문)


이 원리들을 통해 미리 사진으로 데이터를 학습시키고


영상을 입력하면 Indoor Outdoor를 구분하는 프로그램을 만들었습니다.




이번 글은 호모그래피를 사용한 비디오 안정화입니다.


팀원들과 졸업작품으로 진행했습니다.


영상을 입력으로 주면 기울기 노이즈 값을 보정하여 영상을 보여줍니다.



opencv, C++로 프로그램을 제작하였고


사용된 기술들은 SURF, ORB, Homography, RANSAC, Kalman Filter, Affine Transform입니다.


Homography란?


2D평면에서 임의의 사각형을 임의의 사각형으로 매핑할 수 있는 변환입니다.



칼만필터(Kalman Filter)란?


잡음이 포함되어 있는 선형 역학계의 상태를 추적하는 재귀 필터로


과거의 정보와 새로운 측정값을 사용하여 측정값에 포함된 잡음을 제거시켜 추정값을 얻습니다.


위성, 미사일 제어분야에도 사용됩니다.


Ransac이란?


http://kkhipp.tistory.com/50


제 블로그에 RANSAC 포스팅을 했었습니다. 참고해주세요~



해당 프로그램 흐름도입니다.

4학년 영상신호처리 과목을 수강하면서 새롭게 많이 배운 부분은 Frequency domain으로 처리하는 것이었습니다.


이때동안 Edge detection, Gaussian filter, 컬러변환, 특징점 추출 등은 다 Spatial domain으로 다뤘었습니다.


Spatial Filtering은 보통 마스크로 컨볼루션을 통해서 처리하는 반면


Frequency Filtering은 DFT를 통해 주파수 도메인에서 처리를 한후 


IDFT 를 통해  다시 Spatial Domain으로 돌아옵니다.


1. 제로패딩을 한다. 보통 2배  


2. 패딩한 이미지에 (-1)^(x+y)를 한다.  (symmentric한 주파수 도메인 이미지를 얻기위해)


3. DFT를 한다. F(u,v)


4. 필터와 곱한다. G(u,v)= H(u,v)F(u,v)


5. IDFT한다. 


6. 제로패딩 영역을 제외하고 원본의 이미지 크기만 얻는다.



input image를 DFT하여 Mag와 Phase를 얻은 이미지입니다. 



Frequency Filtering을 통해 LPF를 구현한 모습입니다.


우선 LPF를 통해 고주파 부분을 제거했고 LPF의 Discontinuity 특성 때문에


Ringing effect가 나타납니다. (일렁이는 부분)


LPF의 크기에 따라 특성이 달라집니다.


rad가 커질수록 원본 이미지의 데이터가 많아져 원본과 가까운 이미지가 얻어집니다. 





HPF를 구현한 모습입니다.


마찬가지로 Ringing effect가 나타나고 


저주파 부분이 사라져(DC부분이 사라짐) 전체적인 이미지가 어두워 집니다.


Moire Pattern(규칙적인 패턴 잡음)제거를 하는 Selective Filtering에도 사용됩니다.



위치인식은 삶에서 중요한 부분을 차지하고 있습니다.


네비게이션, 구글맵 등 GPS(Global Positioning System, 위성 위치 확인 시스템) 기반으로 잘 활용되고 있죠.



운전 시 네비게이션은 이제 필수고 여행을 다닐 때는 구글맵으로 많은 도움을 받죠.


하지만 실내에선 다음과 같은 서비스를 이용하기 힘듭니다.


왜냐하면 GPS의 한계 때문이죠. 


GPS의 오차는 실내에서 사용하기에 아직 크고 또한 건물 내에서 위성신호를 잘 받지 못하기 때문입니다. 


이제 여러가지의 IPS(Indoor Positioning System, 실내 위치 인식 시스템)을 살펴보겠습니다.



WLAN


건물 내에 Wi-Fi AP(Access Point)와 스마트폰의 수신 신호 세기를 측정하여 실내 위치를 파악합니다.



블루투스


RSSI(Received Signal Strength Indication)을 이용하여 위치를 파악합니다.


블루투스 많이 사용하시죠. 저도 개발도중 블루투스 RSSI를 사용해본적이 있는데 생각보다 오차가 심하고 거리에 한계가 있더라고요.




센서 이용


스마트폰에 있는 가속도, 방향, 관성센서 같은 걸 활용해 위치를 파악합니다.


여러 대기업에서 실내 위치인식 관련 스타트업 기업을 많이 사들였는데요.


과연 어떤 기술이 성공할지는 모르겠습니다.



그래도 저는 WLAN 쪽이 발전 가능성이 크다고 생각합니다. 왜냐하면 Li-Fi때문입니다.


LED 조명을 통해서 통신이 가능한데 이를 가시광 통신(Visible Light Communication, VLC)이라고 합니다. 


이를 위치 인식에 활용하면 Access Point가 더 촘촘해지기 때문에 위치인식이 더 정확해질 것입니다.



또 어떠한 기사를 봤는데 영상처리를 통해서 위치추적이 가능하더라고요.

이스라엘 스타트업인 Shopcloud에서 스마트폰의 카메라나 자이로 센서를 통해서 실내 위치인식을 합니다.


영상처리를 통해서 위치인식을 한다는 것이 참 좋은 아이디어라고 생각합니다.


보통 실제로도 주변의 간판이나 랜드마크를 통해서 위치를 파악하기 때문입니다.


카메라를 통해서 현재 위치를 파악하고 센서를 통해서 움직임을 통해 길을 안내해주는 시스템!!!


아니면 센서를 사용하지 않고 


Visual Odometry를 통해서 길을 안내할 수도 있을듯 합니다.


특징점들을 통해 사용자의 위치 움직임을 따낼수 있습니다.


관련 영상입니다.


https://www.youtube.com/watch?v=IKKlx2JYmNQ


Shopcloud 관련 링크입니다


https://blog.naver.com/koisraco/90189866630


이번 포스팅은 RANSAC과 최소자승법을 다루도록 하겠습니다.


다크프로그래머님의 블로그를 참고했습니다~


http://darkpgmr.tistory.com/


RANSAC은 Random Sample Consensus의 약자입니다.


RANSAC은 영상처리에 자주 등장하는 알고리즘입니다.



먼저 RANSAC을 다루기 전에 최소자승법을 간단히 알고 넘어가겠습니다.


최소자승법이란 최소제곱법라고도 부르고 영어로 LSM(Least Squared Method) or LMS(Least Mean Square)라고 부릅니다.


논문을 보면 LMS, LSM용어가 많이 등장합니다.


최소자승법은 특정한 데이터의 모델 파라미터를 Residual^2의 합이 최소화 되도록 구하는 방법입니다.

여기서 파란 점들이 데이터고 빨간선이 데이터들을 통해 파악한 모델입니다. 


여기선 모델이 직선으로 판단되었으니 f(x) = ax+b 꼴이 되겠습니다. 여기서 a,b가 파라미터입니다.


그리고 Residual은 데이터가 빨간선에서부터 얼마나 떨어졌는가입니다.


데이터들이 (x1,y1),...,(xi,yi)라고 표현하면 Residual은 yi - f(xi)라고 표현합니다.


여기서 결론은 

를 최소화하는 모델의 파라미터를 구하는 것 입니다.


이런 최소자승법은 영상처리에서 밝기 보정에 쓰일 수 있습니다.


그냥 A4용지를 촬영하면 빛에 의해 그냥 단색으로 보이는게 아니라 어느 부분은 어둡게 어느 부분은 밝게 나오는데


최소자승법을 통해 밝기의 변화를 파악해 단색으로 보정할 수 있습니다.


하지만 최소자승법에는 한계가 있습니다.


바로 Outlier(정상적인 분포에서 동떨어진 예외같은 데이터)가 있으면 이상적인 모델을 얻기 힘듭니다.


이를 해결하기 위한 방법에는 RANSAC이나 M-estimator가 있습니다.



그럼 이제 RANSAC에 대해서 알아보겠습니다!

RANSAC은 무작위로 샘플 데이터를 뽑은 다음 최대로 합의된 것을 선택한다는 의미입니다.


즉, 가장 많은 수의 데이터가 적합하다고 생각하는 모델을 선택하는 기법입니다.


여기서 RANSAC이 선택한 모델에서 많이 벗어나는 데이터들을 Outlier, 그렇지 않은 데이터를 Inlier라고 생각하면 됩니다.


제가 상상한 RANSAC최소자승법의 결과값입니다.


모델은 일차 직선으로 잡고 파라미터를 찾을 경우입니다. 데이터 중간에 아래로 치우친 Outlier들이 있습니다. 


따라서 최소자승법은 Outlier들이 영향으로 아래로 치우치게 되었습니다.


하지만 최소자승법은 Outlier들의 영향을 거의 받지 않는 이상적인 값을 찾게 됩니다. 



RANSAC의 절차는 다음과 같습니다.


1. 무작위로 샘플 데이터를 뽑아 모델 파라미터를 구합니다.


2. 모델과 가까이 있는 데이터의 수를 파악하고 이전 값보다 큰 값이면 기억합니다.


(이 과정은 임계값을 잡고 Residual가 그 값보다 작은 데이터의 수를 구하면 됩니다.)


3. 이 과정을 N번 반복해 최대값을 가진 파라미터를 찾습니다.


이 RANSAC은 카메라 모션 추적, 물체 찾기, 비디오 안정화 등 에서 사용됩니다.




 




카이스트에서 주최하는 국내 최고의 지능로봇 경진대회입니다.


본선에 대통령상이 있어서 경쟁도 치열하고 대회수준도 높습니다.


종목은 Huro Competition, Soc 태권로봇, Soc Drone 이렇게 세가지로 이루어져있습니다.


SOC는 System on chip의 약자입니다.


저는 Huro Competition에 참가했는데요.


홈페이지를 보면 지능형 휴머노이드 로봇의 미션수행 경기로 영상인식과 센서인식을 이용해 경기장에 설치된


장애물을 회피 또는 해당 미션을 수행하게 된다. 미션의 빠른 수행, 미션통과 횟수/난이도에 따라 순위를 결정짓게 된다고 나와있습니다.


먼저 대회에 참가할 수 있는 기본적인 실력이 있는지 판단하기 위해 출전자격 TEST가 있습니다.


기본적인 물체인식 프로그래밍을 하는 것 입니다.


출전자격 TEST나 본선에는 Opencv와 같은 라이브러리를 못 사용합니다.


출전가격 Test를 통과하고 로봇융합페스티벌에서 또 경쟁을 벌인 뒤 국제로봇콘테스트에 참가할 수 있습니다.



제가 대회에 참여했을 때 맵과 로봇입니다.(미니로봇 메탈파이터)


로봇을 시작 지점에서 전원을 켜고 나둔 뒤 바리게이트가 열리면 움직이게 하고 여러 장애물들을 통과해 


도착점에 바리게이트가 열릴 때 통과해 도달하게하는 미션입니다.


6명이서 팀으로 참가하고 3명이 로봇 모션, 3명이 영상처리를 분담하여 개발했습니다.


교대 작업을 했기 때문에 github으로 최신코드 공유했습니다. 


정말 많은 시간을 기울이고 오류도 많이 잡고 통신알고리즘 개선해서 시간을 많이 단축시켜 입상을 기대했지만


본선 대회 때 시작 전 테스트를 할 때 갑자기 카메라가 고장나 새로운 카메라로 교체했는데 예상치 못한 변수가 많이 생겨


5위를 해서 아쉽게 입상을 하지 못했습니다.


대회를 하면서 프로그래밍 실력도 많이 늘고 인생에 대해서도 많이 배웠던 프로젝트입니다.ㅋㅋ


대학생활 중 잊지 못 할 대회네요!





이번엔 LED, 영상처리 관련 발표를 할 때 공부했던 색의 3속성과 조도, 휘도, 광속, 광도에 대해서 알아보겠습니다.


자료는 네이버(여러 블로그, 사전), 구글링한 자료를 제가 정리했습니다.


색의 3 속성에는 색상, 명도, 채도가 있습니다.


미술시간에 배웠던 기억이 나는데요.


영상처리를 하기 전 기본적으로 알고 있으면 좋습니다.


먼저 색상 HUE 입니다.


말 그대로 색깔 이라고 생각하시면 됩니다.


빨강과 파랑 그 색의 성질에 따라 이름을 정해놓았는데요. 그 성질을 색상이라고 합니다.

명도는 색의 밝은 정도입니다.


검은색은 예로들면 흰색은 검은색에서 명도가 가장 높고 그 다음 회색, 마지막으로 검정색 순서로 명도가 높습니다.


명도를 검정=0, 흰색=10으로 11단계로 나눌 수 있고


실제로 프로그래밍 할 때 이전에 포스팅했던 grayscale을 예로 들면 RGB값을 평균내어 흑백화 하는데 이는 명도를 나타냅니다.


여기서는 보통 검정=0, 흰색=255로 256단계 8비트입니다.

채도는 색의 진하기 정도라고 보면 됩니다.


흰색, 검정색, 회색은 채도가 없는 무채색이라 부릅니다. 명도만 가지고 있는 색이죠.


오른쪽 아래를 보면 채도를 이해하기 쉬운데 오른쪽으로 갈수록 노랑색이랑 가까워 채도가 높다고 할 수 있습니다.

색의 3속성을 입체적으로 표현한 그림입니다.


Z축은 명도를 나타내며 원판에서 Z축으로 가까워질수록 채도가 낮아집니다.


원판의 각도에 따라서 색상이 변하고 축과의 거리에 따라 채도, 축의 높이에 따라 명도가 바뀝니다.

광속은 전구에서 방출되는 빛의 총량이라고 보시면 되고 단위 기준은 1미터 거리의 초에서 나오는 빛의 양으로 잡았습니다.


전구 판매 정보를 보면 lm 정보를 확인할 수 있습니다.

조도는 단위 면적에 입사되는 빛의 양을 말하고 단위는 럭스입니다.


럭스는 단위면적당 루멘이라고 보시면 됩니다.(1lux = 1lm/m^2 )


따라서 럭스의 기준도 초입니다.

광도는 특정한 방향으로 나오는 빛의 세기이며 단위는 칸델라 입니다.

휘도는 단위 면적에서 반사되는 빛의 양이고 반사되는 빛을 사람이 보기 때문에 눈부심의 정도라고도 표현합니다.

빛의 밝기를 총 정리한 그림입니다.


먼저 위를보면 전구에서 나오는 광속이고 광도는 광속에 각도의 개념을 더했습니다.


조도는 단위면적에 도달하는 빛의 양이고 휘도는 단위면적에서 빛이 반사되는 정도입니다.

 

'전자공학 > 영상처리' 카테고리의 다른 글

실내 위치 인식을 영상처리로?!  (0) 2018.01.09
RANSAC이란? (+최소자승법)  (3) 2018.01.03
카이스트 지능형 SOC 로봇워  (7) 2017.12.23
윤곽선 검출 Edge Detection  (0) 2017.11.11
영상처리 grayscale  (0) 2017.10.31

저번 시간에 Grayscale에 대해서 알아보았는데요


흔히 Grayscale 다음에 하는 작업인 Edge Detection에 대해 알아보겠습니다.


엣지 디텍션 즉 윤곽선 검출은 사진에서 원하는 정도의 윤곽선을 검출해 내는 작업입니다.


저는 대외활동에서 이 엣지 디텍션을 로봇이 길의 경계선을 보고 수평을 맞추는데에 사용했습니다.


윤곽선 검출을 통해서 길의 경계선을 보고 기울기를 판단하여 수평을 맞추는 작업을 했었습니다.


엣지 디텍션은 비교적 쉬운 기법으로 좋은 결과를 얻을 수 있습니다.


먼저 윤곽선 즉 에지에 대한 개념을 알고 가겠습니다.


윤곽선(Edge)이란?


다른 명암도를 가진 경계선, 픽셀의 밝기가 임계값(Threshold) 보다 크게 변하는 경우


그러면 영상에서 윤곽선은 어떻게 찾느냐!


밝기의 변화량 가지고 찾는데 변화량은 미분을 통해서 알 수 있습니다. 


1차 미분 값에서 기울기의 크기로, 2차 미분값에서 기울기의 부호로 밝고 어두움을 판단 할 수 있습니다.


그러면 영상에서는 미분을 어떻게 하느냐!!


바로 마스크로 합니다.


마스크란 미분 연산자와 동일한 효과를 갖는 일종의 필터입니다.


마스크엔 기본 조건이 있습니다.


- 마스크 크기의 가로 세로가 같고 홀수여야 함

- 중심을 기준으로 상하좌우가 대칭이어야 함

- 중심의 수는 항상 0 이상의 양수이다.

- 모든 수의 합은 0이어야 함



우선 대표적인 1차미분 연산인 소벨(Sobel) 마스크를 예로 들어보겠습니다.



대칭적이고 모든 수의 합은 0입니다. 왼쪽이 세로방향에 대한 마스크, 오른쪽이 가로방향에 대한 마스크입니다.


저기서 2가 1로 -2가 -1로 바뀌면 Prewitt마스크입니다. Sobel마스크가 개선된 마스크입니다.


잡음에 조금 강하고 연산속도가 느린 편입니다.


위의 그림은 3x3 크기의 마스크고 5x5 크기의 마스크도 있습니다.




로버츠(Roberts) 마스크입니다. 왼쪽이 수직 마스크고 오른쪽이 수평 마스크입니다.


위의 소벨, 프리윗 마스크에 비해 연산속도가 빠릅니다.


엣지를 확실하게 검출할 수 있지만 매우 얇은 엣지가 검출되며 잡음에 약하다는 단점이 있습니다.


위의 마스크들이 대표적인 1차미분에 관한 마스크고 이제 2차미분에 관한 마스크를 살펴보겠습니다.



2차미분인 라플라시안 마스크!



라플라시안 마스크는 다른 마스크에 비해 종류가 많습니다. 


라플라시안 마스크는 잡음에 약하기 때문에 잡음을 줄여주는 Gaussian Smoothing을 적용한 후 


라플라시안 마스크를 연산하는 LOG(Laplacian of Gaussian)을 사용하기도 합니다.



그리고 잡음에 강한 캐니(Canny) 마스크!


캐니 마스크는 다른 마스크의 응용이라고 볼 수 있습니다.


사용법은 먼저 가우시안 필터로 블러링(평활화)을 해서 잡음을 제거합니다.



위의 마스크가 가우시안 필터 마스크입니다.


그 후 소벨 마스크와 같은 마스크 연산으로 엣지를 검출합니다.


그리고 Non-Maximum Value 제거를 합니다. 이건 좀 고급과정인거 같은데 평활화를 하여서 잘못 검출된 Edge를 제거하는 과정입니다.


Local Maximum Value만 남기고 가짜 엣지는 제거하는 과정입니다. 따라서 엣지가 좀 Sharp해집니다.


최대치 판단은 주로 3x3크기에서 가운데 값을 기준으로 상하좌우값을 비교해서 가운데 값이 크면 값을 남기고 아니면 제거합니다.


다음 과정은 Double Thresholding 와 엣지 연결과정입니다.


Threshold 즉 임계값을 2개(low, high)를 잡고 높은 임계값에서 검출된 엣지를 우선적으로 최종적인 엣지로 판단합니다.


그리고 낮은 임계값에서만 검출된 엣지 중에서 최종적인 엣지와 연관된 엣지만을 최종적인 엣지로 판단하고 나머지 즉 연관성 없는, 


잡음에서 엣지로 판단된 쓰레기값들은 버립니다. 그러면 최종적인 깔끔한 엣지가 검출됩니다.  


잡음에 강하고 꽤 이상적인 엣지 검출이지만 캐니 엣지 검출은 구현이 복잡하고 연산 속도가 느리다는 단점이 있습니다.


캐니 엣지 검출은 아래의 블로그에 그림과 함께 자세하게 설명되어 있더라고요!


http://carstart.tistory.com/188



참고로 코딩에서 마스크는 주로


int mask[3][3] = { {-1, 0, 1}, 

                       {-2, 0, 2}, 

                       {-1, 0, 1} }; 로 표현합니다.


이상 여러종류의 윤곽선 검출에 대해서 알아보았습니다!


+ Recent posts