실제 공장샘플 영상으로 영상처리 해보기

kenGwon·2023년 11월 13일
0

[OpenCV] Computer Vision

목록 보기
4/4

영상의 이진화

Otsu 알고리즘은 분산의 합을 활용하는 방식으로 영상의 이진화를 구현해냈다.

골격화(skeleton)

덩어리로 되어있는 이진화 객체에서 모양정보 추출을 위해 선분(벡터) 형태를 추출하는 것

Freeman 체인코드

체인코드는 윤곽선에 대한 정보를 담고있다.

openCV에서 가장 중요한 함수 중 하나는 findContour()이다. 영상을 마스킹하여 외곽선만 남기고서 영상처리를 하면 프로세싱 속도가 말도 안되게 빨라진다. 우리는 굳이 객체의 모든 정보가 필요한게 아닐 수도 있다. 외곽선(contour)만 있어도 많은 작업들이 그냥 가능하다.

RGB를 HSV로 변환할 때 RED계열에서 발생하는 구멍

RGB를 HSV로 변환하면 갑자기 중간에 구멍이 뚫린 곳이 발생하게 된다.

비쥬얼 스튜디오가 업데이트 됐다고 알림이 뜨면, 뭐가 바뀌었는지 확인해보는 습관을 가져보자.

이번 17.8버전은 업데이트 용량이 4기가나 되는데, 도대체 뭐가 들어온건지 확인해보자.

  • 우선 Git이 엄청나게 많이 들어왔다.
  • 지금 마이크로소프트에서 게임 개발쪽에 공을 많이 들이고 있다. 그러한 맥락에서 Game Development관련 기능도 많이 들어왔다.
  • CMake관련된 것들도 업데이트가 있었다.
  • 언리얼 엔진과 관련하여 U라는 접두사의 기능이 확장되었다. 우리가 쓰는 openCV도 Mat클래스가 있고 UMat클래스가 있다. 보통 연산에 그래픽카드를 사용할지 여부와 관련되어 있다(?)
  • 개발자가 놓칠 수 있는 문법들(함수에 const를 붙이고 인수에 const를 붙이는 식의 구글식 코딩 스타일)을 자동 리팩토링 해주는 기능이 추가되었다.

filter = mask = kernel = structuring element(SE)
같은 개념을 나타내는 용어들이지만, 영상처리 파트에 따라서 부르는 명칭이 다를 뿐이다.

침식연산은 피아노 악보에서 콩나물 줄기는 날리고 콩나물 대가리만 남길 때 쓰곤 한다. 다만 침식연산을 쓸 때 주의해야 할 점은 원래 오브젝트의 정보가 소실될 수 있다는 것이다.

C에서 보이드 포인터로 하던 작업이 C++로 오면서 탬플릿으로 기능이 들어감

lens shading correction

영상에서는 광학적으로 물리적인 현상 때문에 어쩔수 없이 가운데가 밝고 가얘로 갈수록 살짝 어두워진다(shading). 렌즈의 특성상 발생할수 밖에 없는 부분이다. 이 현상을 비네팅(Vignetting)현상이라고 한다. 그래서 이걸 보정한다(correction). 보통 로그의 감마값으로 보정을 하게 된다. 이 튜닝을 가장 잘하는 회사가 삼성이다.

Ampoules문제 핵심 알고리즘 해설

< 흰색 빈공간에서 기준점을 찾아내는 교수님의 알고리즘 >
원본 영상에서 마름모모양의 흰색 공간을 지나가는 행을 탐색하면서,
회색에서 흰색으로 갑자기 값이 올라가는 지점을 포인트로 찍어서 거기서 수직으로 올라가면
바로 앰플 용액에서 ROI영역의 위치 값을 바로 찍어낼 수 있다.

동일한 패턴이 반복되는 영상에서 기준점을 찾아내는 알고리즘의 핵심은,
영상 행렬에서 패턴이 반복되는 지점이 있는 행렬의 한 라인을 탐색하면서,
값이 0에서 255로 갑자기 뛰는 지점을 point로 잡는 것이다.
그리고 그 기준점point를 바탕으로 ROI를 산출할 수 있게 되는 것이다.

(내가 썼든 findContour()를 활용한 알고리즘은 영상의 종류가 바뀌면,
내가 인정하는 외곽선의 면적 값을 다시 수정해줘야하는 문제가 발생한다.
하지만 교수님의 알고리즘을 쓰면 패턴이 다른 영상이 들어와도,
언제나 동일한 규칙을 가지고서 기준점을 잡아서 ROI를 산출할 수 있게되는 것이다.)

--> 바로 여기서 나오는 알고리즘이 "탬플릿 매칭 알고리즘"이다.

탬플릿 매칭 알고리즘

Template Matching 알고리즘은 비단 영상에서만 쓰이는 알고리즘이 아니다.
우선 문자열을 생각해보자.

로우레벨에서 두 객체가 "같다"라는 연산은 두 객체를 뺐을 때의 값이 0이면 같다라고 인정하게 되는 느낌이다. strcmp()에서도 두 문자를 비교할 때 문자의 아스키코드값을 통해서 같은지 여부를 검사하게 되는 것이다. 두개의 같은 문자를 빼면 그 값은 당연히 0일 것이다.

다만, 영상에서는 값의 베리에이션이 있다(?)

탬플릿 매칭을 할 때, 픽셀값을 하나하나 비교하는 식으로 매칭을 진행하게 되는데, 만약 탬플릿과 원본 영상의 패턴은 같지만, 두 영상의 밝기 편차가 커지면 문제가 발생할 수 있다. 그것에 대응하기 위하여 탬플릿과 원본영상에서 엣지를 검출하여 둘을 비교하게 되면, 밝기편차에 강인한 탬플릿 매칭 알고리즘이 가능하게 되는 것이다.

기준점 = fiducial mark

profile
스펀지맨

0개의 댓글