Сокращение коротких линейных сегментов от граничного детектора производится?

Вот некоторый код, который можно использовать. Данные из csv хранятся в массиве строк. Каждая строка является массивом строк. Надежда это помогает.

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
typedef std::string String;
typedef std::vector<String> CSVRow;
typedef CSVRow::const_iterator CSVRowCI;
typedef std::vector<CSVRow> CSVDatabase;
typedef CSVDatabase::const_iterator CSVDatabaseCI;
void readCSV(std::istream &input, CSVDatabase &db);
void display(const CSVRow&);
void display(const CSVDatabase&);
int main(){
  std::fstream file("file.csv", std::ios::in);
  if(!file.is_open()){
    std::cout << "File not found!\n";
    return 1;
  }
  CSVDatabase db;
  readCSV(file, db);
  display(db);
}
void readCSV(std::istream &input, CSVDatabase &db){
  String csvLine;
  // read every line from the stream
  while( std::getline(input, csvLine) ){
    std::istringstream csvStream(csvLine);
    CSVRow csvRow;
    String csvCol;
    // read every element from the line that is seperated by commas
    // and put it into the vector or strings
    while( std::getline(csvStream, csvCol, ',') )
      csvRow.push_back(csvCol);
    db.push_back(csvRow);
  }
}
void display(const CSVRow& row){
  if(!row.size())
    return;
  CSVRowCI i=row.begin();
  std::cout<<*(i++);
  for(;i != row.end();++i)
    std::cout<<','<<*i;
}
void display(const CSVDatabase& db){
  if(!db.size())
    return;
  CSVDatabaseCI i=db.begin();
  for(; i != db.end(); ++i){
    display(*i);
    std::cout<<std::endl;
  }
}
8
задан Community 8 February 2017 в 14:15
поделиться

5 ответов

Перед обнаружением краев предварительно обработайте изображение с помощью операции open или close (или обеих), то есть эрозия , за которой следует дилатация , или дилатация , за которой следует эрозия . это должно удалить более мелкие объекты, но оставить более крупные примерно такими же.

Я поискал онлайн-примеры, и лучшее, что я смог найти, было на странице 41 этого PDF.

эрозия , затем дилатация или дилатация , за которой следует эрозия . это должно удалить более мелкие объекты, но оставить более крупные примерно такими же.

Я поискал в Интернете примеры, и лучшее, что я смог найти, было на странице 41 этого PDF.

эрозия , затем дилатация или дилатация , за которой следует эрозия . это должно удалить более мелкие объекты, но оставить более крупные примерно такими же.

Я поискал в Интернете примеры, и лучшее, что я смог найти, было на странице 41 этого PDF.

5
ответ дан 5 December 2019 в 09:26
поделиться

Я сомневаюсь, что это можно сделать с помощью простой локальной операции. Посмотрите на прямоугольник, который вы хотите сохранить - есть несколько пробелов, поэтому выполнение локальной операции по удалению коротких сегментов линии, вероятно, сильно снизит качество желаемого результата.

Как следствие, я бы попытался определить прямоугольник как важный контент закрывая пробелы, подгоняя многоугольник или что-то в этом роде, а затем на втором шаге отбрасывайте оставшееся неважное содержимое. Может быть, может помочь преобразование Хафа .

ОБНОВЛЕНИЕ

Я только что использовал этот образец приложения с помощью преобразования Хафа ядра с вашим образцом изображения и получил четыре красивые линии, соответствующие вашему прямоугольнику .

4
ответ дан 5 December 2019 в 09:26
поделиться

The Hough Transform can be a very expensive operation.

An alternative that may work well in your case is the following:

  1. run 2 mathematical morphology operations called an image close (http://homepages.inf.ed.ac.uk/rbf/HIPR2/close.htm) with a horizontal and vertical line (of a given length determined from testing) structuring element respectively. The point of this is to close all gaps in the large rectangle.

  2. run connected component analysis. If you have done the morphology effectively, the large rectangle will come out as one connected component. It then only remains iterating through all the connected components and picking out the most likely candidate that should be the large rectangle.

2
ответ дан 5 December 2019 в 09:26
поделиться

Perhaps finding the connected components, then removing components with less than X pixels (empirically determined), followed by dilation along horizontal/vertical lines to reconnect the gaps within the rectangle

2
ответ дан 5 December 2019 в 09:26
поделиться

Можно использовать два основных метода:

  1. Операция на основе вектора: сопоставьте свои пиксельные острова в кластеры (blob, voronoi zone, что угодно). Затем примените некоторую эвристику для исправления сегментов, например алгоритм аппроксимации цепочки Teh-Chin, и выполните обрезку векторных элементов (начало, конечная точка, длина, ориентация и т. Д.).

  2. Операция на основе установки: кластеризуйте данные (как указано выше) ). Для каждого кластера вычислите главные компоненты и обнаружите линии из кругов или любой другой формы, ища кластеры, показывающие только одно значимое собственное значение (или 2, если вы ищете «толстые» сегменты, которые могут напоминать эллипсы). Проверьте собственные векторы, связанные с собственными значениями, чтобы получить информацию об ориентации капель, и сделайте свой выбор.

Оба способа можно легко исследовать с помощью OpenCV (первый, действительно,

1
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: