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

標題

    • 線性位置不變退化
    • 估計退化函數
      • 采用觀察法估計退化函數
      • 采用試驗法估計退化函數
      • 采用建模法估計退化函數
        • 運動模糊函數
        • OpenCV Motion Blur

在這一節中,得到的結果,有些不是很好,我需要再努力多找資料,重新完成學習,如果大佬有相關資料推薦,不勝感激。

線性位置不變退化

# 巴特沃斯帶阻陷波濾波器 BNRF
img_temp = np.zeros([512, 512])
BNF_1 = butterworth_notch_resistant_filter(img_temp, radius=20, uk=-80, vk=60)
BNF_2 = butterworth_notch_resistant_filter(img_temp, radius=10, uk=30, vk=80)
BNF_3 = butterworth_notch_resistant_filter(img_temp, radius=10, uk=-30, vk=80)plt.figure(figsize=(16, 16))
plt.subplot(221), plt.imshow(BNF_1, 'gray'), plt.title('BNF_1')
plt.subplot(222), plt.imshow(BNF_2, 'gray'), plt.title('BNF_2')
plt.subplot(223), plt.imshow(BNF_3, 'gray'), plt.title('BNF_3')BNF_dst = BNF_1 * BNF_2 * BNF_3plt.subplot(224), plt.imshow(BNF_dst, 'gray'), plt.title('BNF_dst')plt.tight_layout()
plt.show()

估計退化函數

In this section, I think I still got some problem have to sort out, when I have some more time or some more reading.

采用觀察法估計退化函數

選擇一個信號內容很強的區域(如一個高對比度區域)表示為g(x,y)g(x, y)g(x,y),令f^(x,y)\hat{f}(x, y)f^?(x,y)表示為處理后的子圖像,則有:
Hs(u,v)=Gs(u,v)F^s(u,v)(5.66)H_{s}(u, v) = \frac{G_{s}(u, v)}{\hat{F}_{s}(u, v)} \tag{5.66}Hs?(u,v)=F^s?(u,v)Gs?(u,v)?(5.66)

根據位置不變的假設來推斷完整的退化函數H(u,v)H(u, v)H(u,v)

采用試驗法估計退化函數

一個沖激由一個亮點來模擬,這個點應亮到能降低噪聲對可忽略值的影響。一個沖激的傅里葉變換是一個常量:
H(u,v)=G(u,v)A(5.67)H(u, v) = \frac{G(u, v)}{A} \tag{5.67}H(u,v)=AG(u,v)?(5.67)

# 試驗法估計退化函數
img_impulse = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH05/Fig0524(a)(impulse).tif", 0)
img_blurred = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH05/Fig0524(b)(blurred-impulse).tif", 0)fig = plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1), plt.imshow(img_impulse, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(img_blurred, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述
下面兩個例子,你會看到傅立葉變換后,頻譜圖像的美。把頻譜圖像上了顏色后,更是美極啦

