图像的带方向边缘检测之c++实现(qt + 不调包)

1.基本原理

    在边缘检测中,我们有时只想检测出某一种类型的边缘,比如成45°,如果我们以45°为区间,360°将被分成8个方向。常用作带方向边缘检测的模板有3种,分别是Prewitt、Robinson和Kirsch,图中将呈现集中常用检测水平和垂直方向边缘的模板,其中(a)为Prewitt模板,(b)为Robinson模板,(c)为Kirsch模板。

图像的带方向边缘检测之c++实现(qt + 不调包)_第1张图片

 

2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解

/*八方向的Robinson模板边缘检测 比例scale对差分结果进行缩放 n为选择八方向中的一个*/
QImage* MainWindow:: SideSobeldiant(QImage* image,double scale)
{
    QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);
    QColor color0;
    int templt[3][3] = {
        {1,1,1},
        {1,-2,1},
        {-1,-1,-1}
    };
    int templt1[3][3] = {
        {1,1,1},
        {1,-2,-1},
        {1,-1,-1}
    };
    int templt2[3][3] = {
        {1,1,-1},
        {1,-2,-1},
        {1,1,-1}
    };
    int templt3[3][3] = {
        {1,-1,-1},
        {1,-2,-1},
        {1,1,1}
    };
    int templt4[3][3] = {
        {-1,-1,-1},
        {1,-2,1},
        {1,1,1}
    };
    int templt5[3][3] = {
        {-1,-1,1},
        {-1,-2,1},
        {1,1,1}
    };
    int templt6[3][3] = {
        {-1,1,1},
        {-1,-2,1},
        {-1,1,1}
    };
    int templt7[3][3] = {
        {1,1,1},
        {-1,-2,1},
        {-1,-1,1}
    };
    int templtsize = 3;
    int a =0;
    for(int y = templtsize/2; y < image->height() - templtsize/2; y++)
    {
        for(int x = templtsize/2; x < image->width() - templtsize/2;x++)
        {
            int r =0;
            int g = 0;
            int b = 0;
            for(int j = -templtsize/2; j <=templtsize/2;j++)
            {
                for(int i = -templtsize/2; i <= templtsize/2;i++)
                {
                       color0 = QColor(image->pixel(x + i,y + j));
                       r += color0.red() * templt[i + templtsize/2][j + templtsize/2];
                       g += color0.green() * templt[i + templtsize/2][j + templtsize/2];
                       b += color0.blue() * templt[i + templtsize/2][j + templtsize/2];
                }
            }
           r*= scale;
           g*=scale;
           b*=scale;
           r = qBound(0,r,255);
           g = qBound(0,g,255);
           b = qBound(0,b,255);
            newImage->setPixel(x,y,qRgb(r,g,b));
        }
    }
    return newImage;
}

3.参考资料

    数字图像处理——技术详解与Visual C++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去

你可能感兴趣的:(c++基本图像处理算法)