第5章 Python 數字圖像處理(DIP) - 圖像復原與重建11 - 空間濾波 - 自適應濾波器 - 自適應局部降噪、自適應中值濾波器

標題

      • 自適應濾波器
        • 自適應局部降噪濾波器
        • 自適應中值濾波器

自適應濾波器

自適應局部降噪濾波器

均值是計算平均值的區域上的平均灰度,方差是該區域上的圖像對比度

g(x,y)g(x, y)g(x,y)噪聲圖像在(x,y)(x, y)(x,y)處的值
ση2\sigma_{\eta}^2ση2? 為噪聲的方差,為常數,需要通過估計得到
zˉSxy\bar{z}_{S_{xy}}zˉSxy?? 為局部平均灰度
σSxy2\sigma_{S_{xy}}^2σSxy?2? 為局部方差

f^(x,y)=g(x,y)?ση2σSxy2[g(x,y)?zˉSxy](5.32)\hat{f}(x,y) = g(x,y) - \frac{\sigma_{\eta} ^ 2 }{\sigma_{S_{xy}}^2} \big[ g(x,y) - \bar z_{S_{xy}}\big] \tag{5.32}f^?(x,y)=g(x,y)?σSxy?2?ση2??[g(x,y)?zˉSxy??](5.32)

ση2>ση2\sigma_{\eta}^2 > \sigma_{\eta}^2ση2?>ση2? 時,將比率設置為1,這樣做會使得濾波器是非線性的,但可阻止因缺少圖像噪聲方差的知識而產生無意義的結果(即負灰度級)。

ση2\sigma_{\eta}^2ση2?估計值太低時,算法會因校正量小于就有的值而返回與原圖像接近的圖像。估計值太高會使得方差的比率在1.0處被水平,與正常情況相比,算法會更頻繁地從圖像中減去平均值。若允許為負值,且最后重新標定圖像,則如前所述,結果 將損失圖像的動態范圍。

整個圖像的相關值:
μn=∑i=0L?1(ri?m)np(ri)\mu_n = \sum_{i=0}^{L-1}(r_i -m)^n p(r_i)μn?=i=0L?1?(ri??m)np(ri?) 為灰度值r相對于其均值同的第n階矩
m=∑i=0L?1rip(ri)m = \sum_{i=0}^{L-1} r_i p(r_i)m=i=0L?1?ri?p(ri?) 均值
σ2=μ2=∑i=0L?1(ri?m)2p(ri)\sigma^2 = \mu_2 = \sum_{i=0}^{L-1}(r_i - m)^2 p(r_i)σ2=μ2?=i=0L?1?(ri??m)2p(ri?) 方差

鄰域內的相關值:
mSxy=∑i=0L?1riPSxy(ri)m_{S_{xy}} = \sum_{i=0}^{L-1} r_i P_{S_{xy}}(r_i)mSxy??=i=0L?1?ri?PSxy??(ri?) 均值
σSxy2=μ2=∑i=0L?1(ri?mSxy)2PSxy(ri)\sigma_{S_{xy}}^2 = \mu_2 = \sum_{i=0}^{L-1}(r_i - m_{S_{xy}})^2 P_{S_{xy}}(r_i)σSxy?2?=μ2?=i=0L?1?(ri??mSxy??)2PSxy??(ri?) 方差

