边缘检测 - 检测不良

时间:2016-05-16 11:48:43

标签: c++ matlab image-processing edge-detection

大家好,谢谢 我是学生,我正在为我的最终项目写一个c ++代码。 我的代码问题是边缘检测算法(图像处理), 当我在MATLAB中运行边缘检测算法时,我得到了一个很好的边缘检测,但是如果我运行用c ++编写的算法代码,那么创建的图片检测结果很差。

我试图通过使用0.03的阈值来检测Matlb的边缘并且检测很好(我的项目中的变化非常低(白色表面上的变化很小)。

非常感谢你 IDAN。

也许有人可以帮助我,这是我的代码:

void ApplySobelFilter(unsigned char src[][NUMBER_OF_COLUMNS], float Threshold)
{
    unsigned char dst[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS];
    unsigned char * ptrToImage;
    ptrToImage = dst[0];
    // Kernels for sobel operator
    int Kernel_X[3][3] = { { -1, 0, 1 },{ -2, 0, 2 },{ -1, 0, 1 } };
    int Kernel_Y[3][3] = { { 1, 2, 1 },{ 0, 0, 0 },{ -1, -2, -1 } };
    // clears destination image
    for (int pixel = 0; pixel < NUMBER_OF_ROWS*NUMBER_OF_COLUMNS; pixel++)
        *ptrToImage++ = 0;

    for (int row = 1; row < NUMBER_OF_ROWS - 1; row++)
        for (int column = 1; column < NUMBER_OF_COLUMNS - 1; column++)
        {

            double Gtot = 0;
            int Gx = 0;
            int Gy = 0;

            for (int x = -1; x <= 1; x++)
                for (int y = -1; y <= 1; y++)
                {
                    Gx += src[row + y][column + x] * Kernel_X[y + 1][x + 1];
                    Gy += src[row + y][column + x] * Kernel_Y[y + 1][x + 1];

                }

            Gtot = sqrt(double(Gx ^ 2 + Gy ^ 2));

            if (Gtot >= Threshold)
                dst[row][column] = 255;

            else
                dst[row][column] = 0;

        }

    for (int row = 0; row < NUMBER_OF_ROWS; row++)
    {
        for (int col = 0; col < NUMBER_OF_COLUMNS; col++)
        {
            src[row][col] = dst[row][col];
        }
    }
}

1 个答案:

答案 0 :(得分:2)

Gtot = sqrt(double(Gx ^ 2 + Gy ^ 2));

这可能没有达到你的期望。运算符^计算逐位xor,而不是幂。在你的情况下,它只是翻转Gx和Gy的第二位。平方变量可以例如完成。像这样:

Gtot = sqrt(double(Gx * Gx + Gy * Gy));