實驗前言
噪音類型
opencv常見噪音類型有
-
高斯噪音:高斯噪音是一種隨機噪音,其數值服從正態分布。圖像受到高斯噪音的影響時,像素值的變化類似于白噪音,但是噪音的強度會隨像素值的變化而變化。
-
椒鹽噪音:椒鹽噪音是指在圖像中隨機出現黑點和白點,其強度和數量不確定。這種噪音通常是由圖像損壞或傳輸過程中的數據錯誤引起的。
-
毛刺噪音:毛刺噪音是在圖像中出現的一些明顯的、非細節部分的異常像素,通常由于圖像缺失或電磁干擾等原因造成。
-
泊松噪音:泊松噪音通常是在低亮度條件下拍攝時出現的。這種噪音的產生是由于圖像的弱信號在成像過程中受到波動,導致像素值的隨機變化。
-
光斑噪音:光斑噪音是在相機成像時出現的一些類似黑點的噪音,通常是由圖像傳感器中照明部分的壞點或粒子雜質造成的。
去噪方法
-
均值濾波(Mean Filter):將像素值替換為周圍像素的平均值。適用于輕度噪音去除,但會模糊圖像細節。
-
中值濾波(Median Filter):將像素值替換為周圍像素值的中值。適用于去除椒鹽噪音和毛刺噪音,并保留邊緣信息。
-
高斯濾波(Gaussian Filter):使用高斯核對圖像進行濾波,模糊圖像并去除高斯噪音。
-
雙邊濾波(Bilateral Filter):結合空域和灰度信息,可以有效地去除噪音,并保持邊緣的清晰度。
-
非局部均值濾波(Non-local Means Denoising):通過基于相似性的像素塊來估計每個像素的值,適用于去除多種噪音。
-
K近鄰平均濾波(K-nearest Neighborhood Averaging Filter):通過計算K個最相似像素的平均值來去噪,適用于去除椒鹽噪音。
-
快速傅里葉變換(Fast Fourier Transform, FFT):通過將圖像轉換到頻域進行濾波,可以有效去除周期性噪音。
除了上述方法外,OpenCV 還支持其他一些高級的去噪算法,如小波變換去噪(Wavelet Denoising)、總變差去噪(Total Variation Denoising)等。這些算法都有不同的適用場景和去噪效果,根據具體的需求和噪音類型,選擇合適的方法能獲得更好的去噪效果。
實驗設計
選取二張彩色圖像,對其中的每一張彩色圖像進行灰度化再分別加入高斯噪音、椒鹽噪音共二種噪音,改變噪音的參數查看效果。
去噪處理時用到高斯濾波、雙邊濾波、均值濾波和中值濾波共4種濾波和去噪方法。對高斯噪音使用高斯濾波、雙邊濾波和中值濾波進行去噪;對椒鹽噪音使用K近鄰平均濾波、均值濾波進行去噪;
一共5組實驗,對于每組實驗的去噪效果使用2種評估方法:峰值信噪比(Peak Signal-to-Noise Ratio, PSNR)、 結構相似性指標(英文:structural similarity index measure,SSIM)進行評估。
評估方法
PSNR
簡介
Peak signal-to-noise ratio(簡稱PSNR)是一個工程術語,表示信號的最大可能功率與影響信號表示精度的干擾噪聲功率之間的比值。由于許多信號都有非常寬的動態范圍,峰值訊噪比常用對數分貝單位來表示。
定義
它常簡單地通過均方誤差(MSE)進行定義。兩個 m × n m×nm×n 單色圖像 I II 和 K KK , I II 為一無噪聲的原始圖像,K KK 為 I II 的噪聲近似(例: I II 為未壓縮的原始圖像,K KK為 I II 經過壓縮后的圖像),那么它們的的均方誤差定義為:
則PSNR可定義為(針對灰度圖):
其中MAXI為圖像的最大像素值,PSNR的單位為dB。若每個像素由8位二進制表示,則其值為2^8-1=255。
更為通用的表示是,如果每個采樣點用 B 位線性脈沖編碼調制表示,那么MAXI 就是
對于每點有RGB三個值的彩色圖像來說,峰值信噪比的定義類似。除了橫軸、縱軸 m mm 和 n nn 以外,還要考慮它的顏色組成RGB。我們需要分別對每個顏色處理其MSE,因為有3個顏色通道,所以MSE需再除以3。
彩色圖像的峰值訊噪比定義為:
意義
-
PSNR接近 50dB ,代表壓縮后的圖像僅有些許非常小的誤差。
-
PSNR大于 30dB ,人眼很難查覺壓縮后和原始影像的差異。
-
PSNR介于 20dB 到 30dB 之間,人眼就可以察覺出圖像的差異。
-
PSNR介于 10dB 到 20dB 之間,人眼還是可以用肉眼看出這個圖像原始的結構,且直觀上會判斷兩張圖像不存在很大的差異。
-
PSNR低于 10dB,人類很難用肉眼去判斷兩個圖像是否為相同,一個圖像是否為另一個圖像的壓縮結果。
實現
我們可以調用第三方庫skimage
實現,里面有封裝好的計算PSNR
的代碼,具體調用方式如下:
from skimage.metrics import peak_signal_noise_ratio as psnr
from PIL import Image
import numpy as npimg1 = np.array(Image.open('original.jpg'))
img2 = np.array(Image.open('compress.jpg'))if __name__ == "__main__":print(psnr(img1, img2))
SSIM(結構相似性)
簡介
結構相似性指標(英文:structural similarity index measure,簡稱SSIM)是一種用以衡量兩張數位影像相似程度的指標。當兩張影像其中一張為無失真影像,另一張為失真后的影像,二者的結構相似性可以看成是失真影像的影像品質衡量指標。相較于傳統所使用的影像品質衡量指標,像是峰值信噪比(英語:PSNR),結構相似性在影像品質的衡量上更能符合人眼對影像品質的判斷。
定義
給定兩個信號 x {\displaystyle \mathbf {x} }x 和 y {\displaystyle \mathbf {y} }y,兩者的結構相似性定義為:
其中l(x,y)比較x和y的亮度,c(x,y)比較x和y的對比度,s(x,y)比較x和y的結構,α>0,β>0,γ>0,為調整l(x,y),c(x,y),s(x,y)相對重要性的參數,μx及μy,σx及σy分別為x和y的平均值和標準差,σxy為x和y的協方差,C1,C2,C3皆為常數,用以維持l(x,y)、c(x,y)、s(x,y)的穩定。
結構相似性指標的值越大,代表兩個信號的相似性越高。
使用
實際使用時,簡化起見,一般會將參數設為α = β = γ = 1 及C3=C2/2,得到:
在計算兩張影像的結構相似性指標時,會開一個局部性的視窗,一般為N × N N×NN×N的小區塊,計算出視窗內信號的結構相似性指標,每次以像素為單位移動視窗,直到整張影像每個位置的局部結構相似性指標都計算完畢。將全部的局部結構相似性指標平均起來即為兩張影像的結構相似性指標。
實現
我們可以調用第三方庫skimage
實現,里面有封裝好的計算ssim
的代碼,具體調用方式如下:
from skimage.metrics import structural_similarity as ssim
from PIL import Image
import numpy as npimg1 = np.array(Image.open('original.jpg'))
img2 = np.array(Image.open('compress.jpg'))if __name__ == "__main__":# If the input is a multichannel (color) image, set multichannel=True.print(ssim(img1, img2, multichannel=True))
備注:skimage的大名叫scikit-image,安裝請用pip install scikit-image。
實驗
高斯噪音
一.高斯噪聲不同參數對于圖像的影響
調參代碼
# 彩色圖像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化圖像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')
通過對應的loc和sacle,代碼中分別的0,50的值進行調節,來進行噪聲的添加
(0,50)的圖像
(0,10)的圖像
(5,10)的圖像
結果分析
-
loc參數:
- loc參數表示高斯噪聲的均值,即噪聲分布的中心。
- 增加loc參數的值會導致噪聲分布整體偏移。如果設置較大的loc值,則圖片中的像素值會整體增加。相反,如果設置較小的loc值,則圖片中的像素值會整體減小。
- 較大的loc值會導致圖像明亮度的增加,而較小的loc值則會導致圖像明亮度的降低。
-
scale參數:
- scale參數表示高斯噪聲的標準差,即噪聲分布的擴散程度。
- 增加scale參數的值會導致噪聲分布更加寬廣,即噪聲的振幅變大,使得像素值的變動更加明顯。
- 較大的scale值會導致圖像中的噪聲更加明顯,使圖像看起來更加模糊和粗糙。相反,較小的scale值則會產生更細微、不易察覺的噪聲。
需要注意的是,適當選擇合適的loc和scale參數對于產生逼真的高斯噪聲既重要又具有挑戰。理想情況下,參數選擇應該與圖像的特性和實際需要相匹配。在實際應用中,通過實驗和觀察來調整和優化loc和scale參數,以達到滿足噪聲處理的需求并保持圖像質量的最佳結果。
二.高斯噪音使用高斯濾波去噪實驗
代碼
#高斯噪音使用高斯濾波去噪實驗
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim
#讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image.jpg')#圖像替換image2.jpg# 讀取灰度圖像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色圖像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化圖像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')#進行去噪處理
# 彩色圖像進行高斯濾波去噪處理
denoised_img = cv2.GaussianBlur(noise_img, (5,5), 0)# 灰度化圖像進行高斯濾波去噪處理
img_denoised = cv2.GaussianBlur(img_noise, (5,5), 0)#顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img )**2)# 計算差分圖像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised)**2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加高斯噪音,并分別使用高斯濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后計算SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
該代碼展示了使用高斯濾波器對圖像進行平滑處理以去除高斯噪聲。通過觀察SSIM以及PSNR的值,其實高斯濾波對應高斯噪聲有一定的過濾功能但是效果有限。
高斯濾波是一種線性平滑濾波器,根據像素周圍鄰域的加權平均值對像素進行平滑處理。該濾波器利用高斯函數來計算每個鄰域像素的權重,使得距離中心像素越遠的像素權重越低。這樣可以在平滑圖像的同時保留圖像的邊緣和細節。
通過調整高斯濾波器的核大小和標準差,可以控制濾波效果。較大的核大小和較小的標準差可以平滑更多的噪聲,但可能會導致圖像變模糊;較小的核大小和較大的標準差可以保留更多的細節,但可能無法完全去除所有噪聲。
三.高斯噪音使用雙邊濾波去噪實驗
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image2.jpg')#圖像替換image2.jpg# 讀取灰度圖像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色圖像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化圖像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')#進行去噪處理
# 彩色圖像進行雙邊濾波去噪處理
denoised_img = cv2.bilateralFilter(color_img, 9, 30, 60)# 灰度化圖像進行雙邊濾波去噪處理
img_denoised = cv2.bilateralFilter(gray_img, 9, 30, 60)#顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img )**2)# 計算差分圖像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))
print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised)**2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加高斯噪音,并分別使用雙邊濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后計算SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
該代碼展示了使用雙邊濾波器對圖像進行平滑處理以去除高斯噪聲。通過比較對應的PSNR和SSIM,可以得出,雙邊濾波對于高斯噪聲有很好的去處效果。
雙邊濾波器是一種非線性濾波器,對圖像中的每個像素同時考慮空間距離和像素值相似性,以計算每個像素的權重。在計算加權平均值時,空間距離權重和像素值相似性權重都起到了作用。這使得雙邊濾波器能夠在平滑圖像的同時,保留邊緣和細節。
相比于其他平滑濾波器,雙邊濾波器能更好地保留圖像的細節,并且對消除高斯噪聲有較好的效果。它通過調整空間距離權重和像素值相似性權重這兩個參數,可以控制濾波效果。較大的空間距離權重可以保留更多的邊緣信息,較大的像素值相似性權重可以減少噪聲。
綜上所述,使用雙邊濾波去除高斯噪聲是一種有效的圖像降噪方法。它能夠在平滑圖像的同時保留細節,對于去除高斯噪聲和保持圖像質量具有良好的效果。
四.高斯噪音使用中值濾波去噪實驗
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image2.jpg')#圖像替換image2.jpg# 讀取灰度圖像
gray_img = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色圖像添加高斯噪音
noise = np.random.normal(0, 50, color_img.shape)
noise_img = color_img + noise.astype('uint8')# 灰度化圖像添加高斯噪音
noise = np.random.normal(0, 50, gray_img.shape)
img_noise = gray_img + noise.astype('uint8')#進行去噪處理
# 彩色圖像進行中值濾波去噪處理
denoised_img = cv2.medianBlur(color_img, 5)# 灰度化圖像進行中值濾波去噪處理
img_denoised = cv2.medianBlur(gray_img, 5)#顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img )**2)# 計算差分圖像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))
print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised)**2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加高斯噪音,并分別使用中值濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后計算SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
該代碼展示了使用中值濾波器對圖像進行平滑處理以去除高斯噪聲。通過對應的PSNR和SSIM,通過對圖像應用中值濾波器,可以有效地濾除高斯噪聲。
中值濾波器是一種非線性濾波器,它將每個像素的值替換為鄰域窗口中所有像素值的中值。相比于線性濾波器,中值濾波器能夠更好地抑制噪聲,特別是對于椒鹽噪聲和高斯噪聲等具有隨機性的噪聲類型。中值濾波器利用鄰域像素值的排序統計特性,能夠將噪聲像素值與周圍正常像素值進行區分。通過計算鄰域窗口中像素值的中值并將其作為原像素值的替代,中值濾波器能夠有效地平滑圖像,并保持圖像的邊緣和細節。
相比于平均濾波器或高斯濾波器,中值濾波器更適用于去除高斯噪聲。由于高斯噪聲具有隨機分布的特點,中值濾波器能夠在不對圖像進行過度平滑的情況下,將噪聲像素正確地排除。
綜上所述,使用中值濾波器對高斯噪聲進行去除是一種簡單而有效的方法。通過選擇適當的鄰域窗口大小,中值濾波器能夠在保留圖像細節的同時,有效地濾除高斯噪聲。
椒鹽噪音
一.高斯噪聲不同參數對于圖像的影響
調參代碼
#添加噪音
# 彩色圖像添加椒鹽噪音
noise_img = np.zeros(color_img.shape, np.uint8)
probability = 0.05 # 噪音點的概率for i in range(color_img.shape[0]):for j in range(color_img.shape[1]):random = np.random.random()if random < probability/2:# 添加鹽噪音noise_img[i, j] =(255, 255, 255)elif random < probability:# 添加椒噪音noise_img[i, j] = (0, 0, 0)else:noise_img[i, j] = color_img[i, j]# 灰度化圖像添加椒鹽噪音
img_noise = np.zeros(gray_img.shape, np.uint8)
probability = 0.05 # 噪音點的概率for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random = np.random.random()if random < probability/2:# 添加鹽噪音img_noise[i, j] = 255elif random < probability:# 添加椒噪音img_noise[i, j] = 0else:img_noise[i, j] = gray_img[i, j]
主要通過改變噪音點的頻率來達成調參
probability = 0.05 時
probability = 0.01 時
probability = 0.10 時
結論
其實椒鹽噪聲很簡單,就是通過隨機數和概率的比較來給圖像隨機添加噪聲像素點,概率越大,對應噪聲像素點出現概率越高。
二.椒鹽噪音使用K近鄰平均濾波去噪實驗
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image2.jpg')#圖像替換image2.jpg# 讀取灰度圖像
gray_img = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色圖像添加椒鹽噪音
noise_img = np.zeros(color_img.shape, np.uint8)
probability = 0.05 # 噪音點的概率for i in range(color_img.shape[0]):for j in range(color_img.shape[1]):random = np.random.random()if random < probability/2:# 添加鹽噪音noise_img[i, j] =(255, 255, 255)elif random < probability:# 添加椒噪音noise_img[i, j] = (0, 0, 0)else:noise_img[i, j] = color_img[i, j]# 灰度化圖像添加椒鹽噪音
img_noise = np.zeros(gray_img.shape, np.uint8)
probability = 0.05 # 噪音點的概率for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random = np.random.random()if random < probability/2:# 添加鹽噪音img_noise[i, j] = 255elif random < probability:# 添加椒噪音img_noise[i, j] = 0else:img_noise[i, j] = gray_img[i, j]#進行去噪處理
# 添加邊緣
K = 3 # 取 K=3
border = K // 2
border_img = cv2.copyMakeBorder(color_img, border, border, border, border, cv2.BORDER_REFLECT)
img_border = cv2.copyMakeBorder(gray_img, border, border, border, border, cv2.BORDER_REFLECT)# 彩色圖像進行K近鄰平均濾波去噪處理
denoised_img = np.zeros(color_img.shape, np.uint8)
for i in range(border, border + color_img.shape[0]):for j in range(border, border + color_img.shape[1]):block = border_img[i-border:i+border+1, j-border:j+border+1]pixels = np.zeros((K**2, 3), np.uint8)for k in range(K):for l in range(K):pixels[k*K+l] = block[k][l]filtered_pixel = np.mean(pixels, axis=0)denoised_img [i-border, j-border] = filtered_pixel.astype(np.uint8)# 灰度化圖像進行K近鄰平均濾波去噪處理
img_denoised =np.zeros(gray_img.shape, np.uint8)
for i in range(border, border + gray_img.shape[0]):for j in range(border, border + gray_img.shape[1]):block = img_border[i-border:i+border+1, j-border:j+border+1]pixels = block.flatten()pixels = sorted(pixels)img_denoised [i-border, j-border] = np.mean(pixels[:K])#顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img )**2)# 計算差分圖像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised)**2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加椒鹽噪音,并分別使用K近鄰平均濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后計算SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
經過實驗測試,使用K近鄰平均濾波器對圖像進行去噪處理可以有效地減少椒鹽噪聲。通過觀察兩個圖像處理完成后的實驗1和實驗2我們可以發現image1的圖像psnr以及ssim明顯比image2實驗結果的大,證明其去噪效果更好。
椒鹽噪聲是一種隨機出現的噪聲,會導致圖像中出現明顯的黑白像素點。K近鄰平均濾波器通過計算鄰域窗口中的像素值的平均值,將中心像素的值替換為平均值,從而實現去噪的效果。
在實驗中,我們選擇適當的鄰域窗口大小和K值,根據圖像的噪聲程度和細節要求,進行去噪處理。適當選擇較大的鄰域窗口可以平滑圖像并降低噪聲,同時保留圖像的細節。較大的K值可以更好地抑制椒鹽噪聲。
總的來說,椒鹽噪聲是一種常見的噪聲類型,而K近鄰平均濾波器是一種簡單而有效的濾波方法。通過調整鄰域窗口大小和K值,可以在一定程度上去除椒鹽噪聲并改善圖像質量。然而,使用K近鄰平均濾波器可能會導致圖像細節的損失,因此在應用時需要權衡去噪效果和細節保留的需求。
三.椒鹽噪音使用均值濾波去噪實驗
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim# 讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image.jpg') # 圖像替換image2.jpg
# 讀取灰度圖像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 添加噪音
# 彩色圖像添加椒鹽噪音
noise_img = np.zeros(color_img.shape, np.uint8)
probability = 0.20 # 噪音點的概率for i in range(color_img.shape[0]):for j in range(color_img.shape[1]):random = np.random.random()if random < probability / 2:# 添加鹽噪音noise_img[i, j] = (255, 255, 255)elif random < probability:# 添加椒噪音noise_img[i, j] = (0, 0, 0)else:noise_img[i, j] = color_img[i, j]# 灰度化圖像添加椒鹽噪音
img_noise = np.zeros(gray_img.shape, np.uint8)
probability = 0.20 # 噪音點的概率
for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random = np.random.random()if random < probability/2:# 添加鹽噪音img_noise[i, j] = 255elif random < probability:# 添加椒噪音img_noise[i, j] = 0else:img_noise[i, j] = gray_img[i, j]
# 進行去噪處理
# 彩色圖像進行均值濾波去噪處理
denoised_img = cv2.blur(noise_img, (5, 5), 0)# 灰度化圖像進行均值濾波去噪處理
img_denoised = cv2.blur(img_noise, (5, 5), 0)# 顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img, cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()# 評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img) ** 2)# 計算差分圖像
diff_image = denoised_img.astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img) ** 2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised) ** 2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised) ** 2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加椒鹽噪音,并分別使用均值濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
經過實驗測試,通過觀察對應的PSNR和SSIM,使用均值濾波器對圖像進行去噪處理對椒鹽噪聲的效果有限。
椒鹽噪聲是一種隨機性的噪聲,會在圖像中產生黑色和白色的孤立像素。均值濾波器是一種線性濾波器,它通過計算鄰域窗口中像素值的平均值來實現平滑效果。
然而,均值濾波器對于椒鹽噪聲的處理并不理想。由于椒鹽噪聲的隨機性,黑白像素點的分布不均勻,使得均值濾波器在平均處理時受到噪聲像素的干擾,導致去噪效果不佳。均值濾波器在處理椒鹽噪聲時可能會模糊圖像細節并不能完全去除噪聲。
因此,在處理椒鹽噪聲時,推薦使用其他更適合的濾波器,如中值濾波器或K近鄰平均濾波器。這些濾波器對于椒鹽噪聲有更好的去噪效果,并能夠保留圖像的細節。均值濾波器可能更適合去除均勻分布的噪聲,而不是椒鹽噪聲。
毛刺噪音
一.毛刺噪音不同參數對于圖像的影響
調參代碼
# 彩色圖像添加毛刺噪音
noise_img = np.copy(color_img)
noise_level = 0.20 # 噪音水平,可以根據需要調整
# 每個像素根據噪音水平隨機擾動
for i in range(noise_img.shape[0]):for j in range(noise_img.shape[1]):r = np.random.uniform(0, 1)if r < noise_level:noise_img[i, j] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]
# 灰度化圖像添加毛刺噪音
img_noise = np.copy(gray_img)
level_noise = 0.20 # 噪音水平,可以根據需要調整
# 每個像素根據噪音水平隨機擾動
for i in range(img_noise.shape[0]):for j in range(img_noise.shape[1]):r = np.random.uniform(0, 1)if r < level_noise:img_noise[i, j] = np.random.randint(0, 256)
噪音水平為0.05時
噪音水平為0.10時
噪音水平為0.20時
結論
密度參數表示在圖像中添加噪音的頻率。較高的密度值會導致更多的毛刺噪音點出現在圖像中,增加圖像的復雜度。
噪聲水平越高,噪聲像素點出現的概率越高
代碼中使用的是遍歷每一個像素點,如果對應的隨機值小于出現噪音的概率就會添加噪音。
二.毛刺噪音使用中值濾波去噪實驗
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim
#讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image.jpg')#圖像替換image2.jpg# 讀取灰度圖像
gray_img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色圖像添加毛刺噪音
noise_img = np.copy(color_img)
noise_level = 0.20 # 噪音水平,可以根據需要調整# 每個像素根據噪音水平隨機擾動
for i in range(noise_img.shape[0]):for j in range(noise_img.shape[1]):r = np.random.uniform(0, 1)if r < noise_level:noise_img[i, j] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]# 灰度化圖像添加毛刺噪音
img_noise = np.copy(gray_img)
level_noise = 0.20 # 噪音水平,可以根據需要調整# 每個像素根據噪音水平隨機擾動
for i in range(img_noise.shape[0]):for j in range(img_noise.shape[1]):r = np.random.uniform(0, 1)if r < level_noise:img_noise[i, j] = np.random.randint(0, 256)#進行去噪處理
# 彩色圖像進行中值濾波去噪處理
denoised_img = cv2.medianBlur(color_img, 5)# 灰度化圖像進行中值濾波去噪處理
img_denoised = cv2.medianBlur(gray_img, 5)#顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img )**2)# 計算差分圖像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised)**2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加毛刺噪音,并分別使用中值濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后計算SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
中值濾波器是一種非線性濾波器,它將每個像素的值替換為鄰域窗口中所有像素值的中值。相比于線性濾波器,中值濾波器能夠更好地抑制噪聲,特別是對于椒鹽噪聲和高斯噪聲等具有隨機性的噪聲類型,同樣也應用于毛刺噪音。中值濾波器利用鄰域像素值的排序統計特性,能夠將噪聲像素值與周圍正常像素值進行區分。通過計算鄰域窗口中像素值的中值并將其作為原像素值的替代,中值濾波器能夠有效地平滑圖像,并保持圖像的邊緣和細節。
使用中值濾波器對毛刺噪聲進行去除是一種簡單而有效的方法。通過選擇適當的鄰域窗口大小,中值濾波器能夠在保留圖像細節的同時,有效地濾除高斯噪聲。
三.毛刺噪音使用均值濾波去噪實驗
代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim#讀取圖像
# 讀取彩色圖像
color_img = cv2.imread('image2.jpg')#圖像替換image2.jpg# 讀取灰度圖像
gray_img = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE)#添加噪音
# 彩色圖像添加毛刺噪音
noise_img = np.copy(color_img)
noise_level = 0.20# 噪音水平,可以根據需要調整# 每個像素根據噪音水平隨機擾動
for i in range(noise_img.shape[0]):for j in range(noise_img.shape[1]):r = np.random.uniform(0, 1)if r < noise_level:noise_img[i, j] = [np.random.randint(0, 256), np.random.randint(0, 256), np.random.randint(0, 256)]# 灰度化圖像添加毛刺噪音
img_noise = np.copy(gray_img)
level_noise = 0.20 # 噪音水平,可以根據需要調整# 每個像素根據噪音水平隨機擾動
for i in range(img_noise.shape[0]):for j in range(img_noise.shape[1]):r = np.random.uniform(0, 1)if r < level_noise:img_noise[i, j] = np.random.randint(0, 256)#進行去噪處理
# 彩色圖像進行均值濾波去噪處理
denoised_img = cv2.blur(noise_img, (5,5), 0)# 灰度化圖像進行均值濾波去噪處理
img_denoised = cv2.blur(img_noise, (5, 5), 0)#顯示結果
# 彩色圖像顯示結果
plt.subplot(231)
plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
plt.title('Original color_img')plt.subplot(232)
plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB))
plt.title('Noisy color_img')plt.subplot(233)
plt.imshow(cv2.cvtColor(denoised_img , cv2.COLOR_BGR2RGB))
plt.title('Denoised color_img')
# 灰度化圖像顯示結果
plt.subplot(234)
plt.imshow(gray_img, cmap='gray')
plt.title('Original gray_img')plt.subplot(235)
plt.imshow(img_noise, cmap='gray')
plt.title('Noisy gray_img')plt.subplot(236)
plt.imshow(img_denoised, cmap='gray')
plt.title('Denoised gray_img')plt.show()#評估結果
print("評估結果:")
print("彩色圖像評估結果:")
# 計算均方誤差
mse = np.mean((color_img - denoised_img )**2)
# 計算差分圖像
diff_image = denoised_img .astype(np.float64) - color_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((color_img - denoised_img )**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)
print('結構相似性 SSIM',ssim(color_img, denoised_img, channel_axis=2))print("灰度化圖像評估結果:")
# 計算均方誤差
mse = np.mean((gray_img - img_denoised)**2)# 計算差分圖像
diff_image = img_denoised.astype(np.float64) - gray_img.astype(np.float64)# 計算均方根誤差
mse = np.mean(np.square(diff_image))
rmse = np.sqrt(mse)# 計算峰值信噪比
mse = np.mean((gray_img - img_denoised)**2)
psnr = 20 * np.log10(255 / np.sqrt(mse))
print('峰值信噪比 PSNR:', psnr)print('結構相似性 SSIM:',ssim(gray_img, img_denoised, channel_axis=1))
效果展示1
效果展示2
功能說明
對彩色圖像以及其的灰度圖添加毛刺噪音,并分別使用均值濾波去噪,輸出原圖像和添加噪音的圖像以及去噪后的圖像,最后計算SSIM和PSNR對彩色圖像和灰度圖像的去噪效果進行評估,并輸出相應數值。
結論
經過實驗測試,通過觀察對應的PSNR和SSIM,使用均值濾波器對圖像進行去噪處理對毛刺噪聲的效果有限。
均值濾波器對于椒鹽噪聲的處理并不理想。由于毛刺噪聲的隨機性,黑白像素點的分布不均勻,使得均值濾波器在平均處理時受到噪聲像素的干擾,導致去噪效果不佳。均值濾波器在處理毛刺噪聲時可能會模糊圖像細節并不能完全去除噪聲。
因此,在處理毛刺噪聲時,推薦使用其他更適合的濾波器,如中值濾波器或K近鄰平均濾波器。