qt图像算法—图像的拉普拉斯锐化之c++实现(不调包)

【源码下载】GitCode,关键词【qt图像算法】

整套项目源码内容包含

[1].根据算法原理,编写纯c++源码,不调用外源库opencv 等;
[2].包括各种图像处理的基本算法,包含腐蚀膨胀,缩放,转置,镜像,平移,均衡变化,灰度拉升,灰度阈值,灰度非线性,转灰度,灰度线性,旋转,简单平滑,高斯平滑,轮廓跟踪,种子算法,hough直线检测,拉普拉斯,带方向边缘检测,常规边缘检测(梯度算子、Roberts算子和Sobel算子),中值滤波,反色操作等;
[3].程序中有完整的注释,便于大家很好理解代码。

1.基本原理

图像的平滑会使得图像模糊,相反,有没有什么办法可以提高图像对比度,从而使图像清晰起来呢?答案是肯定的,本文的猪脚是拉普拉斯锐化。我们都知道,一阶微分法能够用来检测边缘是否存在,二阶微分法可以确定边缘的位置。

6a7b8d29944ddf5a8c90e6659e6e9229.png

此公式可以简化成一个四邻域模板,常用的模板还有八邻域,可参见代码

eb10881052106d675c7141927a59fbac.png

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

/* 拉普拉斯鋭化处理*/
QImage* MainWindow::SharpLaplacianRGB(QImage* image)
{
    QImage* newImage = new QImage(image->width(),image->height(),QImage::Format_ARGB32);
    int kernel [3][3] = {
    {-1,-1,-1},
    {-1,8,-1},
    {-1,-1,-1}};
    int sizeKernel = 3;
    int sumKernel = 3;
    QColor color;
     for(int x = sizeKernel/2;x<image->width() - sizeKernel/2;x++)
    {
       for(int y= sizeKernel/2;y<image->height() - sizeKernel/2;y++)
        {
            int r = 0;
            int g = 0;
            int b = 0;
            for(int i = -sizeKernel/2;i<=sizeKernel/2;i++)
            {
               for(int j = -sizeKernel/2;j<=sizeKernel/2;j++)
                {
                 color = QColor(image->pixel(x+i,y+j));
                 r+=color.red()*kernel[sizeKernel/2+i][sizeKernel/2+j];
                 g+=color.green()*kernel[sizeKernel/2+i][sizeKernel/2+j];
                 b+=color.blue()*kernel[sizeKernel/2+i][sizeKernel/2+j];
                }
            }
            r = r/sumKernel+ color.red();
            g = g/sumKernel+ color.green();
            b = b/sumKernel + color.blue();
            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;
}

调用代码:

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QImage image;;
    image.load("E:/BaiduNetdiskDownload/imgeCode/Lena.bmp");
    //QImage* image1 = greyScale(&image);
    QImage* image2 = SharpLaplacianRGB(&image);
    painter.drawImage(10,10, image);
    painter.drawImage(270,10,*image2);
}

运行结果:

导航