OpenCV 笔记(31):图像锐化算法——拉普拉斯锐化和 USM 锐化

1. 图像锐化和增强

图像锐化是一种突出和加强图像中景物的边缘和轮廓的技术,使图像变得更加清晰。它通过增强图像的高频分量来减少图像中的模糊,增强图像细节边缘和轮廓,增强灰度反差,便于后期对目标的识别和处理。

图像增强是改善图像质量的技术,包括图像锐化、去噪、对比度增强、色彩增强等。图像锐化是图像增强中的一种重要技术。

图像锐化和图像增强的区别在于,图像锐化侧重于突出图像中的细节,而图像增强则可以包括更广泛的操作,以满足不同的应用需求。

以下简单总结了图像锐化和图像增强之间的区别:

特征 图像锐化 图像增强
目的 增强图像的边缘和细节 改善图像的整体质量
方法 增强图像的高频分量 可以包括锐化、去噪、对比度增强、色彩调整等多种操作
应用 适用于需要突出图像细节的场景,例如医学图像处理、遥感图像分析等 适用于需要改善图像质量的各种场景,例如照片编辑、视频处理等

2. 图像锐化方法

图像锐化的方法主要有以下两种:

  • 空间域方法:在空间域上直接对图像进行处理。常用的空间域锐化方法包括:
    a. 锐化滤波器:利用锐化滤波器对图像进行卷积运算,增强图像的边缘和细节。常用的锐化滤波器包括 Prewitt 算子、Roberts 算子、Laplace 算子等。

    b. USM 锐化:USM(Unsharpen Mask)锐化是一种常用的锐化方法,它先对图像进行高斯滤波,然后用原图像减去高斯滤波后的图像,再将结果乘以一个系数,最后将结果加到原图像中。

  • 频域方法:将图像变换到频域,然后对高频分量进行增强,再将图像变换回空间域。常用的频域锐化方法包括高通滤波等。

3. 拉普拉斯锐化和 USM 锐化

3.1 拉普拉斯锐化

在该系列的第八篇和第十篇文章中,都曾经介绍过拉普拉斯算子,它是二阶导数的边缘算子。

之前我们曾介绍过二阶导数的 Laplace 算子可以通过差分近似来简化,其公式为:

\nabla^2f(x,y)= f(x+1,y)+f(x-1,y)+ f(x,y+1)+f(x,y-1)-4f(x,y)

它的 4 邻域卷积核:

拉普拉斯核.png

它的 8 邻域卷积核:

扩展的拉普拉斯算子.png

拉普拉斯锐化通过增强图像中的二阶导数来突出边缘。

拉普拉斯锐化的基本原理:当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。

拉普拉斯的锐化公式:g(x,y)=f(x,y)+c[\nabla^2f(x,y)]

其中,f(x,y) 表示原图,g(x,y) 表示锐化后的图像。

对于 4 邻域卷积核:

g(x,y)=f(x,y) - \nabla^2f(x,y)= 5f(x,y)-f(x+1,y)-f(x-1,y)-f(x,y+1)-f(x,y-1)

用模板表示如下:

\begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix}

对于 8 邻域卷积核:

g(x,y)=f(x,y) - \nabla^2f(x,y) \\= 9f(x,y)- f(x-1,y-1)-f(x,y-1)-f(x+1,y-1)\\ -f(x-1,y)-f(x+1,y)-f(x-1,y+1)-f(x,y+1)-f(x+1,y+1)

用模板表示如下:

\begin{bmatrix} -1 & -1 & -1 \\ -1 & 9 & -1 \\ -1 & -1 & -1 \end{bmatrix}

拉普拉斯锐化可以有效地增强图像的边缘和细节,但它也会放大图像中的噪声。因此,在锐化图像之前,通常需要先进行去噪处理

下面的例子,通过 8 邻域拉普拉斯算子对图像进行锐化

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

