OpenCV4入门教程054:USM锐化 您所在的位置:网站首页 图片锐化原理视频教程 OpenCV4入门教程054:USM锐化

OpenCV4入门教程054:USM锐化

2024-07-07 21:01| 来源: 网络整理| 查看: 265

索引地址:系列索引

图像锐化原理

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

1.直接使用高通滤波器来提取图像高频分量,如Sobel算子、Laplace算子、梯度Prewitt算子等。其中Sobel提取出来的边缘比较粗糙,Laplace提取出来的边缘更加细腻,因此也更加适合用于做锐化滤波器;

2.先使用低通滤波器对图像进行滤波处理,得到图像中的低频分量,再用原图像减去滤波得到的低频分量图像得到高频分量,最后将高频分量和原图像叠加得到锐化后的图像。这种方法也称为非锐化掩模(USM),我们常使用低通滤波器(高斯、双边)对图像进行滤波,这种方法的滤波器很好控制(包括大小和强弱),从而可以灵活控制高频分量的强弱。

USM锐化增强算法

数字图像处理中关于图像增强算法有两种常用的技术:非锐化掩蔽和高提升滤波

g=f+k⋅m. k>1高提升滤波=1非锐化掩蔽1=1 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锐化图像了。

测试代码:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include "opencv2/opencv.hpp"#include

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; DiffMask = Mat::zeros(src.rows, src.cols, src.type()); if (src.channels() == 1) //灰度单通道 { for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { int Value_diff = abs(src.at(i, j) - BlurImg.at(i, j)); if (Value_diff < Threshold) //小于阈值说明非边缘,不需要锐化 DiffMask.at(i, j) = 1; else DiffMask.at(i, j) = 0; } } } else if (src.channels() == 3) //三通道BGR { int Value_diff[ 3 ] = {0}; for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { for (int k = 0; k < 3; k++) { Value_diff[ k ] = abs(src.at(i, j)[ k ] - BlurImg.at(i, j)[ k ]);

if (Value_diff[ k ] < Threshold) //小于阈值说明非边缘,不需要锐化 DiffMask.at(i, j)[ k ] = 1; else DiffMask.at(i, j) = 0; } } } } addWeighted(src, 1 + Factor, BlurImg, -Factor, 0, dst); //将两幅图按权重系数融合,dst = src + Factor(src - BlurImg) src.copyTo(dst, DiffMask); //将src中DiffMask对应的非0部分复制到dst中 imshow("ImproveUSM", dst);}

int main() { int Ths = SharpenThs; float Fac = SharpenFactor; Mat src = imread("lena.jpg"); if (src.empty()) { printf("could not load image...\n"); return -1; } namedWindow("input", WINDOW_AUTOSIZE); imshow("input", src);

Mat blur_img, USMsharpen_img, sharpen_img, sharpen_kernel; sharpen_kernel = (Mat_(3, 3)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有