1. 影像噪聲
影像的采集、處理、傳輸等程序難免會受到噪聲的污染,阻礙了人們對影像的理解和分析,
1.1 椒鹽噪聲
椒鹽噪聲也稱為脈沖噪聲,是影像中經常看到的一種噪聲, 它是一種隨機出現的白點或黑點, 它可能是亮區中的黑色像素或暗區中的白色像素,或兩者兼有, 椒鹽噪聲可能是由影像信號的突然強干擾、模數轉換器或位元傳輸錯誤引起的, 例如,傳感器故障導致像素值為最小值,傳感器飽和導致像素值為最大值,

1.2 高斯噪聲
高斯噪聲也稱為正態噪聲,指噪聲密度函式服從高斯分布的一類噪聲, 由于高斯噪聲在空間和頻域中的數學上的簡易性,在實踐中經常使用這種噪聲模型, 高斯隨機變數 z 的概率密度函式由下式給出:
其中,z代表灰度值,μ代表z的平均值或期望值,σ代表z的標準差, 標準差的平方 σ^2 稱為z的方差,

2. 影像平滑方法
從信號處理的角度來看,影像平滑就是去除高頻資訊,保留低頻資訊, 所以我們可以對影像進行低通濾波, 低通濾波可以去除影像中的噪聲,使影像平滑,
根據濾波器的不同,影像平滑方法可分為均值濾波、高斯濾波、中值濾波等,
2.1 均值濾波
均值濾波模板用于濾除影像噪聲, 令 S xy 表示中心在 (x, y) 且大小為 m×n 的矩形子影像視窗的坐標組,
均值濾波可以表示為:

均值濾波由歸一化卷積框完成,它將中心元素替換為卷積框覆寫區域內所有像素的平均值, 例如,這是一個 3x3 的標準化均值濾波器:

cv.blur(src, ksize, anchor, borderType)
引數:
src 輸入影像
ksize 卷積核的大小
anchor 核中心,默認值(-1,-1)
borderType 邊界型別
均值濾波的優點:演算法簡單,計算速度較快,
均值濾波的缺點:去噪的同時去除了很多細節,影像變得模糊,
2.2 高斯濾波
二維高斯是構建高斯濾波器的基礎,其概率分布函式如下:

G(x,y) 的分布是凸出的帽子的形狀,這里σ可以看成兩個值,一個是x方向的標準差σx,另一個是y方向的標準差σy,

當σx和σy的值較大時,整個形狀趨于平坦; 當σx和σy的值較小時,整個形狀變得更加突出,正態分布是一條鐘形曲線, 離中心越近,數值越大;離中心越遠,數值越小,計算平滑結果時,只需要以中心點為原點,根據其他點在正態曲線上的位置,為其分配權重,即可得到加權平均值,
高斯平滑對于從影像中去除高斯噪聲非常有效,
高斯平滑首先需要確定權重矩陣,假設中心點的坐標為(0,0),那么最近的8個點的坐標如下:

其他更遠的點可以類推,計算權重矩陣還需要設定σ的值, 假設σ=1.5,模糊半徑為1的權重矩陣如下:

這 9 個點的權重之和等于 0.4787147,如果只計算這9個點的加權平均值,它們的權重之和必須等于1,因此,必須將上述9個值除以0.4787147才能得到最終的權重矩陣,

通過權重矩陣,可以計算出高斯模糊的值, 假設有9個像素,灰度值(0~255)如下:

每個點乘以相應的權重值:

可得出:

將這 9 個值相加就是中心點處的高斯模糊值, 對所有點重復這個程序,得到高斯模糊影像, 如果原始影像是彩色影像,可以分別對R、G、B三個通道進行高斯平滑,
cv.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
引數:
src 輸入影像
ksize 高斯卷積核的大小,卷積核的寬度和高度都應為奇數,且可以不同
sigmaX 水平方向的標準差
sigmaY 豎直方向的標準差,默認為0,表示與sigmaX相同
borderType 填充邊界型別,默認為BORDER_DEFAULT
2.3 中值濾波
中值濾波是一種典型的非線性濾波技術, 其基本思想是用像素鄰域的灰度值的中值代替像素的灰度值,
中值濾波對于椒鹽噪聲特別有用,因為它不依賴于與典型值非常不同的鄰域值,
cv.medianBlur(src, ksize)
引數:
src 輸入影像
ksize 卷積核的大小
例:對圖1進行均值濾波和中值濾波去除噪聲,對圖2進行高斯濾波去除噪聲,
圖1:有椒鹽噪聲的影像,

圖2:有高斯噪聲的影像,

import cv2 as cv
import matplotlib.pyplot as plt
import matplotlib
font = {
"family": "Microsoft YaHei"
}
matplotlib.rc("font", **font)
dogsp = cv.imread("./image/dogsp.jpeg")
doggau = cv.imread("./image/dogGauss.jpeg")
# 均值濾波
dog = cv.blur(dogsp, (5, 5))
plt.imshow(dog[:, :, ::-1])
plt.title("均值濾波")
plt.show()
# 高斯濾波
dog = cv.GaussianBlur(doggau, (3, 3), 1)
plt.imshow(dog[:, :, ::-1])
plt.title("高斯濾波")
plt.show()
# 中值濾波
dog = cv.medianBlur(dogsp, 3)
plt.imshow(dog[:, :, ::-1])
plt.title("中值濾波")
plt.show()
輸出:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295282.html
標籤:其他
