Suas duas imagens contêm muitas linhas que não têm nada a ver com o sinal que você está procurando. E algumas dessas linhas são mais longas / têm maior contraste do que as que você realmente deseja, então acho que detectar as linhas da borda (por exemplo, usando uma transformação hough ou resumindo os contrastes horizontal / verticalmente) não funcionará.
Mas: o sinal que você procura tem outras características que devem ser mais fáceis de detectar:
- Há sinal de fundo tem brilho (quase) constante
- Ocupa uma área relativamente grande da imagem
- É perto do centro da imagem
Então, você está procurando uma grande área conectada com baixo contraste. Eu invadi um algoritmo de prova de conceito no Mathematica. (Eu não sou um especialista em OpenCV, mas mencionarei a respectiva função OpenCV quando os conhecer.)
Primeiro, uso filtros derivativos gaussianos para detectar a magnitude do gradiente em cada pixel. O filtro derivado gaussiano tem uma ampla abertura (11x11 pixels neste caso), por isso é muito insensível ao ruído. Em seguida, normalizo a imagem do gradiente para média = 1, para que eu possa usar os mesmos limites para as duas amostras.
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]];
Implementação do OpenCV: você pode usar sepFilter2D
para a filtragem real, mas , aparentemente, precisará calcular os valores do kernel do filtro .
O resultado fica assim:
Nesta imagem, o fundo do sinal é escuro e as bordas do sinal são brilhantes. Para que eu possa binarizar esta imagem e procurar componentes conectados escuros.
binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];
Implementação do OpenCV: o limiar deve ser direto, mas acho que o OpenCV não contém análise de componentes conectados - você pode usar flood fill ou cvBlobsLib para isso.
Agora, encontre o maior blob próximo ao centro da imagem e o casco convexo (simplesmente usei o maior blob que não está conectado ao plano de fundo, mas isso pode não ser suficiente para todas as imagens).
Resultados: