改进的自适应中值滤波算法 去除椒盐噪声 python 代码实现
完整代碼可以在 我的AI學(xué)習(xí)筆記 - github 中獲取
原理
傳統(tǒng)的中值濾波算法在椒鹽噪聲的去除領(lǐng)域有著比較廣泛的應(yīng)用,其具有較強(qiáng)的噪點(diǎn)鑒別和恢復(fù)能力,也有比較低的時間復(fù)雜度:其基本思想是采用像素點(diǎn)周圍鄰接的若干像素點(diǎn)的中值來代替被污染的像素點(diǎn);但也存在一定的缺陷,隨著圖像被污染程度的加深,此方法恢復(fù)的圖像細(xì)節(jié)模糊、邊緣損失也會越嚴(yán)重。
中值濾波的思想就是比較一定領(lǐng)域內(nèi)的像素值的大小,取出其中值作為這個領(lǐng)域的中心像素新的值。假設(shè)對一定領(lǐng)域內(nèi)的所有像素從小到大進(jìn)行排序,如果存在孤立的噪聲點(diǎn),比如椒鹽噪聲(椒噪聲——較小的灰度值,呈現(xiàn)的效果是小黑點(diǎn);鹽噪聲——較大的灰度值,呈現(xiàn)的效果是小白點(diǎn)),那么從小到大排序的這個數(shù)組中,那些孤立的噪聲一定會分布在兩邊(要么很小,要么很大),這樣子取出的中值點(diǎn)可以很好地保留像素信息,而濾除了噪聲點(diǎn)的影響。
中值濾波器受濾波窗口大小影響較大,用于消除噪聲和保護(hù)圖像細(xì)節(jié),兩者會存在沖突。如果窗口較小,則能較好地保護(hù)圖像中的一些細(xì)節(jié)信息,但對噪聲的過濾效果就會打折扣;反之,如果窗口尺寸較大則會有較好的噪聲過濾效果,但也會對圖像造成一定的模糊效果,從而丟失一部分細(xì)節(jié)信息。
此處采用改進(jìn)的自適應(yīng)中值濾波算法進(jìn)行圖像恢復(fù):
代碼實(shí)現(xiàn)
def get_window(res_img,noise_mask,sc,i,j,k):listx = []if i-sc >= 0:starti = i-sc else:starti = 0if j+1 <= res_img.shape[1]-1 and noise_mask[0,j+1,k] !=0:listx.append(res_img[0,j+1,k])if j-1 >=0 and noise_mask[0,j-1,k] !=0:listx.append(res_img[0,j-1,k])if i+sc <= res_img.shape[0]-1:endi = i+scelse:endi = res_img.shape[0]-1if j+1 <= res_img.shape[1]-1 and noise_mask[endi,j+1,k] !=0:listx.append(res_img[endi,j+1,k])if j-1 >=0 and noise_mask[endi,j-1,k] !=0:listx.append(res_img[endi,j-1,k])if j+sc <= res_img.shape[1]-1:endj = j+scelse:endj = res_img.shape[1]-1if i+1 <= res_img.shape[0]-1 and noise_mask[i+1,endj,k] !=0:listx.append(res_img[i+1,endj,k])if i-1 >=0 and noise_mask[i-1,endj,k] !=0:listx.append(res_img[i-1,endj,k])if j-sc >= 0:startj = j-scelse:startj = 0if i+1 <= res_img.shape[0]-1 and noise_mask[i+1,0,k] !=0:listx.append(res_img[i+1,0,k])if i-1 >=0 and noise_mask[i-1,0,k] !=0:listx.append(res_img[i-1,0,k])for m in range(starti,endi+1):for n in range(startj,endj+1):if noise_mask[m,n,k] != 0:listx.append(res_img[m,n,k])listx.sort()return listxdef get_window_small(res_img,noise_mask,i,j,k):listx = []sc = 1 if i-sc >= 0 and noise_mask[i-1,j,k]!=0:listx.append(res_img[i-1,j,k])if i+sc <= res_img.shape[0]-1 and noise_mask[i+1,j,k]!=0:listx.append(res_img[i+1,j,k])if j+sc <= res_img.shape[1]-1 and noise_mask[i,j+1,k]!=0:listx.append(res_img[i,j+1,k])if j-sc >= 0 and noise_mask[i,j-1,k]!=0:listx.append(res_img[i,j-1,k])listx.sort()return listxdef restore_image(noise_img, size=4):"""使用 你最擅長的算法模型 進(jìn)行圖像恢復(fù)。:param noise_img: 一個受損的圖像:param size: 輸入?yún)^(qū)域半徑,長寬是以 size*size 方形區(qū)域獲取區(qū)域, 默認(rèn)是 4:return: res_img 恢復(fù)后的圖片,圖像矩陣值 0-1 之間,數(shù)據(jù)類型為 np.array,數(shù)據(jù)類型對象 (dtype): np.double, 圖像形狀:(height,width,channel), 通道(channel) 順序?yàn)镽GB"""# 恢復(fù)圖片初始化,首先 copy 受損圖片,然后預(yù)測噪聲點(diǎn)的坐標(biāo)后作為返回值。res_img = np.copy(noise_img)# 獲取噪聲圖像noise_mask = get_noise_mask(noise_img)for i in range(noise_mask.shape[0]):for j in range(noise_mask.shape[1]):for k in range(noise_mask.shape[2]):if noise_mask[i,j,k] == 0:sc = 1listx = get_window_small(res_img,noise_mask,i,j,k)if len(listx) != 0:res_img[i,j,k] = listx[len(listx)//2]else:while(len(listx) == 0):listx = get_window(res_img,noise_mask,sc,i,j,k)sc = sc+1if sc > 4:res_img[i,j,k] = np.mean(listx)else:res_img[i,j,k] = listx[len(listx)//2]return res_img恢復(fù)效果:
原始圖片
添加噪點(diǎn)
恢復(fù)后
總結(jié)
以上是生活随笔為你收集整理的改进的自适应中值滤波算法 去除椒盐噪声 python 代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用PHP做负载均衡
- 下一篇: 关于SetTimer函数的总结