문제

수평 및 수직선이있는 이미지가 있습니다. 실제로이 이미지는 BBC 웹 사이트가 수평 및 수직 라인으로 변환됩니다. 내 문제는 이미지에서 모든 직사각형을 찾고 싶다는 것입니다. 모든 직사각형을 찾기 위해 컴퓨터 프로그램을 작성하고 싶습니다. 누구 든지이 작업을 수행하거나 시작하는 방법에 대한 아이디어를 제안하는 사람이 있습니까? 이 작업은 사람이 시각적 직사각형을 찾기가 쉽지만 프로그램으로 설명하는 방법을 잘 모르겠습니다.

이미지는 여기 BBC 웹 사이트입니다 http://www.bbc.co.uk/


이를 업데이트하면 BBC 웹 사이트 이미지를 수평 및 수직선으로 변환하는 코드를 작성했습니다. 문제는 이러한 선이 모서리에서 완전히 만나지 않으며 때로는 사각형을 완전히 형성하지 않는다는 것입니다. 감사!

도움이 되었습니까?

해결책

Opencv (C에서 작성된 이미지 처리 및 컴퓨터 비전 라이브러리)는 Hough Transform (Simple Hough Transform Find Lines)을 구현하는 반면 일반화 된 사람은 더 복잡한 객체를 찾습니다). 닫힌 모서리가있는 직사각형의 경우 Cornerharris와 같은 코너 감지기도 도움이됩니다.

나는 OpenCV와 함께 제공된 HoughLines 데모를 실행했으며 여기에 제공 한 이미지 (빨간색으로 표시된 감지 선)의 결과가 있습니다.alt text
(원천: splintec.com)

다른 팁

나는 당신이 찾고 있다고 믿습니다 일반화 된 허프 변환.

컴퓨터 비전에는 일반화라는 알고리즘이 있습니다 허프 변환 문제를 해결할 수 있습니다. 이 알고리즘을 구현 한 오픈 소스 코드가 있어야합니다. 그냥 검색하십시오.

합리적으로 소음이없는 이미지 (화면 비디오가 아님)라고 가정하면 간단한 홍수 납 알고리즘 중 하나가 작동해야합니다. 틈을 닫으려면 이미지에서 팽창/침식을 실행해야 할 수도 있습니다.

선을 찾는 일반적인 방법은 허프 변환 (직각으로 선을 찾음) OpenCV가 가장 쉬운 방법입니다.

이 질문을 살펴보십시오 OpenCV 객체 감지 - 중심점

문제에는 몇 가지 다른 접근법이 있습니다. 나는 a를 사용할 것이다 형태 학적 이미지 처리 도구와 같은 도구 이 하나. "직사각형"을 정의 할 수있는 유연성이 있습니다.

또 다른 가능성은 a를 사용하는 것입니다 기계 학습 기본적으로 이전과 같이 정의 중심보다 데이터 중심의 접근 방식. 당신은 당신의 알고리즘이 사각형의 몇 가지 "예"를 제공해야하며, 결국 배울 것입니다 ( 편견 및 오류율).

색상 픽셀에 도달 할 때까지 왼쪽에서 오른쪽으로 반복 한 다음 수정 된 홍수 채우기 알고리즘을 사용하십시오. 알고에 대한 자세한 정보 홍수 채우기 @ wiki

또 다른 접근법은 이미지에서 컬러 픽셀을 찾은 다음

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}

그런 다음 위쪽으로 똑같이하십시오. 이제 당신은 한 줄을 정의했습니다. 그런 다음 선의 끝을 사용하여 선을 사각형으로 대략적으로 일치시킵니다. 그들이 픽셀 완벽하지 않다면 당신은 어떤 종류의 트해를 할 수 있습니다.

홍수 채우기가 작동하거나 에지 추적 알고리즘의 수정을 사용할 수 있습니다.

당신이하는 일 : 2D 배열 생성 (또는 기타 D2 데이터 구조)- 각 행은 화면의 수평 픽셀 라인을 나타내고 각 열은 수직선입니다.

모든 픽셀을 왼쪽에서 오른쪽으로 반복하고 색상을 찾을 때마다 배열에 좌표를 추가하십시오.

배열 및 찾기 라인을 반복하고 각각의 시작 및 끝 픽셀을 저장하십시오 (다른 데이터 구조)

각 라인의 시작이 왼쪽/상단 픽셀임을 알면 4 줄이 사각형으로 구성되어 있는지 쉽게 확인할 수 있습니다.

거의 감동적인 수평 및 수직선으로 사각형에 이르기까지 이미지를 얻으려면 다음과 같습니다.

  1. 이진으로 변환 (즉, 모든 선은 흰색이고 나머지는 검은 색입니다)
  2. 수행 a 이진 확장 (여기서는 소스 이미지의 흰색 픽셀을 터치하거나 소스 이미지의 흰색 픽셀 인 모든 픽셀을 만듭니다. 터치 만 똑바로 만 있습니다 (따라서 각 픽셀은 왼쪽, 오른쪽, 위 및 아래의 픽셀을 "터치합니다). 이것을 "4 연결"이라고합니다.
  3. 끝 사이의 간격이 폭 2 픽셀보다 크지 만 너무 자주하지 않으면 3 단계를 몇 번 반복하십시오!
  4. 스켈레톤 작동을 수행하십시오 (여기에서 출력 이미지의 모든 픽셀을 검은 색으로 만들면 소스 이미지의 흰색 픽셀이면 최소 하나의 검은 색 픽셀과 흰색 픽셀이 서로 터치하는 흰색 픽셀이 서로 터치합니다. 다시 터치하십시오. 4 연결로 정의됩니다. 아래 샘플을 참조하십시오.
  5. 반복 후 4 단계 반복 후 이미지가 변경되지 않아도됩니다 (모든 흰색 픽셀은 라인 끝 또는 커넥터입니다)

이것은 약간의 행운으로 먼저 두꺼운 지방 선이있는 상자를 보여주고 이미지 전체에 두꺼운 지방 아티팩트를 남겨두고 5 단계 후에는 모든 두꺼운 지방 아티팩트가 제거되고 모든 상자는 남아 있습니다. . 최상의 결과를 얻으려면 3 단계에서 반복 수를 트위해야합니다. 이미지 형태에 관심이 있다면 이것은 내가 가져간 정말 좋은 입문 코스의 책입니다.

샘플 : (0 = 검은 색, 1 = 흰색, 각 3x3 블록의 중앙에있는 픽셀, 왼쪽 입력, 출력 오른쪽)

011 => 011    
011 => 001  all other white pixels touch, so eliminate      
011 => 011    

010 => 010    
010 => 010  top pixel would become disconnected, so leave      
010 => 010    

010 => 010    
010 => 000  touches only one white pixel, so remove     
000 => 000    

010 => 010    
111 => 111  does not touch black pixels, leave    
010 => 010    

010 => 010    
011 => 011  other pixels do not touch. so leave    
000 => 000    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top