基于拉普拉斯模板锐化图像增强

拉普拉斯模板对该图像滤波后的结果。由图可以看出,将原始图像通过拉普拉斯变换后增强了图像中灰度突变处的对比度,使图像中小的细节部分得到增强并保留了图像的背景色调,使图像的细节比原始图像更加清晰。基于拉普拉斯变换的图像增强已成为图像锐化处理的基本工具。

#include <opencv2/opencv.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include<opencv2/imgproc/imgproc.hpp>  
//-----------------------------------【命名空间声明部分】---------------------------------------    
//      描述:包含程序所使用的命名空间    
//-----------------------------------------------------------------------------------------------     
using namespace cv;
using namespace std;
//手动实现拉普拉斯算子图像锐化  
void sharpenImage1(const Mat &image, Mat &result)
{
    result.create(image.size(), image.type());//为输出图像分配内容  
                                              /*拉普拉斯滤波核3*3
                                              0  -1   0
                                              -1   5  -1
                                              0  -1   0  */
                                              //处理除最外围一圈外的所有像素值  
    for (int i = 1; i<image.rows - 1; i++)
    {
        const uchar * pre = image.ptr<const uchar>(i - 1);//前一行  
        const uchar * cur = image.ptr<const uchar>(i);//当前行,第i行  
        const uchar * next = image.ptr<const uchar>(i + 1);//下一行  
        uchar * output = result.ptr<uchar>(i);//输出图像的第i行  
        int ch = image.channels();//通道个数  
        int startCol = ch;//每一行的开始处理点  
        int endCol = (image.cols - 1)* ch;//每一行的处理结束点  
        for (int j = startCol; j < endCol; j++)
        {
            //输出图像的遍历指针与当前行的指针同步递增, 以每行的每一个像素点的每一个通道值为一个递增量, 因为要考虑到图像的通道数
                //saturate_cast<uchar>保证结果在uchar范围内  
                *output++ = saturate_cast<uchar>(5 * cur[j] - pre[j] - next[j] - cur[j - ch] - cur[j + ch]);
        }
    }
    //将最外围一圈的像素值设为0  
    result.row(0).setTo(Scalar(0));
    result.row(result.rows - 1).setTo(Scalar(0));
    result.col(0).setTo(Scalar(0));
    result.col(result.cols - 1).setTo(Scalar(0));
    /*/或者也可以尝试将最外围一圈设置为原图的像素值
    image.row(0).copyTo(result.row(0));
    image.row(image.rows-1).copyTo(result.row(result.rows-1));
    image.col(0).copyTo(result.col(0));
    image.col(image.cols-1).copyTo(result.col(result.cols-1));*/
}

//调用OpenCV函数实现拉普拉斯算子图像锐化  
void sharpenImage2(const Mat &image, Mat &result)
{
    Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    filter2D(image, result, image.depth(), kernel);
}

//main函数  
void main() {
    Mat mat = imread("1.jpg");
    Mat result1;
    Mat result2;

    sharpenImage1(mat, result1);
    sharpenImage2(mat, result2);

    namedWindow("src");
    namedWindow("result1");
    namedWindow("result2");
    imshow("src", mat);
    imshow("result1", result1);
    imshow("result2", result2);
}

ref
http://www.cnblogs.com/xfzhang/archive/2011/01/19/1939020.html
https://blog.csdn.net/dcrmg/article/details/53677739

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值