두 이미지 모두 원하는 기호와 관련이없는 여러 줄을 포함합니다. 그리고 그 선들 중 일부는 실제로 원하는 선보다 더 길거나 대비가 높기 때문에 가장자리 선을 감지하는 것 (예 : 허프 변환 사용 또는 대비를 가로 / 세로 합산)이 작동하지 않는다고 생각합니다.
그러나 : 당신이 찾고있는 표지판에는 감지하기 쉬운 다른 특성이 있습니다.
- 사인 배경에는 (거의) 일정한 밝기가 있습니다
- 이미지의 비교적 넓은 영역을 차지합니다
- 이미지 중앙 근처에 있습니다.
따라서 대비가 낮은 넓은 연결 영역을 찾고 있습니다. 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를 사용할 수 있습니다 합니다. 위해 를 .
이제 이미지 중앙 근처에서 가장 큰 얼룩을 찾고 볼록 껍질을 찾으십시오 (배경에 연결되지 않은 가장 큰 얼룩을 사용했지만 모든 이미지에 충분하지는 않습니다).
결과 :