int main() {
    Mat src = imread(".../girl.jpg");

    imshow("src", src);

    int height = src.rows;
    int width  = src.cols;
    int border = 1;
    Mat dst(height, width, CV_8UC3);
    for (int i = border; i < height - border; i++) {
        for (int j = border; j < width - border; j++) {
            for (int k = 0; k < 3; k++) {
                int sum = 9 * src.at<Vec3b>(i, j)[k] - src.at<Vec3b>(i - 1, j - 1)[k] - src.at<Vec3b>(i - 1, j)[k]
                          - src.at<Vec3b>(i - 1, j + 1)[k] - src.at<Vec3b>(i, j - 1)[k] - src.at<Vec3b>(i, j + 1)[k]
                          - src.at<Vec3b>(i + 1, j - 1)[k] - src.at<Vec3b>(i + 1, j)[k] - src.at<Vec3b>(i + 1, j + 1)[k];
                dst.at<Vec3b>(i, j)[k] = saturate_cast<uchar>(sum);
            }
        }
    }

    imshow("laplaceSharp", dst);

    waitKey(0);
    return 0;
}
拉普拉斯锐化效果.png

当然,上述代码中拉普拉斯锐化的实现也可以用 filter2D()函数实现。

3.2 USM 锐化

USM 锐化(Unsharp Mask Sharpening),它通过增强图像的边缘和细节来使图像变得更加清晰。

USM 锐化的工作原理是:

  1. 对原图像进行高斯模糊处理,得到模糊后的图像。
  2. 将原图像减去模糊后的图像,得到残差图像
  3. 将残差图像乘以一个锐化因子,得到增强后的残差图像
  4. 将增强后的残差图像与原图像进行叠加,得到锐化后的图像。

USM 锐化具有以下特点:

  • 可以有效地增强图像的边缘和细节。
  • 具有较强的控制性,用户可以通过调整锐化因子、半径和阈值等参数来控制锐化效果。
  • 可能会放大图像中的噪声。

USM 锐化通常具有以下三个参数:

  • 锐化因子(Amount):控制锐化效果的强度。值越大,锐化效果越明显。
  • 阈值(Threshold):控制哪些像素会被锐化。值越大,只有灰度值差异较大的像素才会被锐化,可以减少噪声的影响。
  • 半径(Radius):控制锐化范围的大小。值越大,锐化范围越大,边缘越模糊。

下面的例子,实现了一个 USM 锐化。

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

void unsharpMask(const Mat& src, Mat& dst, int radius, int threshold, int amount) {
    int height = src.rows;
    int width = src.cols;
    GaussianBlur(src, dst, cv::Size(radius, radius), 2, 2);

    for (int h = 0; h < height; ++h) {
        for (int w = 0; w < width; ++w) {
            int b = src.at<Vec3b>(h, w)[0] - dst.at<Vec3b>(h, w)[0];
            int g = src.at<Vec3b>(h, w)[1] - dst.at<Vec3b>(h, w)[1];
            int r = src.at<Vec3b>(h, w)[2] - dst.at<Vec3b>(h, w)[2];
            if (abs(b) > threshold) {
                b = src.at<Vec3b>(h, w)[0] + amount * b / 100;
                dst.at<Vec3b>(h, w)[0] = saturate_cast<uchar>(b);
            }
            if (abs(g) > threshold) {
                g = src.at<Vec3b>(h, w)[1] + amount * g / 100;
                dst.at<Vec3b>(h, w)[1] = saturate_cast<uchar>(g);
            }
            if (abs(r) > threshold) {
                r = src.at<Vec3b>(h, w)[2] + amount * r / 100;
                dst.at<Vec3b>(h, w)[2] = saturate_cast<uchar>(r);
            }
        }
    }
}

int main() {
    Mat src = imread(".../girl.jpg");

    imshow("src", src);

    Mat dst = Mat(src.size(), src.type());
    unsharpMask(src,dst, 181, 0, 90);
    imshow("usm", dst);

    waitKey(0);
    return 0;
}
usm锐化效果.png

4. 总结

本文简单介绍了图像锐化和增强的含义以及他们之间的区别。

详细介绍了2种锐化方式,拉普拉斯锐化通常适用于需要快速锐化图像的场景,例如对模糊的图像进行简单的锐化处理。USM 锐化通常适用于需要对锐化效果进行精细控制的场景,例如对照片进行锐化处理。当然,也可以将两种方法结合使用,例如先使用拉普拉斯锐化进行快速锐化,然后再使用 USM 锐化进行精细调整。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容