def calculate_sigma_eta(image):""":param image: input image:return: sigma eta of image"""hist, bins = np.histogram(image.flatten(), bins=256, range=[0, 256], density=True)r = bins[:-1]m = np.sum(r * hist)sigma = np.sum((r - m)**2 * hist)return sigmadef calculate_sigma_sxy(block):"""param block: input blockreturn: sigma sxy of block"""#==========公式法==========hist, bins = np.histogram(block.flatten(), bins=256, range=[0, 256], density=True)r = bins[:-1]m = (r * hist).sum()sigma = ((r - m)**2 * hist).sum()#===========等價于========
#     m = np.mean(block)
#     sigma = np.var(block)return sigma, m
def adaptive_local_denoise(image, kernel, sigma_eta=1):"""adaptive local denoising math: $$\hat{f}(x,y) = g(x,y) - \frac{\sigma_{\eta} ^ 2 }{\sigma_{S_{xy}}^2} \big[ g(x,y) - \bar z_{S_{xy}}\big]$$param: image:  input image for denoisingparam: kernel: input kernel, actually only use kernel shape, just want to keep the format as mean filterreturn: image after adaptive local denoising """epsilon = 1e-8height, width = image.shape[:2]m, n = kernel.shape[:2]padding_h = int((m -1)/2)padding_w = int((n -1)/2)# 這樣的填充方式,可以奇數核或者偶數核都能正確填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="edge")img_result = np.zeros(image.shape)for i in range(height):for j in range(width):block = image_pad[i:i + m, j:j + n]gxy = image[i, j]z_sxy = np.mean(block)sigma_sxy = np.var(block)rate = sigma_eta / (sigma_sxy + epsilon)if rate >= 1:rate = 1img_result[i, j] = gxy - rate * (gxy - z_sxy)return img_result
# 自適應局部降噪濾波器處理高斯噪聲
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0513(a)(ckt_gaussian_var_1000_mean_0).tif', 0) #直接讀為灰度圖像kernel = np.ones([7, 7])
img_arithmentic_mean = arithmentic_mean(img_ori, kernel=kernel)
img_geometric_mean = geometric_mean(img_ori, kernel=kernel)
img_adaptive_local = adaptive_local_denoise(img_ori, kernel=kernel, sigma_eta=1000)plt.figure(figsize=(10, 10))plt.subplot(221), plt.imshow(img_ori, 'gray'), plt.title('With Gaussian noise'), plt.xticks([]),plt.yticks([])
plt.subplot(222), plt.imshow(img_arithmentic_mean, 'gray'), plt.title('Arithmentic mean'), plt.xticks([]),plt.yticks([])
plt.subplot(223), plt.imshow(img_geometric_mean, 'gray'), plt.title('Geomentric mean'), plt.xticks([]),plt.yticks([])
plt.subplot(224), plt.imshow(img_adaptive_local, 'gray'), plt.title('Adaptive local denoise'), plt.xticks([]),plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

自適應中值濾波器

zmin是Sxyz_{\text{min}}是S_{xy}zmin?Sxy?鄰域中的最小灰度值;zmax是Sxyz_{\text{max}}是S_{xy}zmax?Sxy?鄰域中的最大灰度值;zmed是Sxyz_{\text{med}}是S_{xy}zmed?Sxy?鄰域中的中值, zxyz_{xy}zxy?是坐標(x,y)(x,y)(x,y)處的灰度值;SmaxS_{\text{max}}Smax?SxyS_{xy}Sxy?允許的最大尺寸,是大于1的奇正整數。

自適應中值濾波算法在點(x,y)(x, y)(x,y)處使用兩個處理層次,分別表示為層次AAA和層次BBB:

層次AAA:
zmin<zmed<zmaxz_{\text{min}} < z_{\text{med}} < z_{\text{max}}zmin?<zmed?<zmax? 則轉到層次B
否則,增SxyS_{xy}Sxy?的尺寸,
Sxy≤SmaxS_{xy} \leq S_{\text{max}}Sxy?Smax?, 則重復層次A
否則,輸出zmedz_{\text{med}}zmed?

層次BBB
zmin<zxy<zmaxz_{\text{min}} < z_{xy} < z_{\text{max}}zmin?<zxy?<zmax?,則輸出zxyz_{xy}zxy?
否則,輸出 zmedz_{\text{med}}zmed?

這算法有3個主要的目的:去除椒鹽(沖激)噪聲,平滑其他非常沖激噪聲,減少失真(如目標邊界的過度細化)。該算法統計上認為zminz_{\text{min}}zmin?zmaxz_{\text{max}}zmax?是區域SxyS_{xy}Sxy?的“類沖激”噪聲分量,即使它們不是圖像中的最小像素和最大像素值。

