網站首頁 編程語言 正文
本文實例為大家分享了python實現圖像降噪的具體代碼,供大家參考,具體內容如下
任務描述
背景
圖像在數字化和傳輸等過程中會產生噪聲,從而影響圖像的質量,而圖像降噪技術可以有效地減少圖像中的噪聲。如下圖所示,左圖是一幅包含噪聲的圖像(圖中的黑點即為噪聲),右圖是降噪后的結果(黑點顯著減少)。
中值濾波是一種常用的圖像降噪方法,對于一幅帶噪聲的圖像 1(設分辨率為 w×h),降噪方法如下:
1)將圖像1轉換成灰度圖,仍稱為圖像1;
2)新建圖像2,圖像2為灰度圖,分辨率與圖像1相同;
3)對于圖像 1 中坐標為 (x,y) 的像素 p,求 p 的中值 c,然后將圖像 2 中 (x,y) 處的像素值設置成 c,其中,1≤x≤w?2、1≤y≤h?2;
4)保存圖像 2,圖像 2 即存放了降噪后的結果。
其中,第 3 步要計算 (x,y) 處像素 p 的中值 c,計算方法如下:
1)選取以 p 為中心的 3×3 圖像區域,如上圖所示,每個小方格代表一個像素,數字表示像素的灰度值,像素 p 的坐標為 (x,y),則選取的圖像區域為黃色底紋區域;
2)對步驟 1 中選取的 9 個像素的顏色值進行升序排列,如上圖所示例子排序后為:11、12、13、14、15、16、17、18、99;
3)在步驟 2 得到的排序結果中,排在最中間一個值即為中值 c,如上圖所示例子中像素 p 的中值為 15。
任務
本關任務是補全程序,使其能進行圖像降噪,說明如下:
1)排序操作可利用列表中的sort函數進行;
2)關于代碼的相關說明見注釋。
相關知識
略。
編程要求
在 Begin-End 區間補全代碼,具體要求見上。
測試說明
測試集正確結果如下:
(1 ?, 1 ) -> 255
(72 , 42) -> 191
(120, 45) -> 127
(164, 49) -> 89
(235, 49) -> 38
你的圖像與正確答案相同!
說明如下:
1)系統會調用你編寫的median函數,并以“像素坐標 -> 中值”的格式打印結果,如測試集第 1 行的(1 , 1 ) -> 255表示:(1,1) 處像素的中值為255;
2)此外,系統會檢查程序生成的圖像文件,若正確則在測試集最后一行打印你的圖像與正確答案相同!。
開始你的任務吧,祝你成功!
from PIL import Image
# 求圖像img中(x,y)處像素的中值c
def median(img, x, y):
? ? ########## Begin ##########
? ? L = []
? ? xl = [x-1,x,x+1]
? ? yl = [y-1,y,y+1]
? ? for i in xl:
? ? ? ? for j in yl:
? ? ? ? ? ? gray = img.getpixel((i, j)) ?# 取出灰度值
? ? ? ? ? ? L.append(gray)
? ? L.sort()
? ? c = L[4]
? ? ########## End ##########
? ? return c
# 對圖像文件1進行降噪,并將結果保存為圖像文件2
# 圖像文件1和2的路徑分別為path1和path2
def denoise(path1, path2):
? ? img1 = Image.open(path1) ?# 圖像1
? ? img1 = img1.convert('L') ?# 將圖像1轉換為灰度圖
? ? w, h = img1.size
? ? img2 = Image.new('L', (w, h), 'white') ?# 圖像2
? ? for x in range(1, w - 1):
? ? ? ? for y in range(1, h - 1):
? ? ? ? ? ? c = median(img1, x, y) ?# 求中值
? ? ? ? ? ? img2.putpixel((x, y), c) ?# 將灰度設置為中值
? ? img2.save(path2)
path1 = 'step4.bmp' ?# 帶噪聲的圖像
path2 = 'step4_2.bmp' ?# 降噪后的圖像
denoise(path1, path2)
原文鏈接:https://blog.csdn.net/qq_42833469/article/details/121581439
相關推薦
- 2022-10-27 C++移動語義介紹與使用講解_C 語言
- 2022-08-26 Input標簽自動校驗功能去除實現_React
- 2024-01-09 使用<scope>import</scope>解決Maven項目單繼承問題
- 2022-05-28 Entity?Framework?Core更新時間映射_實用技巧
- 2022-05-13 ByteTrack的卡爾曼濾波使用什么樣的邊框坐標信息
- 2022-11-10 react-native?父函數組件調用類子組件的方法(實例詳解)_React
- 2022-05-23 ES6新增關鍵字let和const介紹_基礎知識
- 2023-01-02 Kotlin?fun函數使用方法_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支