OpenCV学习笔记(十二)之USM图像锐化

LUT原理  提到LUT,很多人可能都会觉得这是一个很专业很高深的词汇,LUT其实就是Look Up Table(颜色查找表)的缩写,简单点儿理解就是:通过LUT,我们可以将一组RGB值输出为另一组RGB值,从而改变画面的曝光与色彩。LUT文件就是一个包含了可以改变输入颜色信息的矩阵数据。LUT本身并不进行运算,只需在其中列举一系列输入与输出数据即可,这些数据呈一一对应的关系,系统按照此对应关系...
摘要由CSDN通过智能技术生成
一、图像锐化原理

  图像锐化,是使图像边缘更加清晰的一种图像处理方法,说白了就是让图像的边缘看起来更加清晰明了。其原理主要就是利用图像的高频分量来实现的,将原图像的高频分量提取出来,再和原图像按一定规则叠加起来,最终得到的图像就是锐化后的图像。提取高频分量可以有如下两种方式:

  • 1.直接使用高通滤波器来提取图像高频分量,如Sobel算子、Laplace算子、梯度Prewitt算子等。其中Sobel提取出来的边缘比较粗糙,Laplace提取出来的边缘更加细腻,因此也更加适合用于做锐化滤波器;
  • 2.先使用低通滤波器对图像进行滤波处理,得到图像中的低频分量,再用原图像减去滤波得到的低频分量图像得到高频分量,最后将高频分量和原图像叠加得到锐化后的图像。这种方法也称为非锐化掩模(USM),我们常使用低通滤波器(高斯、双边)对图像进行滤波,这种方法的滤波器很好控制(包括大小和强弱),从而可以灵活控制高频分量的强弱。
二、USM锐化增强算法

  数字图像处理中关于图像增强算法有两种常用的技术:非锐化掩蔽和高提升滤波
在这里插入图片描述
图中g表示锐化后的图像,f表示原图像,k表示锐化系数,m为高频分量图像。

非锐化掩模(USM)

其原理如上面所说,步骤如下:

  • 1、首先使用低通滤波器平滑原图像得到低频分量图像:s = f(低通滤波);
  • 2、原图像减去低频分量图像,产生的差值,高频分量图像称为模板:m = f - s;
  • 3、将模板图像乘以一个系数,加到原图像中,得到锐化后的图像:g = f + k × m

  传统的锐化算法通过获取高频分量然后与原图像叠加做锐化,这种方法虽然效果很明显,但是容易出现噪声增强的现象,而且很容易在图像纹理的边缘处产生明亮的伪边缘,如下图所示:
在这里插入图片描述
可以看出,在lena的帽子处和头发边缘均有一定的白色伪边缘产生,而且锐化后的图像还出现了许多噪声,使得图像的整体锐化效果变得很差。

改进的非锐化掩模(USM)

  USM锐化算法得到的图像容易出现噪声及伪边缘,那么,如果能够做到只针对图像中的边缘部分做锐化处理,是不是就可以在保证锐化效果的前提下最大程度的保留原图中的非噪声信息呢?要实现这个功能,我们需要设置一个阈值,将原图像与滤波后得到的高频分量图像做差值,再与阈值比较,即可得到想要的效果。具体步骤如下:

  • 1.先对原图像src做高斯滤波得到滤波图像BlurImg,src(高斯模糊) -> BlurImg;
  • 2.原图像src与滤波图像做差值,再与阈值Threshold比较,结果存放在掩模Mask中,Mask = abs( src - BlurImg ) < Threshold ? 1 : 0;
  • 3.将src与高频分量图像按一定系数叠加,得到锐化图像,SharpenImg = src + k × ( src - BlurImg );
  • 4.将src中Mask对应的非0部分复制到SharpenImg 中;

经过以上几步简单操作就可以得到优化后的USM锐化图像了,改良后的USM锐化的图像效果如下图所示:
在这里插入图片描述
上图最右边的图像即为优化后的USM锐化图像,对比未优化的USM锐化图像可以看出,在提高锐化效果的基础上尽可能的降低了噪声和伪边缘现象。

三、代码实现

  本文中实现的锐化算法使用OpenCV4.1.0版本,VS2017环境,实验代码如下:

// USM_SharpenFilter.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

#define SharpenFactor 1   //锐化系数
#define SharpenThs 30   //锐化阈值

void ImproveUSM(Mat src, Mat BlurImg, int Threshold, float Factor) 
{
   
	Mat DiffMask, dst;
  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,OpenCV是一个开源计算机视觉和机器学习软件库,用于开发图像和视频处理应用程序。通过使用OpenCV,您可以读取摄像头并显示实时图像,打开视频文件或摄像头文件,并获取视频的相关信息,例如帧宽度、帧高度、帧率和总帧数。 对于学习OpenCV,你可以按照以下步骤进行: 1. 安装OpenCV库:在开始学习OpenCV之前,您需要从OpenCV官方网站下载和安装OpenCV库。根据您的操作系统和编程语言选择合适的版本。 2. 学习基本概念:熟悉OpenCV的基本概念和术语,例如图像和视频的加载、显示、保存以及常用的图像处理操作,如滤波、边缘检测和特征提取等。 3. 掌握OpenCV函数和类:深入了解OpenCV提供的函数和类,例如cv::Mat用于图像和矩阵操作,cv::VideoCapture用于读取和处理视频,以及cv::imshow和cv::waitKey等用于显示图像的函数。 4. 实践项目:通过完成一些实践项目来应用您所学到的知识。例如,利用OpenCV实现人脸检测、目标追踪、图像识别等。 5. 学习资料和资源:查找和阅读OpenCV的官方文档、教程和示例代码,参与开源社区讨论和交流,加入相关的论坛和邮件列表等。 总结起来,学习OpenCV包括安装OpenCV库、学习基本概念、掌握OpenCV函数和类、实践项目以及查找和阅读相关资料和资源。通过不断实践和学习,您将能够更好地理解和应用OpenCV库来开发图像和视频处理应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值