能很好的處理椒鹽噪聲,但對高斯噪聲不敏感

def adaptive_median_denoise(image, sxy=3, smax=7):"""adaptive median denoising param: image: input image for denoisingparam: sxy  : minimum kernel sizeparam: smax : maximum kernel sizereturn: image after adaptive median denoising """epsilon = 1e-8height, width = image.shape[:2]m, n = smax, smaxpadding_h = int((m -1)/2)padding_w = int((n -1)/2)# 這樣的填充方式,可以奇數核或者偶數核都能正確填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="edge")img_new = np.zeros(image.shape)for i in range(padding_h, height + padding_h):for j in range(padding_w, width + padding_w):sxy = 3     #每一輪都重置  k = int(sxy/2)block = image_pad[i-k:i+k+1, j-k:j+k+1]zxy = image[i - padding_h][j - padding_w]zmin = np.min(block)zmed = np.median(block)zmax = np.max(block)if zmin < zmed < zmax:if zmin < zxy < zmax:img_new[i - padding_h, j - padding_w] = zxyelse:img_new[i - padding_h, j - padding_w] = zmedelse:while True:sxy = sxy + 2k = int(sxy / 2)if zmin < zmed < zmax or sxy > smax:breakblock = image_pad[i-k:i+k+1, j-k:j+k+1]zmed = np.median(block)zmin = np.min(block)zmax = np.max(block)if zmin < zmed < zmax or sxy > smax:if zmin < zxy < zmax:img_new[i - padding_h, j - padding_w] = zxyelse:img_new[i - padding_h, j - padding_w] = zmedreturn img_new
# 自適中值濾波器處理椒鹽噪聲
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0514(a)(ckt_saltpep_prob_pt25).tif', 0) #直接讀為灰度圖像kernel = np.ones([7, 7])img_arithmentic_mean = median_filter(img_ori, kernel=kernel)
img_adaptive_median = adaptive_median_denoise(img_ori)plt.figure(figsize=(15, 10))
plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Salt pepper noise'), plt.xticks([]),plt.yticks([])
plt.subplot(232), plt.imshow(img_arithmentic_mean, 'gray'), plt.title('Arithmentic mean'), plt.xticks([]),plt.yticks([])
plt.subplot(233), plt.imshow(img_adaptive_median, 'gray'), plt.title('Adaptive median'), plt.xticks([]),plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 自適中值濾波器處理高斯噪聲
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0513(a)(ckt_gaussian_var_1000_mean_0).tif', 0) #直接讀為灰度圖像kernel = np.ones([7, 7])
img_arithmentic_mean = median_filter(img_ori, kernel=kernel)
img_adaptive_median = adaptive_median_denoise(img_ori)plt.figure(figsize=(15, 10))plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('With Gaussian noise'), plt.xticks([]),plt.yticks([])
plt.subplot(232), plt.imshow(img_arithmentic_mean, 'gray'), plt.title('Arithmentic mean'), plt.xticks([]),plt.yticks([])
plt.subplot(233), plt.imshow(img_adaptive_median, 'gray'), plt.title('Adaptive median'), plt.xticks([]),plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260592.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關閉防火墻_從零開始學Linux運維|09.關閉防火墻和SElinux

firewalld是centos7默認的防火墻安全增強型 Linux(Security-Enhanced Linux)簡稱 SELinux初學者建議先關閉,等熟悉了之后再來使用前期聯系中的好多錯誤都有可能是由于沒有關閉或者正確配置上面兩項造成的1.臨時關閉centos7下的防火墻firewalld一行命令就能夠關閉firewalld--&qu…

Discuz!NT - 在線顯示列表 游客 bug 修復

引發bug的條件&#xff1a;當你修改了系統組里面的[游客]組 的名字后&#xff01;&#xff01; 你會發現首頁上底部的在線顯示列表里始終都是顯示"游客"字樣而非你改過得字樣&#xff01;如圖 至此你需要運行一個t-sql腳本去修復這個bug&#xff01;&#xff08;但是…

