Я новичок в программировании и хотел бы знать, как начать реализацию следующего алгоритма на C++,
Для бинарного изображения, в котором пиксели с интенсивностью 255 показывают края, а пиксели с интенсивностью 0 показывают фон, найдите в изображении сегменты линий длиннее n
пикселя. t
— это счетчик, показывающий количество итераций без нахождения строки, а tm
— максимально допустимое количество итераций до выхода из программы.
- Пусть
t=0
. - Возьмите случайным образом две крайние точки изображения и найдите уравнение прямой, проходящей через них.
- Найдите
m
, количество других краевых точек изображения, находящихся на расстоянии d пикселей от линии. Если
m > n
, перейдите к шагу 5.В противном случае (
m ≤ n
) увеличитьt
на 1 и, еслиt < tm
, перейти к шагу 2, а еслиt ≥ tm
, выйти из программы.- Нарисуйте линию и удалите краевые точки, находящиеся на расстоянии
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();
}