特征检测算法的实现

Implementation of feature detection algorithm

我是编程新手,想知道如何开始用 C++ 实现以下算法,

给定一个二值图像,其中强度为 255 的像素显示 边缘 ,强度为 0 的像素显示 背景 ,找到长于n 图像中的像素。 t是一个计数器,显示没有找到一行的迭代次数,tm是退出程序前允许的最大迭代次数。

  1. t=0.
  2. 从图像中随机取两个边缘点,求直线通过方程 通过他们。
  3. m,图像中距离d像素以内的其他边缘点的个数 这条线。
  4. 如果m > n,转到步骤5。

    否则 (m ≤ n),将 t 递增 1,如果 t < tm 转到步骤 2,并且 if t ≥ tm 退出程序。

  5. 绘制直线并移除落在距离 d 像素距离内的边缘点 图片。然后,转到步骤 1

基本上,我只是想从图像中随机选择两个点,找出它们之间的距离,如果那个距离太小,我会检测它们之间的一条线。

如果能提供一小段代码让我入门,我将不胜感激。 这更像是 RANSAC 参数线检测。如果我完成它,我也会保持这个 post 更新。

/* 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();
}

让我们假设您有 int[XDIMENSION][YDIMENSION]

Let t=0.

int t = 0; // ;-)

Take two edge points randomly from the image and find equation of the line passing through them.

蛮力:可以随机搜索图像中的点,当不是边缘点时重新搜索

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) );

Find m, the number of other edge points in the image that are within distance d pixels of the line.

你需要点之间的线。一些搜索产生 this fine answer,这导致

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,查看 the documentation,尝试一些东西直到它起作用。

您的下一步可能是

  • 创建一个distance function,euclidean 应该足够了
  • 根据距离函数找到线旁边(或点旁边,这更容易)的所有点

尝试一些,如果您仍然需要帮助,请回来。