임의 형태의 자동 자르기


14

이진 마스크로 정의 된 임의의 모양이 있습니다 (회색 = 모양, 검은 색 = 배경).

회색 픽셀 만 포함하는 가능한 가장 큰 사각형을 찾고 싶습니다 (이 사각형은 노란색으로 표시됨).

여기에 이미지 설명을 입력하십시오

모양은 항상 "한 조각"이지만 반드시 볼록한 것은 아닙니다 (모양 경계의 모든 점 쌍이 직선을 통해 직선 모양으로 연결될 수있는 것은 아닙니다).

때때로 이러한 "최대 사각형"이 많이 존재하고 다음과 같은 추가 구속 조건이 도입 될 수 있습니다.

  • 모양의 질량 중심 (또는 이미지 중심)에 가장 가까운 중심으로 사각형을 가져옵니다.
  • 사전 정의 된 비율에 가장 가까운 종횡비의 직사각형을 가져옵니다 (예 : 4 : 3).

여기에 이미지 설명을 입력하십시오

알고리즘에 대한 나의 첫 생각은 다음과 같습니다.

  1. 모양의 거리 변환 계산 및 질량 중심 찾기
  2. 모양의 픽셀 만 포함하면서 정사각형 영역을 확장
  3. 모양의 픽셀 만 포함하는 너비 또는 높이의 사각형 (원래 사각형)을 성장시킵니다.

그러나 그러한 알고리즘은 느리고 최적의 솔루션으로 이어지지 않을 것이라고 생각합니다.

어떤 제안?



트윗 담아 가기 감사. 답변을 추가하여 수락 할 수 있습니까? 그런 다음 알고리즘을 더 정교하게하기 위해 답을 편집하려고 시도하지만 제공 한 링크를 사용하여 내 질문에 대답하고 싶지는 않습니다.
Libor

큰! 코드를 읽지 않았으므로 정교한 답변을 읽어 드리겠습니다.
Atul Ingle

@AtulIngle 좋아요, 답변에 토론을 추가하고 전체 기사로 연결되었습니다.
Libor

답변:


10

Matlab Fileexchange에는 문제와 관련된 코드가 있습니다. http://www.mathworks.com/matlabcentral/fileexchange/28155-inscribedrectangle/content/html/Inscribed_Rectangle_demo.html

최신 정보

Atul Ingle의 위 링크를 기반으로 가장 큰 내접 직사각형을 계산하는 방법에 대한 이 자습서 기사 를 작성했습니다 .

이 알고리즘은 먼저 이진 마스크에서 가장 큰 사각형을 검색합니다. 이것은 간단한 동적 프로그래밍 알고리즘을 사용하여 수행됩니다. 각각의 새로운 픽셀은 이미 알려진 세 개의 이웃을 사용하여 업데이트됩니다.

squares[x,y] = min(squares[x+1,y], squares[x,y+1], squares[x+1,y+1]) + 1

여기에 이미지 설명을 입력하십시오

샘플 이진 마스크와 계산 된 맵은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

지도에서 최대치를 획득하면 가장 큰 내접 된 사각형이 표시됩니다.

여기에 이미지 설명을 입력하십시오

사각형 검색 알고리즘은 마스크를 두 번 더 스캔하여 두 종류의 사각형을 찾습니다.

  • 너비가 정사각형 크기보다 크거나 높이가 더 작을 수 있음
  • 정사각형 크기보다 큰 높이 (및 너비는 더 작을 수 있음)

주어진 점에서 사각형이 내접 된 사각형보다 큰 차원을 가질 수 없기 때문에 두 클래스는 가장 큰 사각형으로 제한됩니다 (하나의 차원은 더 클 수 있음).

면적, 원주 또는 가중 치수 합과 같은 사각형 크기에 대한 일부 메트릭을 선택해야합니다.

사각형에 대한 결과 맵은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

지금까지 찾은 최고의 사각형의 위치와 크기를지도를 작성하고 최대 값을 찾는 대신 변수에 저장하는 것이 편리합니다.

여기에 이미지 설명을 입력하십시오

이 알고리즘의 실제 적용은 직사각형이 아닌 이미지를 자르는 것입니다. 이미지 스티칭 라이브러리 SharpStitch 에서이 알고리즘을 사용했습니다 .

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.