이미지 처리 : 이미지에서 사변형 간판을 감지하는 방법?


14

휴대폰을 사용하여 캡처 한 이미지에서 사변형 간판을 어떻게 감지합니까? 직사각형과 같은 모양을 어떻게 감지합니까? 둥근 사각형 (모서리 모서리 대신 둥근 모서리)?

opencv.wrapper를 사용하고 있지만 익숙하지 않습니다.

감사.

다음은 샘플입니다. alt text http://www.freeimagehosting.net/uploads/b03442fd36.png

대체 텍스트 http://www.freeimagehosting.net/uploads/e6b36040e8.png

소음과 많은 선으로 인해 간판의 경계선을 결정할 수 없습니다. 때로는 허프 변환 후 선의 경계를 찾을 수 있습니다. 나는 이런 종류의 시나리오에 갇혀있다 ...

이것은 휴대 전화 카메라에서 찍은 2 원시 사진입니다

대체 텍스트 http://www.freeimagehosting.net/uploads/6dbd613edf.jpg 대체 텍스트 http://www.freeimagehosting.net/uploads/720da20080.jpg

간판을 꺼내기 위해 이미지를 처리하는 방법을 보려면 조언이 필요합니까?

대단히 감사합니다


2
: 키워드 : OpenCV의는 중복 Hough 변환 stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

그래, FTW를 변형 시켜라!

그러나 이미지에 노이즈가있어서 어떻게 간판의 경계인지 알아낼 수 있습니다

@ xabi123 : 허프 변환, 임계 값, 경계 읽기

1
샘플 이미지를 공유 할 수 있습니까?

답변:


7

두 이미지 모두 원하는 기호와 관련이없는 여러 줄을 포함합니다. 그리고 그 선들 중 일부는 실제로 원하는 선보다 더 길거나 대비가 높기 때문에 가장자리 선을 감지하는 것 (예 : 허프 변환 사용 또는 대비를 가로 / 세로 합산)이 작동하지 않는다고 생각합니다.

그러나 : 당신이 찾고있는 표지판에는 감지하기 쉬운 다른 특성이 있습니다.

  • 사인 배경에는 (거의) 일정한 밝기가 있습니다
  • 이미지의 비교적 넓은 영역을 차지합니다
  • 이미지 중앙 근처에 있습니다.

따라서 대비가 낮은 넓은 연결 영역을 찾고 있습니다. Mathematica에서 개념 증명 알고리즘을 해킹했습니다. (저는 OpenCV 전문가는 아니지만 각각의 OpenCV 기능에 대해 언급 할 것입니다.)

먼저 가우시안 파생 필터를 사용하여 각 픽셀에서 그래디언트 크기를 감지합니다. 가우스 파생 필터는 넓은 조리개 (이 경우 11x11 픽셀)를 가지므로 노이즈에 매우 민감합니다. 그런 다음 그라디언트 이미지를 평균 = 1로 정규화하여 두 샘플에 대해 동일한 임계 값을 사용할 수 있습니다.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

OpenCV 구현 : sepFilter2D실제 필터링에 사용할 수 있지만 필터 커널 값을 직접 계산해야합니다 .

결과는 다음과 같습니다.

그라디언트 크기

이 이미지에서 표시 배경이 어둡고 표시 테두리가 밝습니다. 따라서이 이미지를 이진화하고 어두운 연결된 구성 요소를 찾을 수 있습니다.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

OpenCV 구현 : 임계 값은 간단해야하지만 OpenCV에는 연결된 구성 요소 분석이 포함되어 있지 않습니다. 플러드 필 또는 cvBlobsLib를 사용할 수 있습니다 합니다. 위해 를 .

이제 이미지 중앙 근처에서 가장 큰 얼룩을 찾고 볼록 껍질을 찾으십시오 (배경에 연결되지 않은 가장 큰 얼룩을 사용했지만 모든 이미지에 충분하지는 않습니다).

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


0

이 상황에서 노이즈에 대해보다 견고하게 취할 수있는 또 다른 방법은 x 축과 y 축을 따라 이미지의 평균 회색 레벨 곡선을 생성하는 것입니다. 즉, 이미지의 각 라인 / 열에 대한 평균 그레이 레벨을 계산하십시오.

예를 들어, 간판 (또는 테두리)이 주변보다 밝 으면 (문제에 표시된 모든 예제의 경우) x 축 곡선에 두 개의 피크 (왼쪽 및 오른쪽 및 테두리)가 있습니다. ) 및 y 축 곡선의 두 피크 (상단 및 하단 경계). 1 차원 신호 (하이 패스 필터 일 수 있음)에 대한 경계 감지 기술을 사용하여 간판의 모서리 좌표를 추론 할 수 있습니다.

나는이 방법이 번호판을 감지하고 얼굴을 인식하는 데 사용되는 것을 보았습니다 (코는 얼굴의 밝은 부분이되기 때문에 x 축과 y 축 곡선에서 피크를 생성합니다).


흠 .. 간판을 돌리거나 카메라를 굴리면 어떻게 되나요?
Mustafa

0

이것은 약간 거꾸로 된 아이디어 일 수도 있지만 시도해 볼 가치가 있습니다. rectange을 감지하고 텍스트를 생각하는 대신 노이즈 텍스트를 정보 처럼 취급 할 수 있습니다. 이를 사용하여 rectange을 더 쉽게 감지 할 수 있습니다.

아이디어의 개요는 다음과 같습니다.

  • 이미지에서 텍스트를 감지 . 이미지의 텍스트에 대한 대략적인 추정치 인 견고한 구현 일 필요는 없습니다 (구글을 수행하는 작은 라이브러리 또는 OpenCV가있는 작은 라이브러리를 Google에 제공 할 수 있어야 함)
  • 모든 텍스트 감지의 cener를 찾으십시오 . 시끄러운 이미지에서도 실제 주변에 있어야합니다.
  • 텍스트 감지 주변 영역에서 사각형 사각형을 거칩니다 . 텍스트 감지 중심으로부터의 중간 거리 또는 이와 유사한 것을 사용하십시오. 다른 직경을하고 사용하고 가장 강력한 리콜을하십시오 .

설명과 장점 :

  • 텍스트 주위의 영역은 일반적으로 균질합니다. 실제 사각형은 첫 번째로 강한 기억이어야합니다.
  • 이렇게하면 전체 이미지에서 거친 변환을 수행 할 필요가 없으므로보다 획기적으로 수행 할 수 있습니다 (같은 영역에서 여러 번이지만 버킷 크기가 다를 수 있습니다 ...)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.