Linux查看物理CPU個數、核數、邏輯CPU個數

# 總核數 物理CPU個數 X 每顆物理CPU的核數 # 總邏輯CPU數 物理CPU個數 X 每顆物理CPU的核數 X 超線程數# 查看物理CPU個數 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l# 查看每個物理CPU中core的個數(即核數) cat /proc/cpuinfo| grep "cpu …

基于空間方法的圖神經網絡模型_用于時空圖建模的圖神經網絡模型 Graph WaveNet | 課程上新...

課程概要本課程來自集智學園圖網絡論文解讀系列活動。是對論文《Graph WaveNet for Deep Spatial-Temporal Graph Modeling》的解讀。時空圖建模 (Spatial-temporal graph modeling)是分析系統中組成部分的空間維相關性和時間維趨勢的重要手段。已有算法大多基于已知的固定的圖…

dataframe類型數據的遍歷_Python零基礎入門到爬蟲再到數據分析,這些你都是要學會的...

1.必須知道的兩組Python基礎術語A.變量和賦值Python可以直接定義變量名字并進行賦值的&#xff0c;例如我們寫出a 4時&#xff0c;Python解釋器干了兩件事情&#xff1a;在內存中創建了一個值為4的整型數據在內存中創建了一個名為a的變量&#xff0c;并把它指向4用一張示意圖表…

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建12 - 空間濾波 - 使用頻率域濾波降低周期噪聲 - 陷波濾波、最優陷波濾波

標題使用頻率域濾波降低周期噪聲陷波濾波深入介紹最優陷波濾波本章陷波濾波器有部分得出的結果不佳&#xff0c;如果有更好的解決方案&#xff0c;請賜教&#xff0c;不勝感激。 使用頻率域濾波降低周期噪聲 陷波濾波深入介紹 零相移濾波器必須關于原點(頻率矩形中心)對稱&a…

Android之Menu動態改變文字

Menu創建&#xff1a; Override//這里遇到一個問題add的是MenuItem的idpublic boolean onCreateOptionsMenu(Menu menu) {// TODO Auto-generated method stubmenu.add(0,1023, 0, "一");menu.add(0,1022, 1, "開啟線程");Log.e("onCreateOptionsMenu…

iOS 開發周報:Apple 發布 iPhone 7 / 7 Plus 、Apple Watch 2 等新品

新聞\\Apple 發布 iPhone 7 / 7 Plus 、Apple Watch 2 等新品&#xff1a;Apple 正式發布了 iPhone 7 / 7 Plus、Apple Watch 2 新品&#xff0c;帶來 AirPods 無線耳機&#xff0c;并把馬里奧帶進了 iOS。iPhone 7 新增亮黑色&#xff0c;移除3.5mm 耳機孔&#xff0c;支持 IP…

python寫界面c這算法_插入算法分別從C,java,python三種語言進行書寫

真正學懂計算機的人&#xff08;不只是“編程匠”&#xff09;都對數學有相當的造詣&#xff0c;既能用科學家的嚴謹思維來求證&#xff0c;也能用工程師的務實手段來解決問題——而這種思維和手段的最佳演繹就是“算法”。 作為一個初級編程人員或者說是一個程序員&#xff0c…

去掉xcode中警告的一些經驗

1、編譯時&#xff0c;編譯警告忽略掉某些文件 只需在在文件的Compiler Flags 中加入 -w 參數&#xff0c;例如&#xff1a; 2、編譯時&#xff0c;編譯警告忽略掉某段代碼 #pragma clang diagnostic push#pragma clang diagnostic ignored "-Wmultichar"char b df;…

富士施樂3065掃描教程_全面支持IT國產化 富士施樂70款機型獲統信UOS兼容認證

