Реализация алгоритма обнаружения признаков

Я довольно новичок в программировании и хотел бы знать, как начать реализацию следующего алгоритма в C ++,

Дано двоичное изображение, где пиксели с интенсивностью 255 показывают края а пиксели с интенсивностью 0 показывают фон, найти отрезки длиннее n пикселей на изображении. t является счетчиком, показывающим количество итераций без нахождения строки, и tm максимально допустимое число итераций перед выходом из программы.

  1. Позволять t=0,
  2. Возьмите две крайние точки случайным образом с изображения и найдите уравнение проходящей линии
    через них.
  3. найти mколичество других краевых точек в изображении, которые находятся в пределах расстояния d пикселей
    линия.
  4. Если m > nперейдите к шагу 5.

    Иначе (m ≤ n), приращение t на 1 и если t < tm перейдите к шагу 2 и
    если t ≥ tm Программа выхода

  5. Нарисуйте линию и удалите края, падающие на расстояние d пикселей этого от
    образ. Затем перейдите к шагу 1

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

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

/* Display Routine */

#include "define.h"
ByteImage bimg;                     //A copy of the image to be viewed
int width, height;                  //Window dimensions
GLfloat zoomx = 1.0, zoomy = 1.0;   //Pixel zoom
int win;                            //Window index

void resetViewer();

void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
if ((w!=width) || (h!=height)) {
zoomx=(GLfloat)w/(GLfloat)bimg.nc;
zoomy=(GLfloat)h/(GLfloat)bimg.nr;
glPixelZoom(zoomx,zoomy);
}
width=w; height=h;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void mouse(int button, int state, int x, int y) {
glutPostRedisplay();
if((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN) &&
(zoomx==1.0) && (zoomy==1.0)){
printf(" row=%d, col=%d, int=%d.\n", y,x, (int)bimg.image[(bimg.nr-1-y)*bimg.nc+x]);
glutPostRedisplay();
}
}

void display() {
glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(0, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glDrawPixels((GLsizei)bimg.nc,(GLsizei)bimg.nr,   GL_LUMINANCE,GL_UNSIGNED_BYTE, bimg.image);
glutSwapBuffers();
}

1

Решение

Допустим, у вас есть int[XDIMENSION][YDIMENSION]

Пусть t = 0.

int t = 0; // ;-)

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

Грубая сила: вы можете случайным образом искать изображение для точек и повторно искать, когда они не являются краевыми точками

struct Point {
int x;
int y;
};

bool is_edge(Point a) {
return image[a.x][a.y] == 255;
}

int randomUpto(int upto) {
int r = rand() % upto;
return r;
}

, который нуждается в инициализации генератора псевдослучайных чисел через

srand(time(NULL));

Найти краевые точки

  Point a;
do {
a.x = randomUpto(XDIMENSION);
a.y = randomUpto(YDIMENSION);
} while ( ! is_edge(a) );

найти m, количество других краевых точек на изображении, которые находятся в пределах расстояния d пиксели линии.

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

std::vector<Point> getLineBetween(Point a, Point b) {
double dx = b.x - a.x;
double dy = b.y - a.y;
double dist = sqrt(dx * dx + dy * dy);
dx /= dist;
dy /= dist;
std::vector<Point> points;
points.push_back(a);
for ( int i = 0 ; i < 2*dist; i++ ) {
Point tmp;
tmp.x = a.x + (int)(i * dx /2.0);
tmp.y = a.y + (int)(i * dy /2.0);
if ( tmp.x != points.back().x
|| tmp.y != points.back().y ) {
points.push_back(tmp);
}
}
return points;
}

Вы видите образец здесь? Разделите шаги на подшагы, спросите Google, посмотрите на документация, попробуйте вещи, пока они не работают.

Ваши следующие шаги могут быть

  • создать функция расстояния, евклидово должно хватить
  • найти все точки рядом с линией (или рядом с точкой, что проще) на основе функции расстояния

Попробуйте и вернитесь, если вам все еще нужна помощь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]