본문 바로가기
카테고리 없음

image segmentation 이미지 세그먼테이션 분할 기술 구현

by 구름갈대호수 2022. 3. 20.

image segmentation 이미지 세그먼테이션 개요

Segmentation을 이용한 경계선 영상은 다음과 같다.

예제에서 했던 대로 워터쉐드 알고리즘을 기술한 위상적 맵을 유사하게 사용한다. 워터쉐드 분할을 만들려면 레벨 0에서 시작하는 영상을 점진적으로 침수케 하는 아이디어에 따른다. ‘워터’인 레벨이 점진적으로 증가(1, 2, 3 등의 레벨로)하고, 유역을 형성한다. 분지의 크기가 점차 증가하고 결국 다른 두 분지의 워터가 합쳐진다. 이런 상황이 발생하면 두 분리된 분지를 유지하기 위해 워터쉐드를 생성한다. 일단 워터 레벨이 최대 레벨에 도달하면 워트쉐드 분할은 생성된 분지와 워터쉐드 형태의 집합이 된다.

image segmentation 이미지 세그먼테이션 분할 기술
image segmentation 이미지 분할 기술 


한 가지 기대할 수 있다면 침수 과정은 처음에 작은 개별 분지를 많이 만든다. 모두 병합했을 때 과도하게 분할된 영상 안에는 많은 워터쉐드 선이 만들어 형태학 연산을 이용한 영상 변환을 한다.

image segmentation 세그멘테이션 경계 영상 분할 방법

 

이 히스토그램에서 중간 명암도 값에 있는 큰 봉우리와 상당한 양의 어두운 화소가 있는 영상임을 보여준다. 두 그룹은 주로 각 영상의 배경과 전경에 해당한다. 영상을 두 그룹으로 나누는 부분을 경계값으로 처리해 확인할 수 있다. 이를 위해 편리한 OpenCV 함수를 사용할 수 있는데, 이름 그대로 cv:: threshold 함수다. 이 함수는 이진 영상을 만들 목적으로 영상에 경계값을 적용해야 할 때 사용할 수 있는 함수다. 여기서 영상을 경계화하기 위해 히스토그램의 높은 봉우리(명암값 60) 방향으로 증가하기 직전인 최솟값으로 정했다.

CV::Mat thresholded; CV::threshold (image, thresholded, 60,255,cv::THRESH_BINARY);

다음 그림처럼 결과 이진 영상은 명확하게 배경과 전경이 분할됐음을 보여준다.

 

 

Binary Image segmentation 이미지 분할 방법


cv:: calcHist 함수는 다양한 상황에서 사용할 수 있는 많은 파라미터를 갖고 있다. 대부분 히스토그램은 단일 1채널이나 3채널 영상 중 하나다. 그러나 이 함수는 분산된 여러 영상인 다중 채널 영상을 지정할 있다. 영상 배열을 함수에 입력하는 이유가 있다. 여섯 번째 파라미터는 히스토그램의 차원 수를 설정한다. 예를 들어 1이면 1차원 히스토그램이다. 히스토그램 계산 시 고려해야 할 채널은 설정한 차원 수를 갖는 배열 중 하나다. 구현한 클래스에서 기본 채널

히스토그램을 이용한 화소 개수를 세도록 코딩합니다.

 

Hough transform 변환을 이용한 기하학적 요소 extraction

Detected Lines with Hough 방법을 알아보자.

확률적 허프 변환은 기본 알고리즘에 몇 가지 수정을 가했다. 첫째, 체계적으로 영상을 행마다 조회하는 대신 이진 맵에서 무작위 순서로 점을 선택했다. 누산기의 항목이 특정 최솟값에 도달할 때마다 해당 선을 따라 영상을 조회하고 통과하는 모든 점을 제거(아직 투표하지 않은 경우에도)한다. 또한 조회 과정에서 세그먼트의 길이를 결정하며 받아들인다. 이를 위해 알고리즘은 두 개의 추가 파라미터를 정의한다. 전자는 받아들이기 위한 세그먼트의 최소 길이이고, 후자는 연속적인 세그먼트를 형성하기 위해 허용하는 최대 화소 간격이다. 이 추가 단계는 알고리즘의 복잡도를 증가시키지만, 선을 조회하는 과정에서 일부가 사라지겠지만, 투표 과정에서 아주 적은 점을 포함하기 때문에 어느 정도 보상할 수 있다.


허프 변환은 또한 다른 기하학적인 요소를 감지하기 위해 사용한다. 사실 확률 방정식으로 표현하는 임의 요소는 허프 변환을 위한 좋은 후보다.

원 감지

원인 경우에 해당 확률 방정식은 다음과 같다.

p² = (x - ro)² + (y-.)

