**非銳化遮罩(Unsharp Masking)**的目的是影像銳化,可以強化影像中的邊緣和細節等資訊。定義如下:
其中 稱為非銳化遮罩, 為對原始影像平滑化的結果。
參數k用來調整銳化的程度:k = 1時稱為非銳化遮罩,k > 1時稱為高增濾波(Highboost Filtering)
程式碼如下:
import numpy as np
import cv2
def unsharp_masking(f, k = 1.0):
g = f.copy()
nr, nc = f.shape[:2]
f_avg = cv2.GaussianBlur(f,(15, 15), 0)
for x in range(nr):
for y in range(nc):
g_mask = int(f[x, y]) - int(f_avg[x, y])
return g
def main():
img1 = cv2.imread("D:\Desktop\IThome\house_test.jpg", 0)
img2 = unsharp_masking(img1, 10.0)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.waitKey()
main()
以高增濾波器而言,k值愈大,影像銳化的效果越明顯,但當k太大時,反而也會強化影像中的雜訊,造成反效果,
中值濾波器(Median Filter)的處理過程,先以(x,y)為中心,取其鄰近區域(例如3x3、4x4)的像素值構成集合,接著對集合進行排序與取中間值,就是(x,y)的輸出像素質。由於過程中牽涉排序,因此屬於**非線性濾波**。
中值濾波通常用來去除雜訊,我選擇一個較誇張的例子,如下:
我們可以用OpenCV內建的MedianBlur函式進行中值濾波,程式碼如下:
import numpy as np
import cv2
img1 = cv2.imread("D:\Desktop\IThome\lena_falt and pepper.jpg", 0)
img2 = cv2.medianBlur(img1, 3)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.waitKey()
雙邊濾波(Bilateral Filtering)是一種影像平滑化的技術,屬於非線性濾波。雙邊濾波除了使用像素之間的幾何靠近程度之外,同時考慮像素之間的強度差異,使雙邊濾波能有效去除雜訊,同持保留影像的邊緣資訊。
可以看到左圖為原始影像,右圖中為經過雙邊濾波後,影像的臉部變平滑許多。因此雙邊濾波常用在美膚、美肌,可有效對皮膚區域平滑化,同時保留眼睛、鼻子等邊緣資訊
import numpy as np
import cv2
img1 = cv2.imread("D:\Desktop\IThome\lena.bmp", 0)
img2 = cv2.bilateralFilter(img1, 5, 50, 50)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.waitKey()