退化
濾波
img_averaging=cv2.blur(img2,(3,3)) #均值濾波
img_median = cv2.medianBlur(img2,3) #中值濾波
高斯模糊
result = cv2.GaussianBlur(source, (11,11), 0)
高斯噪聲
def add_noise_Guass(img, mean=0, var=0.01): # 添加高斯噪聲img = np.array(img / 255, dtype=float)# 將原始圖像的像素值進行歸一化,除以255使得像素值在0-1之間noise = np.random.normal(mean, var ** 0.5, img.shape)#0.01的0.5次冪,ctrl點擊normal函數可見參數#給出均值為loc,標準差為scale的高斯隨機數(場)'''numpy.random.normal(loc=0.0, scale=1.0, size=None)loc:float此概率分布的均值(對應著整個分布的中心centre)scale:float此概率分布的標準差(對應于分布的寬度,scale越大越矮胖,scale越小,越瘦高)size:int or tuple of ints輸出的shape,默認為None,只輸出一個值'''out_img = img + noise# 將噪聲和原始圖像進行相加得到加噪后的圖像if out_img.min() < 0:low_clip = -1else:low_clip = 0out_img = np.clip(out_img, low_clip, 1.0)#clip函數將元素的大小限制在了low_clip和1之間了,小于的用low_clip代替,大于1的用1代替out_img = np.uint8(out_img * 255)# 解除歸一化,乘以255將加噪后的圖像的像素值恢復return out_img
椒鹽噪聲
def sp_noise(image, amount):output = image.copy()threshold = 1 - amount#傳入的參數,設置一個闕值#amount 越大,白色越多for i in range(image.shape[0]):#shape[0]表示圖片高for j in range(image.shape[1]):#圖片寬rdm = random.random()#取0到1之間的浮點數if rdm < amount: #如果隨機數小于參數,那么像素點取黑色output[i][j] = 0 #亮度0%,取黑色elif rdm > threshold:output[i][j] = 255#取白色return output
增強
修復破損
import cv2
import numpy as np
# 讀取照片
image = cv2.imread('old_photo.jpg')
# 將圖像轉換為灰度圖
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 應用高斯模糊來減少圖像噪聲
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 使用Canny邊緣檢測器識別邊緣
edges = cv2.Canny(blurred, 50, 150)
# 使用膨脹操作將邊緣連接在一起形成輪廓
dilated = cv2.dilate(edges, None, iterations=2)
# 在原始圖像上繪制輪廓,以便于可視化結果
result = cv2.inpaint(image, dilated, (3, 3), cv2.INPAINT_TELEA)
# 顯示修復后的照片
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
先讀取照片,并將其轉換為灰度圖。然后,我們使用高斯模糊減少圖像噪聲,并使用Canny邊緣檢測器識別邊緣。接下來,我們通過膨脹操作將邊緣連接在一起形成輪廓,以便識別損壞區域。最后,我們使用OpenCV的inpaint函數來修復損壞區域,并將結果顯示出來。