對一副影像加噪聲(高斯,椒鹽等),進行平滑,銳化,觀察其影像變化
- 一、在開始之前
- 知識點
- 二、開始
- 三、對一副影像加高斯噪聲、椒鹽
- 四、對已加高斯噪聲、椒鹽的影像進行平滑、銳化處理
- 1、對已加高斯噪聲、椒鹽的影像進行平滑處理
- 1、對已加高斯噪聲、椒鹽的影像進行銳化處理
- 2、對已加高斯噪聲、椒鹽的 進行過平滑處理的影像進行銳化處理
一、在開始之前
知識點
本次教程涉及到的知識點:
噪聲:
噪聲可以理解為灰度值的隨機變化,即拍照程序中引入的一些不想要的像素點,噪聲可分為椒鹽噪聲,高斯噪聲,加性噪聲和乘性噪聲等
高斯噪聲Gaussian noise:
指服從高斯分布(正態分布)的一類噪聲,通常是因為不良照明和高溫引起的傳感器噪聲,通常在RGB影像中,顯現比較明顯
椒鹽噪聲Salt and pepper noise:
椒鹽噪聲也稱為脈沖噪聲,是影像中經常見到的一種噪聲,它是一種隨機出現的白點或者黑點,可能是亮的區域有黑色像素或是在暗的區域有白色像素(或是兩者皆有),椒鹽噪聲的成因可能是影像訊號受到突如其來的強烈干擾而產生、類比數位轉換器或位元傳輸錯誤等,;
噪聲主要通過平滑進行抑制和去除,包括基于二維離散卷積的高斯平滑,均值平滑,基于統計學的中值平滑,以及能夠保持影像邊緣的雙邊濾波,導向濾波演算法等
碼云代碼地址:https://gitee.com/steveqobs/opencv
chapter4
二、開始
import cv2
import numpy as np
import random
先定義三個函式,后面呼叫
def sp_noise(image, prob):
# 添加椒鹽噪聲
# prob:噪聲比例
output = np.zeros(image.shape, np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
def gaussian_noise(image, mean=0, var=0.001):
# 添加高斯噪聲
# mean : 均值
# var : 方差
image = np.array(image / 255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out * 255)
return out
def sharpen(image):
# 銳化
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
out = cv2.filter2D(image, -1, kernel=kernel)
return out
三、對一副影像加高斯噪聲、椒鹽
以下代碼對影像添加了噪聲,并顯示原圖和已經加噪聲的圖片,進行對比,
sp_noise(src, 0.05)和gaussian_noise(src, 0.1, 0.03)的數字引數可自行調整查看變化
src = cv2.imread('img/lena.png')
img_sp = sp_noise(src, 0.05)
img_gaussian = gaussian_noise(src, 0.1, 0.03)
cv2.imshow('src', src)
cv2.imshow('img_sp', img_sp)
cv2.imshow('img_gaussian', img_gaussian)
cv2.waitKey(0)
下面顯示的依次是原圖、椒鹽噪聲、高斯噪聲

四、對已加高斯噪聲、椒鹽的影像進行平滑、銳化處理
1、對已加高斯噪聲、椒鹽的影像進行平滑處理
注意這里的代碼要和上面的連貫,平滑處理的是已經加了噪聲的img_sp,
可以更換平滑的方法和引數,看一下不同的效果
# cv2.medianBlur是中值平滑,blur()是均值平滑,gaussianianBlur()高斯平滑
# https://www.cnblogs.com/silence-cho/p/11027218.html有對各種平滑函式有詳細講解
# cv2.medianBlur的第二個引數5,可以修改 數字不一樣 平滑效果也不一樣
img_sp_medianblur = cv2.medianBlur(img_sp,5)
img_gaussian_medianblur = cv2.medianBlur(img_gaussian, 5)
# img_gaussian_gaussianBlur= cv2.gaussianBlur(img_gaussian,(0,0),2)
# 下面把有椒鹽噪聲的圖片和對它進行平滑的圖片 對比
cv2.imshow('img_sp', img_sp)
cv2.imshow('img_sp_medianblur', img_sp_medianblur)
# 下面把有椒鹽噪聲的圖片和對它進行平滑的圖片 對比
cv2.imshow('img_gaussian', img_gaussian)
cv2.imshow('img_gaussian_medianblur', img_gaussian_medianblur)
cv2.waitKey(0)
下圖是椒鹽噪聲和平滑處理的對比圖

下圖是高斯噪聲和平滑處理的對比圖

1、對已加高斯噪聲、椒鹽的影像進行銳化處理
img_sharpen=sharpen(src)
img_sp_sharpen=sharpen(img_sp)
img_gaussian_sharpen=sharpen(img_gaussian)
# img_sp_medianblur_sharpen=sharpen(img_sp_medianblur)
# img_gaussian_medianblur_sharpen=sharpen(img_gaussian_medianblur)
cv2.imshow('img_sharpen', img_sharpen)
cv2.imshow('img_sp_sharpen', img_sp_sharpen)
cv2.imshow('img_gaussian_sharpen', img_gaussian_sharpen)
# cv2.imshow('img_sp_medianblur_sharpen', img_sp_medianblur_sharpen)
# cv2.imshow('img_gaussian_medianblur_sharpen', img_gaussian_medianblur_sharpen)
cv2.waitKey(0)
依次為原圖、 對有椒鹽噪聲的銳化、對有高斯噪聲的銳化

2、對已加高斯噪聲、椒鹽的 進行過平滑處理的影像進行銳化處理
把上面的代碼注釋取消,
下圖是依次對有椒鹽噪聲的平滑處理過的銳化、對有高斯噪聲的平滑處理過的銳化
能看出下面左邊的效果還可以,是對噪聲平滑處理之后再銳化處理的,噪點已經看不到了

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321488.html
標籤:其他
上一篇:Transformer入門學習
下一篇:簡單用Java寫了一個爬蟲。
