前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV图像锐化---USM锐化和Laplace锐化

OpenCV图像锐化---USM锐化和Laplace锐化

作者头像
Vaccae
发布2022-04-06 20:46:57
7.7K0
发布2022-04-06 20:46:57
举报
文章被收录于专栏:微卡智享微卡智享

前言

图像锐化 (image sharpening) 是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。

实现效果

原图

USM锐化

Laplace锐化

上面三图从左到右分别是原图、USM锐化、Laplace锐化后的效果,从效果上看,USM锐化和Laplace锐化都将原图的文字变得更清晰了,不过Laplace锐化的效果要更好一点。

锐化介绍

微卡智享

USM锐化

USM 锐化增强算法(Unsharpen Mask),是图像卷积处理实现锐化常用的算法,这种锐化的方法就是对原图像先做一个高斯模糊,然后用原来的图像减去一个系数乘以高斯模糊之后的图像,然后再把值Scale到0~255的RGB像素值范围之内。基于USM锐化的方法可以去除一些细小的干扰细节和噪声,比一般直接使用卷积锐化算子得到的图像锐化结果更加真实可信。

USM锐化公式:

(源图像– w*高斯模糊)/(1-w)

w表示权重(0.1~0.9),默认为0.6

#

实现方式

1

高斯模糊GaussianBlur

2

图像加权混合addWeighted

代码语言:javascript
复制
    Mat src = imread("E:/DCIM/ryb/fx4.bmp");
    resize(src, src, Size(), 0.3, 0.3);
    imshow("src", src);

    //USM锐化    
    Mat blur_usm, dst_usm;
    cv::GaussianBlur(src, blur_usm, Size(0, 0), 25);
    cv::addWeighted(src, 1.5, blur_usm, -0.5, 0, dst_usm);
    imshow("dst_usm", dst_usm);

其中高斯模糊中的Size默认为Size(0,0),sigma的值一般用5,15,25即可,我这里用的是25,这样和Laplace对比比较明显,后面改为5后,两个效果比较接近了。

Laplace锐化

Laplace算子属于空间锐化滤波操作。由于Laplacian算子使用了图像梯度,它内部的代码其实是调用了Sobel算子的。

公式这里就不再列了,我们知道Laplace算子常用的一个滤波器如下:

#

实现方式

1

拉普拉斯滤波Laplacian

2

图像加权混合addWeighted

代码语言:javascript
复制
    Mat src = imread("E:/DCIM/ryb/fx4.bmp");
    resize(src, src, Size(), 0.3, 0.3);
    imshow("src", src);
    
    //Laplacian锐化
    Mat blur_laplace, dst_laplacian;
    cv::Laplacian(src, blur_laplace, -1);
    cv::addWeighted(src, 1, blur_laplace, -0.5, 0, dst_laplacian);
    imshow("dst_laplacian", dst_laplacian);

其中Laplacian方法也可以用filter2D来实现,定义一个kernel卷积,如下:

代码语言:javascript
复制
    Mat src = imread("E:/DCIM/ryb/fx4.bmp");
    resize(src, src, Size(), 0.3, 0.3);
    imshow("src", src);
    
    //Laplacian锐化
    Mat blur_laplace, dst_laplacian;
    Mat kernel = (Mat_<float>(3, 3) << 0, 1, 0, 1, -4, 1, 0, 1, 0);
    cv::filter2D(src, blur_laplace, CV_8UC3, kernel);
    cv::addWeighted(src, 1, blur_laplace, -0.5, 0, dst_laplacian);
    imshow("dst_laplacian", dst_laplacian);

Demo完整代码

代码语言:javascript
复制
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {

  try
  {

    Mat src = imread("E:/DCIM/ryb/fx4.bmp");
    resize(src, src, Size(), 0.3, 0.3);
    imshow("src", src);

    //USM锐化
    Mat blur_usm, dst_usm;
    cv::GaussianBlur(src, blur_usm, Size(0, 0), 25);
    cv::addWeighted(src, 1.5, blur_usm, -0.5, 0, dst_usm);
    imshow("dst_usm", dst_usm);

    //Laplacian锐化
    Mat blur_laplace, dst_laplacian;
    //Mat kernel = (Mat_<float>(3, 3) << 0, 1, 0, 1, -4, 1, 0, 1, 0);
    //cv::filter2D(src, blur_laplace, CV_8UC3, kernel);

    cv::Laplacian(src, blur_laplace, -1);

    cv::addWeighted(src, 1, blur_laplace, -0.5, 0, dst_laplacian);
    imshow("dst_laplacian", dst_laplacian);


    waitKey(0);
    return 0;
  }
  catch (const std::exception& ex)
  {
    cout << ex.what() << endl;
  }
}

局部对比效果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • USM锐化
  • Laplace锐化
  • Demo完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档