Estou tentando reconhecer cursos de água a partir de fotografias aéreas (digamos, do Google Maps). Os governos locais costumam ter dados GIS que indicam onde estão as vias navegáveis (e estradas, edifícios etc.), mas os dados da água neles são geralmente um tanto imprecisos e podemos ser capazes de melhorá-los usando imagens aéreas. Portanto, já temos alguns dados que nem sempre são confiáveis.
Eu sei como fazer um processamento básico de imagem nos dados (infelizmente ainda não tenho imagens de amostra para mostrar aqui, estou tentando imaginar como eu poderia fazer isso, nenhum código de trabalho ainda):
Posso coletar alguns conjuntos de valores de cores usando bits de via navegável nas imagens e descobrir quais pixels são os mais próximos dessas cores, possivelmente também para outros tipos de recursos (grama, estradas, prédios etc.). Se eu definir um limite no qual os pixels estão "próximos o suficiente", recebo um conjunto de pixels que provavelmente são cursos d'água (mas haverá muito ruído).
Posso transformar a imagem em escala de cinza e usar um algoritmo de detecção de borda padrão para descobrir onde estão as bordas. Novamente, isso me dá um conjunto de pixels com limites semelhantes, mas haverá ruído e as bordas também serão pensadas e / ou terão lacunas.
O que eu quero ter como saída é um conjunto de polígonos que descrevam as prováveis vias navegáveis.
Intuitivamente, eu gostaria de usar as bordas detectadas para criar polígonos e as informações de cores para decidir quais delas são a água, possivelmente usando os dados do governo que já temos.
Existe uma maneira conhecida de passar do resultado de um algoritmo de detecção de borda para um bom conjunto de polígonos fechados? Ou outras dicas sobre como atacar esse problema, se houver uma maneira melhor?
fonte
Respostas:
Isso é difícil de fazer apenas com informações de cores. As variações de cores entre (ou mesmo dentro) as imagens aéreas e de satélite podem ser enormes. Idealmente, você desejará imagens hiperespectrais ou pelo menos infravermelhas ( consulte este documento ).
Supondo que a detecção de borda possa se ajustar aos limites de pixel, você pode pegar as bordas de cada pixel como um polígono fechado e uni-las para formar um polígono (dependendo da implementação da união, você pode acabar com um polígono com anéis ou orifícios internos) ou uma coleção de polígonos. O Java Topology Suite e outras implementações de geometria computacional podem facilitar muito isso para você. Se você deseja usar limites de sub-pixel, precisará ter muito cuidado para ter um bom valor de epsilon definido para poder ajustar as bordas muito próximas, mas não exatamente tocantes.
Se você quiser pegar as arestas e combiná-las, criará um gráfico de arestas que se cruzam e implementará um código que atravessa o gráfico (por exemplo, no sentido anti-horário) para descobrir onde ele se fecha para formar um polígono. É assim que algumas das implementações de união de polígonos funcionam.
fonte