最近&#xff0c;富士施樂&#xff08;中國&#xff09;有限公司宣布共70款機型獲得國產操作系統統信UOS的兼容認證&#xff0c;其中包括新一代ApeosPort旗艦智能型數碼多功能機、多功能一體機/打印機、生產型數字印刷系統。這是繼獲得中標麒麟、龍芯和兆芯兼容認證后&#xff…

Flash系統字體中的中文字體問題

在flash中使用as來改變textfield的中文字體 &#xff0c;遇到發布版本超過10.2的時候&#xff0c;會悲劇&#xff01;不支持使用中文名稱來改變字體。 解決辦法&#xff1a;1&#xff09;使用英文名稱。2&#xff09;發布的版本低于10.2 label:TextField new TextField(); for…

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建13 - 空間濾波 - 線性位置不變退化 - 退化函數估計、運動模糊函數

標題線性位置不變退化估計退化函數采用觀察法估計退化函數采用試驗法估計退化函數采用建模法估計退化函數運動模糊函數OpenCV Motion Blur在這一節中&#xff0c;得到的結果&#xff0c;有些不是很好&#xff0c;我需要再努力多找資料&#xff0c;重新完成學習&#xff0c;如果…

視覺感受排序算法

1. 快速排序 介紹&#xff1a; 快速排序是由東尼霍爾所發展的一種排序算法。在平均狀況下&#xff0c;排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較&#xff0c;但這種狀況并不常見。事實上&#xff0c;快速排序通常明顯比其他Ο(n log n) 算法更快&…

python如何自定義函數_python如何自定義函數_后端開發

c語言特點是什么_后端開發 c語言特點是&#xff1a;1、語言簡潔、緊湊&#xff0c;使用方便、靈活&#xff1b;2、運算符豐富&#xff1b;3、數據結構豐富&#xff0c;具有現代化語言的各種數據結構&#xff1b;4、具有結構化的控制語句&#xff1b;5、語法限制不太嚴度格&…

js/css 檢測移動設備方向的變化 判斷橫豎屏幕

js&#xff0f;css 檢測移動設備方向的變化 判斷橫豎屏幕 方法一&#xff1a;用觸發手機的橫屏和豎屏之間的切換的事件 window.addEventListener("orientationchange", function() { // 宣布新方向的數值 alert(window.orientation); }, false); // 方法二&#xff1…

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建14 - 逆濾波

標題逆濾波逆濾波逆濾波 逆濾波 圖像的退化函數已知或者由前面的方法獲取退化函數&#xff0c;則可以直接逆濾波 F^(u,v)G(u,v)H(u,v)(5.78)\hat{F}(u,v) \frac{G(u,v)}{H(u,v)} \tag{5.78}F^(u,v)H(u,v)G(u,v)?(5.78) F^(u,v)F(u,v)N(u,v)H(u,v)(5.79)\hat{F}(u,v) F(u, …

SetFormFullScreen()窗體全屏顯示

{讓窗體全屏顯示} //SetFormFullScreen(Form1); procedure SetFormFullScreen(Form:TForm); begin Form.BorderStyle:bsNone; Form.WindowState:wsMaximized; Form.Color:clBlack; end; 通過 為知筆記 發布轉載于:https://www.cnblogs.com/xe2011/archive/2012/07/26/2609327.h…

表示自己從頭開始的句子_微信拍一拍后綴幽默回復有趣的句子 拍了拍唯美內容文案...

閱讀本文前&#xff0c;請您先點擊上面的“藍色字體”&#xff0c;再點擊“關注”&#xff0c;這樣您就可以繼續免費收到文章了。每天都會有分享&#xff0c;都是免費訂閱&#xff0c;請您放心關注。注圖文來源網絡&#xff0c;侵刪 …

HoloLens開發手記 - Unity之Tracking loss

當HoloLens設備不能識別到自己在世界中的位置時&#xff0c;應用就會發生tracking loss。默認情況下&#xff0c;Unity會暫停Update更新循環并顯示一張閃屏圖片給用戶。當設備重新能追蹤到位置時&#xff0c;閃屏圖片會消失&#xff0c;并且Update循環還會繼續。 此外&#xff…