# 傅里葉變換
fp_impulse = pad_image(img_impulse)
impluse_cen = centralized_2d(fp_impulse)
fft_impulse = np.fft.fft2(impluse_cen)
impulse_spectrume = np.log(1 + spectrum_fft(fft_impulse))fp_blurred = pad_image(img_blurred)
blurred_cen = centralized_2d(fp_blurred)
fft_blurred = np.fft.fft2(blurred_cen)
blurred_spectrum = np.log(1 + spectrum_fft(fft_blurred))H = fft_blurred / fft_impulseh_spectrum = np.log(1 + spectrum_fft(H))
h_spectrum = h_spectrum / h_spectrum.max()fig = plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1), plt.imshow(impulse_spectrume, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(blurred_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(h_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# 一些傅里葉變換
img_temp = np.zeros([256, 256])
# H = butterworth_low_pass_filter(img_temp, 10, 500)
H = 1 - butterworth_band_resistant_filter(img_temp, img_temp.shape, radius=50, w=5, n=5)
fp_blurred = pad_image(H)
blurred_cen = centralized_2d(fp_blurred)
fft_blurred = np.fft.fft2(blurred_cen)
blurred_spectrum = np.log(1 + spectrum_fft(fft_blurred))fig = plt.figure(figsize=(15, 15))
plt.imshow(blurred_spectrum, cmap='PiYG'), plt.xticks([]), plt.yticks([])
# plt.savefig("bbrf_4.png", dpi=300, quality=100)
# plt.subplot(1, 3, 1), plt.imshow(impulse_spectrume, cmap='gray'), plt.xticks([]), plt.yticks([])
# plt.subplot(1, 3, 2), plt.imshow(blurred_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
# # plt.subplot(1, 3, 3), plt.imshow(h_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

在這里插入圖片描述

采用建模法估計退化函數

H(u,v)=e?k(u2+v2)56(5.68)H(u,v) = e^{-k(u^2 + v^2)^{\frac{5}{6}}} \tag{5.68}H(u,v)=e?k(u2+v2)65?(5.68)

關于頻率矩形的中心,可用如下函數
H(u,v)=e?k((u?P/2)2+(v?Q/2)2)56H(u, v) = e^{-k((u - P/2)^2 + (v - Q/2)^2 \ \ )^{\frac{5}{6}}}H(u,v)=e?k((u?P/2)2+(v?Q/2)2??)65?

參加書上P247頁,運動導的圖像模糊的退化過程,是否用錯?
這個問題已經得到解決啦,解決方案如下。

def modeling_degrade(img, k=1):"""modeling degradation fuction, math: $$H(u,v) = e^{-k(u^2 +v^2)^{\frac{5}{6}}}$$param: img: input imgparam: k: """N, M = img.shape[:2]u = np.arange(M)v = np.arange(N)u, v = np.meshgrid(u, v)temp = (u - M//2)**2 + (v - N//2)**2kernel = np.exp(-k * np.power(temp, 5/6))return kernel
# 不填充,結果與書上一致啦
def get_degenerate_image(img, img_deg):"""不填充圖像做傅里葉變換后與退化函數做乘積,再反傅里葉變換"""# FFT--------------------------------------------fft = np.fft.fft2(img)# FFT * H(u, v)----------------------------------fft_huv = fft * img_deg# IFFT-------------------------------------------ifft = np.fft.ifft2(fft_huv)return ifftimg_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0525(a)(aerial_view_no_turb).tif', 0)# k = [1, 0.1, 0.01, 0.001, 0.0025, 0.00025]
k = [0.0025, 0.001, 0.00025]fp_cen = centralized_2d(img_ori)fig = plt.figure(figsize=(12, 12))
for i in range(len(k) + 1):ax = fig.add_subplot(2, 2, i+1, xticks=[], yticks=[])if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title(f"Original")else:img_deg = modeling_degrade(fp_cen, k=k[i-1])ifft = get_degenerate_image(fp_cen, img_deg)img_new = centralized_2d(ifft.real)img_new = np.clip(img_new, 0, img_new.max())img_new = np.uint8(normalize(img_new) * 255)ax.imshow(img_new, 'gray')ax.set_title(f"k = {k[i-1]}")
plt.tight_layout()
plt.show()    

在這里插入圖片描述

運動模糊函數

H(u,v)=Tπ(ua+vb)sin[π(ua+vb)]e?jπ(ua+vb)H(u,v) =\frac{T}{\pi(ua + vb)}sin[\pi(ua+vb)]e^{-j\pi(ua+vb)}H(u,v)=π(ua+vb)T?sin[π(ua+vb)]e?jπ(ua+vb)

下面的代碼可能比較混亂,因為實驗過程,而得出的結果不太好,還沒有整理。需要繼續學習后,再完成整理。

img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)
def motion_huv(img, a, b, T):eps = 1e-8M, N = img.shape[1], img.shape[0]u = np.arange(1, M+1)v = np.arange(1, N+1)u, v = np.meshgrid(u, v)temp = np.pi * (u * a + v * b)kernel = (T * np.sin(temp) * np.exp(-temp*1j) /(temp + eps))return kernel
# 對圖片進行運動模糊
def make_blurred(img, PSF, eps):#=====================
#     fft = np.fft.fft2(img)
# #     fft_shift = np.fft.fftshift(fft)#     fft_psf = fft * PSF#     ifft = np.fft.ifft2(fft_psf)
# #     ifft_shift = np.fft.ifftshift(ifft)
#     blurred = abs(ifft.real)#=========================M, N = img.shape[:2]fp = pad_image(img, mode='constant')fp_cen = centralized_2d(fp)img_fft = np.fft.fft2(fp_cen)img_fft_psf = img_fft * PSFifft = np.fft.ifft2(img_fft_psf)blurred = centralized_2d(ifft.real)[:N, :M]
# #     blurred = ifft.real[:N, :M]return blurred
def get_motion_dsf(image_size, motion_angle, motion_dis):PSF = np.zeros(image_size)  # 點擴散函數x_center = (image_size[0] - 1) / 2y_center = (image_size[1] - 1) / 2sin_val = np.sin(motion_angle * np.pi / 180)cos_val = np.cos(motion_angle * np.pi / 180)# 將對應角度上motion_dis個點置成1for i in range(motion_dis):x_offset = round(sin_val * i)y_offset = round(cos_val * i)PSF[int(x_center - x_offset), int(y_center + y_offset)] = 1return PSF / PSF.sum()    # 歸一化
img_motion = get_motion_dsf((480, 480), 70, 200)plt.figure(figsize=(10, 8))
plt.subplot(121), plt.imshow(img_motion,'gray'), plt.title('img_motion')
plt.show()

在這里插入圖片描述

OpenCV Motion Blur

def motion_blur(image, degree=12, angle=45):"""create motion blur using opencvparam: image: input imageparam: degree: the size of the blurryparam: angle: blur anglereturn uint8 image"""image = np.array(image)# 這里生成任意角度的運動模糊kernel的矩陣, degree越大,模糊程度越高M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)motion_blur_kernel = np.diag(np.ones(degree))motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))motion_blur_kernel = motion_blur_kernel / degreeblurred = cv2.filter2D(image, -1, motion_blur_kernel)# convert to uint8cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)blurred = np.array(blurred, dtype=np.uint8)return blurred
# 運動模糊圖像
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)img_blur = motion_blur(img_ori, degree=75, angle=15)plt.figure(figsize=(12, 8))
plt.subplot(121), plt.imshow(img_ori,'gray'), plt.title('img_deg')
plt.subplot(122), plt.imshow(img_blur,'gray'), plt.title('high_pass')
plt.show()

在這里插入圖片描述

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

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

相關文章

視覺感受排序算法

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

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

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

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

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

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

標題逆濾波逆濾波逆濾波 逆濾波 圖像的退化函數已知或者由前面的方法獲取退化函數,則可以直接逆濾波 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…

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

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

HoloLens開發手記 - Unity之Tracking loss

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

運維學python用不上_不會Python開發的運維終將被淘汰?

簡介 Python 語言是一種面向對象、直譯式計算機程序設計語言,由 Guido van Rossum 于 1989 年底發明。Python 語法簡捷而清晰,具有豐富和強大的類庫,具有可擴展性和可嵌入性,是現代比較流行的語言。最流行的語言 IEEE Spectrum 的…

windows驅動開發詳解學習筆記

1. windows驅動分兩類,NT式驅動和WDM驅動,后者支持即插即用; 2. DriverEntry是入口函數,傳入參數:pDriverObject由IO管理器傳入; 3. WDM驅動中,AddDevice創建設備對象,由PnP管理器調…

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建15 - 最小均方誤差(維納)濾波

標題最小均方誤差(維納)濾波最小均方誤差(維納)濾波 目標是求未污染圖像fff的一個估計f^\hat{f}f^?,使它們之間的均方誤差最小。 e2E{(f?f^)2}(5.80)e^2 E \big\{(f - \hat{f})^2 \big\} \tag{5.80}e2E{(f?f^?)2…

入網許可證_入網許可證怎么辦理,申請流程

移動通信系統及終端投資項目核準的若干規定》的出臺,打開了更多企業進入手機業的大門,然而一些企業在關心拿到手機牌照后,是不是就是意味了拿到入網許可證,就可以上市銷售。某些廠商認為:"手機牌照實行核準制,意味…

OpenGL編程低級錯誤范例手冊

看到一篇OpenGL編程的錯誤總結,對我初學來說應該比較有用,先保留,嘿嘿... 謝謝原文作者的貢獻:http://www.cnitblog.com/linghuye/archive/2005/08/13/1845.html 1.沒有glDisable(GL_TEXTURE_2D),導致基本幾何作圖全部失敗。 2.鏡…

C/C++ 中變量的聲明、定義、初始化的區別

今天突然思考到這樣的一個問題,發現已經在學習或者編寫程序的時候壓根就沒有注意到這些,經過比較這些還是有很大的區別的。 int i;//聲明 不分配地址空間 int j1;//轉載于:https://www.cnblogs.com/kuoyan/p/3687391.html

使用python matplotlib畫圖

本文的原文連接是: http://blog.csdn.net/freewebsys/article/details/52577631 未經博主允許不得轉載。 博主地址是:http://blog.csdn.net/freewebsys 1,關于 非常簡單的畫圖類庫。 簡直就是matlab的命令了。 python設計都是非常簡單的。 在使用pyt…

碧桂園博智林機器人總部大樓_碧桂園職院新規劃曝光!將建機器人實訓大樓、新宿舍、水幕電影等...

4月10日,廣東碧桂園職業學院召開院務(擴大)會議,學院黨政班子領導和相關負責人出席。會議集中觀看了學院四期工程的規劃區介紹,并就具體方案的可行性進行了研討。在碧桂園集團董事局主席楊國強先生的帶領下,碧桂園職院正緊隨集團產…

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建16 - 約束最小二乘方濾波、幾何均值濾波

標題約束最小二乘方濾波幾何均值濾波約束最小二乘方濾波 F^(u,v)[H?(u,v)∣H(u,v)∣2γ∣P(u,v)∣2]G(u,v)(5.89)\hat{F}(u,v) \bigg[\frac{H^*(u,v)}{|H(u,v)|^2 \gamma |P(u,v)|^2} \bigg]G(u,v) \tag{5.89}F^(u,v)[∣H(u,v)∣2γ∣P(u,v)∣2H?(u,v)?]G(u,v)(5.89) P(u,…

securecrt是什么工具_比較一下幾款常用的SSH工具

WX眾號:基因學苑Q群:32798724更多精彩內容等你發掘!編者按工欲善其事,必先利其器。作為生物信息分析人員,每天都需要通過SSH工具遠程登錄服務器,那么使用一款高效的連接工具就很有必要。這次我們來點評一下…

華為手機如何調時間顯示_華為手機照片如何出現時間地點天氣,教你30秒,一學就會...

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

Dreamweaver使用詳解

1:dreamweaver的基本功能,其中各種功能的靈活使用 轉載于:https://www.cnblogs.com/snowhumen/archive/2012/08/01/2618480.html

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建17 - 由投影重建圖像、雷登變換、投影、反投影、反投影重建

標題由投影重建圖像投影和雷登變換 Johann Radon反投影濾波反投影重建由投影重建圖像 本由投影重建圖像,主要是雷登變換與雷登把變換的應用,所以也沒有太多的研究,只為了保持完整性,而添加到這里。 # 自制旋轉投影圖像# 模擬一個…