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

学更好的别人,

做更好的自己。

——《微卡智享》

26005a5af35d165f9631ffd35622e429.png

本文长度为1832,预计阅读4分钟

前言

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

ff8667f3cffda1e27cffaf997eb06895.png

实现效果

fe9e0355af53bc5786939ff49380e9a9.png

原图

5b62489bd7c07f7a7282bb2b1ddeccfe.png

USM锐化

eadd2dd3c5ecb3a7efc94e9ce447b040.png

Laplace锐化

51402c3b53f5d5ee557c4a0f5d4da06f.png

0c9ab465a2f69934f56adac0728940a6.png

0456b3e9f094fffd429c5966404d61e9.png

cb6b0f73ccaa78b95f26b670b6673a35.png

4daf1a2f4fcc0884474a61a3cb6a1445.png

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

d5fa90a973e9b5ec3ca72d2be2464fda.png

8dad7580b059a0ffa07452d4b90c0a49.png

锐化介绍

b7b9a45c092084c5372d3d95a02c23f1.png

微卡智享

USM锐化

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

USM锐化公式:

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

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

#实现方式
1高斯模糊GaussianBlur
2图像加权混合addWeighted
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算子常用的一个滤波器如下:

f239ddf08a1c9d2824f4fd7e4cc3591b.png

#实现方式
1拉普拉斯滤波Laplacian
2图像加权混合addWeighted
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卷积,如下:

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完整代码

#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;
  }
}

1a490de214e2a0aa6a726be023ba44bb.png

2f3923810b70ff35bc6b55c180629580.png

70f71315facb2336eba63b29078a91f0.png

c394e6930bcd5473748f571c67c74eb6.png

ab4f4ebb7a2c7e8420013bf2aab6bb03.png

局部对比效果

13b76ca4138931f472138774eec61f25.png

dac7ed60facce48824409ef50bdd2ee6.png

ed01fc611fd603fe539f0862e56c4bea.png

c9a5cd90d9a9752d8aab719ae444fe30.png

往期精彩回顾

 

6182fc23aca3bee47e815e14b1e8343d.png

Android Studio 2021.1.1的getNdkVersion的Bug及解决办法

 

 

90e3920421d8973118697123de4f76f0.png

笔记--解决Android使用retrofit2 OkHttp3短时间内大量通讯提示Socket Failed:EMFILE

 

 

fc5b91eb17d73f06e634b07a344698a6.png

笔记---Linux安装OpenCV及VSCode的配置编译

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值