當前位置: 妍妍網 > 碼農

OpenCV築基之拉普拉斯銳化和USM銳化增強

2024-05-06碼農

1. 影像銳化和增強

影像銳化 是一種突出和加強影像中景物的邊緣和輪廓的技術,使影像變得更加清晰。它透過增強影像的高分頻量來減少影像中的模糊,增強影像細節邊緣和輪廓,增強灰度反差,便於後期對目標的辨識和處理。

影像增強 是改善影像品質的技術,包括影像銳化、去噪、對比度增強、色彩增強等。影像銳化是影像增強中的一種重要技術。

影像銳化和影像增強的區別在於,影像銳化側重於突出影像中的細節,而影像增強則可以包括更廣泛的操作,以滿足不同的套用需求。

以下簡單總結了影像銳化和影像增強之間的區別:

特征 影像銳化 影像增強
目的 增強影像的邊緣和細節 改善影像的整體品質
方法 增強影像的高分頻量 可以包括銳化、去噪、對比度增強、色彩調整等多種操作
套用 適用於需要突出影像細節的場景,例如醫學影像處理、遙感影像分析等 適用於需要改善影像品質的各種場景,例如照片編輯、視訊處理等

2. 影像銳化方法

影像銳化的方法主要有以下兩種:

  • 空間域方法 :在空間域上直接對影像進行處理。常用的空間域銳化方法包括:

  • a. 銳化濾波器:利用銳化濾波器對影像進行摺積運算,增強影像的邊緣和細節。常用的銳化濾波器包括 Prewitt 算子、Roberts 算子、Laplace 算子等。

    b. USM 銳化:USM(Unsharpen Mask)銳化是一種常用的銳化方法,它先對影像進行高斯濾波,然後用原影像減去高斯濾波後的影像,再將結果乘以一個系數,最後將結果加到原影像中。

  • 頻域方法 :將影像變換到頻域,然後對高分頻量進行增強,再將影像變換回空間域。常用的頻域銳化方法包括高通濾波等。

  • 3. 拉普拉斯銳化和 USM 銳化

    3.1 拉普拉斯銳化

    在該系列的第八篇和第十篇文章中,都曾經介紹過 拉普拉斯算子 ,它是二階導數的邊緣算子。

    之前我們曾介紹過二階導數的 Laplace 算子可以透過 差分 近似來 簡化 ,其公式為:

    它的 4 鄰域摺積核:

    拉普拉斯核.png

    它的 8 鄰域摺積核:

    擴充套件的拉普拉斯算子.png

    拉普拉斯銳化 透過增強影像中的二階導數來突出邊緣。

    拉普拉斯銳化 的基本原理:當鄰域的中心像素灰度低於它所在鄰域內的其他像素的平均灰度時,此中心像素的灰度應該進一步降低;當高於時進一步提高中心像素的灰度,從而實作影像銳化處理。

    拉普拉斯的銳化公式:

    其中,f(x,y) 表示原圖,g(x,y) 表示銳化後的影像。

    對於 4 鄰域摺積核:

    用樣版表示如下:

    對於 8 鄰域摺積核:

    用樣版表示如下:

    拉普拉斯銳化可以有效地增強影像的邊緣和細節,但它也會放大影像中的雜訊。因此,在銳化影像之前,通常需要先進行 去噪處理

    下面的例子,透過 8 鄰域拉普拉斯算子對影像進行銳化

    #include<opencv2/opencv.hpp>
    #include<opencv2/core.hpp>
    #include<opencv2/highgui.hpp>
    usingnamespacestd;
    usingnamespace cv;
    intmain(){
    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);
    return0;
    }




    拉普拉斯銳化效果.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>
    usingnamespacestd;
    usingnamespace cv;
    voidunsharpMask(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), 22);
    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);
    }
    }
    }
    }
    intmain(){
    Mat src = imread(".../girl.jpg");
    imshow("src", src);
    Mat dst = Mat(src.size(), src.type());
    unsharpMask(src,dst, 181090);
    imshow("usm", dst);
    waitKey(0);
    return0;
    }





    usm銳化效果.png

    4. 總結

    本文簡單介紹了影像銳化和增強的含義以及他們之間的區別。

    詳細介紹了2種銳化方式,拉普拉斯銳化通常適用於需要快速銳化影像的場景,例如對模糊的影像進行簡單的銳化處理。USM 銳化通常適用於需要對銳化效果進行精細控制的場景,例如對照片進行銳化處理。當然,也可以將兩種方法結合使用,例如先使用拉普拉斯銳化進行快速銳化,然後再使用 USM 銳化進行精細調整。


    系統化學習直接掃碼檢視

    推薦閱讀