1. 影像銳化和增強
影像銳化 是一種突出和加強影像中景物的邊緣和輪廓的技術,使影像變得更加清晰。它透過增強影像的高分頻量來減少影像中的模糊,增強影像細節邊緣和輪廓,增強灰度反差,便於後期對目標的辨識和處理。
影像增強 是改善影像品質的技術,包括影像銳化、去噪、對比度增強、色彩增強等。影像銳化是影像增強中的一種重要技術。
影像銳化和影像增強的區別在於,影像銳化側重於突出影像中的細節,而影像增強則可以包括更廣泛的操作,以滿足不同的套用需求。
以下簡單總結了影像銳化和影像增強之間的區別:
特征 | 影像銳化 | 影像增強 |
---|---|---|
目的 | 增強影像的邊緣和細節 | 改善影像的整體品質 |
方法 | 增強影像的高分頻量 | 可以包括銳化、去噪、對比度增強、色彩調整等多種操作 |
套用 | 適用於需要突出影像細節的場景,例如醫學影像處理、遙感影像分析等 | 適用於需要改善影像品質的各種場景,例如照片編輯、視訊處理等 |
2. 影像銳化方法
影像銳化的方法主要有以下兩種:
空間域方法 :在空間域上直接對影像進行處理。常用的空間域銳化方法包括:
a. 銳化濾波器:利用銳化濾波器對影像進行摺積運算,增強影像的邊緣和細節。常用的銳化濾波器包括 Prewitt 算子、Roberts 算子、Laplace 算子等。
b. USM 銳化:USM(Unsharpen Mask)銳化是一種常用的銳化方法,它先對影像進行高斯濾波,然後用原影像減去高斯濾波後的影像,再將結果乘以一個系數,最後將結果加到原影像中。
頻域方法 :將影像變換到頻域,然後對高分頻量進行增強,再將影像變換回空間域。常用的頻域銳化方法包括高通濾波等。
3. 拉普拉斯銳化和 USM 銳化
3.1 拉普拉斯銳化
在該系列的第八篇和第十篇文章中,都曾經介紹過 拉普拉斯算子 ,它是二階導數的邊緣算子。
之前我們曾介紹過二階導數的 Laplace 算子可以透過 差分 近似來 簡化 ,其公式為:
它的 4 鄰域摺積核:
它的 8 鄰域摺積核:
拉普拉斯銳化 透過增強影像中的二階導數來突出邊緣。
拉普拉斯銳化 的基本原理:當鄰域的中心像素灰度低於它所在鄰域內的其他像素的平均灰度時,此中心像素的灰度應該進一步降低;當高於時進一步提高中心像素的灰度,從而實作影像銳化處理。
拉普拉斯的銳化公式:
其中,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;
}
當然,上述程式碼中拉普拉斯銳化的實作也可以用
filter2D()
函式實作。
3.2 USM 銳化
USM 銳化(Unsharp Mask Sharpening),它透過增強影像的邊緣和細節來使影像變得更加清晰。
USM 銳化的工作原理是:
對原影像進行 高斯模糊 處理,得到模糊後的影像。
將原影像減去模糊後的影像,得到 殘留誤差影像 。
將殘留誤差影像乘以一個 銳化因子 ,得到 增強後的殘留誤差影像 。
將增強後的殘留誤差影像與原影像進行 疊加 ,得到銳化後的影像。
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), 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);
}
}
}
}
intmain(){
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);
return0;
}
4. 總結
本文簡單介紹了影像銳化和增強的含義以及他們之間的區別。
詳細介紹了2種銳化方式,拉普拉斯銳化通常適用於需要快速銳化影像的場景,例如對模糊的影像進行簡單的銳化處理。USM 銳化通常適用於需要對銳化效果進行精細控制的場景,例如對照片進行銳化處理。當然,也可以將兩種方法結合使用,例如先使用拉普拉斯銳化進行快速銳化,然後再使用 USM 銳化進行精細調整。
系統化學習直接掃碼檢視
推薦閱讀