7 선, 외곽선, 컴포넌트 추출한다.

 

image perspective homography 분석 단계

 

 

cv::warpPerspective (image1, // 입력 영상 result, // 결과 영상 homography, // 호모그래피 CV::Size (2* imagel.cols, image1.rows)); // 결과 영상 크기

일단 새로운 영상을 얻으면 이 시점(시점의 동일한 점에서 두 영상은 지금 그대로임)을 확장하기 위한 다른 영상에 덧붙일 수 있다.

// 전체 영상의 첫 절반 부분에 영상 1 복사

CV:: Mat half (result, cv:: Rect(0,0, image2.cols, image2.rows)); image2.copyTo (half); // image2를 영상 1의 관심 영역에 복사

결과는 다음 그림과 같다.

After warping

예제 분석

호모그래피로 두 시점이 관계가 있다면 한 영상에서 주어진 장면 점을 결정하는 것이 가능해지며, 다른 영상에서 찾을 수 있다. 이 속성은 특히 영상 외곽의 밖으로 떨어지는 점에 흥미롭게 된다. 사실 두 번째 시점은 첫 번째 영상에서 보이지 않는 장면의 일부를 보여주므로, 다른 영상에 있는 추가 화소의 컬러값

 

video transparent project 방법 영상 내 투영 관계 추정

 

영상을 확장시키기 위해 호모그래피를 사용할 수 있다. 이것은 오른쪽에 추가 열을 붙여 두 번째 영상을 확장한 새로운 영상을 생성할 수 있었던방법이었다.

cv:: findHomography로 계산한 호모그래피는 첫 번째 영상 내의 점을 두번째 영상의 점으로 사상한다. 영상 1의 점을 영상 2로 이동하기 위해 필요한것은 사실 역호모그래피다. 정확히 cv::warpPerspective 함수는 기본으로작동한다. 즉, 결과 영상의 각 점인 컬러값을 갖기 위한 입력으로 제공된 호모그래피의 역을 사용한다. 결과 화소는 입력 영상 밖에 있는 점으로 이동하면간단히 검은 값(0)으로 해당 화소에 할당한다. 화소 전송 과정에서 하나를 역으로 하는 대신 바로 호모그래피를 사용하길 원할 경우 옵션 플래그인CV:: WARP_INVERSE MAP을 cv::warpPerspective 의 다섯 번째 인자로 추가지정할 수 있다.

 

 

video homography formulation 계산 방법

 



호모그래피는 평면의 두 시점 사이에도 존재한다. 순수한 회전의 경우에 했던것처럼 카메라 투영 방정식을 다시 조사함으로써 증명할 수 있다. 평면을 관찰하면 일반 손실 없이 모든 점이 0인 Z 좌표를 가진 평면에서 참조 프레임을설정할 수 있다. 또한 3×4 투영 행렬의 한 열을 취소해 3×3 행렬 내의 결과인호모그래피를 얻는다. 이것은 예를 들어 건축물의 정면에 대한 시점의 다른 점이 있는 여러 개 사진을 갖고 있다면 영상 간의 호모그래피를 계산할 수 있으며,영상을 워핑 varipping하고 이번 예제에서 했던 그대로 함께 조립하면 정면의 큰모자이크를 만들 수 있다.

두 시점 간 네 가지 일치점의 최소는 호모그래피 계산에 필요하다. CV::getPerspectiveTransform 함수는 네 가지 해당 점으로 계산해 변환할 수있다.


image segmentation homography calculation 방법

 

 

곡선은 고려한 점을 통과하는 모든 선의 집합을 표현한다. 지금 (30, 10) 점에 대해 동일한 과정을 반복하면 이제 다음과 같은 누산기를 갖는다.

그림에서 보듯 두 결과 곡선은 한 점에서 교차한다. 이 점은 두 점이 선을 통과하는 점에 해당한다. 누산기의 해당 요소는 두 투표를 받고, 두 점이 이 선을 통과했음을 나타낸다. 이진 맵의 모든 점에 동일한 과정을 반복하면 점이 주어선 선에 따라 정렬되고 누산기의 공통 요소가 여러 번 증가한다. 마지막에 하나는 누산기에서 영상 안의 선(즉, 점 정렬)을 감지하기 위한 상당한 투표 개수를 받는 지역 최대치를 식별해야 한다. CV:: HoughLines 함수 내에 지정한 마지막 파라미터는 투표 최소 개수에 대응하고 선이 감지된 것으로 간주해 받아 들여야 한다. 예를 들어 60을 낮은 값으로 한다면, 즉 다음과 같이 한다면

cv:: HoughLines (test, lines,1,PI/180,60);

다음과 같이 더 많은 선이 나타난다.

 

 

 

 

 

 

 

 

댓글