圖像預處理-圖像噪點消除

一.基本介紹

噪聲:指圖像中的一些干擾因素,也可以理解為有那么一些點的像素值與周圍的像素值格格不入。常見的噪聲類型包括高斯噪聲和椒鹽噪聲。

濾波器:也可以叫做卷積核

- 低通濾波器是模糊,高通濾波器是銳化

- 低通濾波器就是允許低頻信號通過,在圖像中邊緣噪點都相當于高頻部分,所以低通濾波器用于去除噪點、平滑和模糊圖像。高通濾波器則反之,用來增強圖像邊緣,進行銳化處理。

注意:椒鹽噪聲可以理解為斑點,隨機出現在圖像中的黑點或白點;高斯噪聲可以理解為拍攝圖片時由于光照等原因造成的噪聲。

這是高斯噪聲


這是椒鹽噪聲,有很多黑白的或者孤立的小點


1.1 均值濾波

cv.blur(img, ksize)

參數:

- ksize:代表卷積核的大小

取的是卷積核區域內元素的均值

????????對于邊界的像素點,則會進行邊界填充,以確保卷積核的中心能夠對準邊界的像素點進行濾波操作。在OpenCV中,默認的是使用BORDER_REFLECT_101的方式進行填充,下面的濾波方法中除了中值濾波使用的是BORDER_REPLICATE進行填充之外,其他默認也是使用這個方式進行填充

import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 均值濾波,用3*3的卷積核
blur = cv.blur(img, (3, 3))cv.imshow('img', img)
cv.imshow('blur', blur)
cv.waitKey(0)
cv.destroyAllWindows()

1.2?方框濾波

cv.boxFilter(img, ddepth,ksize, normalize)

參數:

- ksize:代表卷積核的大小

- ddepth:輸出圖像的深度,-1代表使用原圖像的深度。

指在每個像素點所使用的位數(bit depth),也就是用來表示圖像中每一個像素點的顏色信息所需的二進制位數。圖像深度決定了圖像能夠表達的顏色數量或灰度級。

- normalize:當normalizeTrue的時候,方框濾波就是均值濾波,權重就等于1/9;normalizeFalse的時候,每個像素權重都是1,相當于求區域內的像素和,超出部分取模運算。

import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 方框濾波,用3*3的卷積核,類似均值濾波
box = cv.boxFilter(img, -1,(3, 3),normalize=True)# 真正的方框濾波
box1 = cv.boxFilter(img, -1,(3, 3), normalize=False)cv.imshow('img', img)
cv.imshow('box', box)
cv.imshow('box1', box1)
cv.waitKey(0)
cv.destroyAllWindows()

跟均值濾波很像

????????可以看到這里的方框濾波顯示圖片是很接近白色的,因為其將像素點周圍的像素權重都設為1,然后相加得到該像素的值,所以很多都超過了255而進行了取模操作。

1.2 高斯濾波

cv.GaussianBlur(img, ksize, sigmaX)

參數:

- sigmaX

就是高斯函數里的值,σx值越大模糊效果越明顯。高斯濾波相比均值濾波效率要慢,但可以有效消除高斯噪聲,能保留更多的圖像細節,所以經常被稱為最有用的濾波器。

通過使用高斯函數(正態分布)作為卷積核來對圖像進行模糊處理。

import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 高斯,用3*3的卷積核
Gauss = cv.GaussianBlur(img, (3, 3), 1)cv.imshow('img', img)
cv.imshow('Gauss', Gauss)cv.waitKey(0)
cv.destroyAllWindows()

1.3 中值濾波

cv.medianBlur(img, ksize)

????????中值濾波沒有核值,而是在原圖中從左上角開始,將卷積核區域內的像素值進行排序,并選取中值作為卷積核的中點的像素值。就是用區域內的中值來代替本像素值,所以那種孤立的斑點,如0或255很容易消除掉,適用于去除椒鹽噪聲斑點噪聲

import cv2 as cv# 導入椒鹽噪聲圖片
img = cv.imread('../images/lvbo3.png')# 中值濾波,注意這里的3
median = cv.medianBlur(img, 3)cv.imshow('img', img)
cv.imshow('median', median)cv.waitKey(0)
cv.destroyAllWindows()

????????其實你會注意到,中值濾波的ksize為啥是個整數呢,前面的都是(x,x)。因為中值濾波是非線性的,且沒有核值不依賴卷積核權重。

1.4 雙邊濾波

cv.bilateralFilter(img,ksize,d,sigmaColor,sigmaSpace)

參數:

- d:過濾時周圍每個像素領域的直徑,這里已經設置了核大小。d=9===>9x9

- sigmaColor:在color space值域空間)中過濾sigma。參數越大,那些顏色足夠相近的的顏色的影響越大。較大的sigmaColor意味著更大的顏色差異將被允許參與到加權平均中.

- sigmaSpace:在coordinate space坐標空間)中過濾sigma。這個參數是坐標空間中的標準差,決定了像素位置對濾波結果的影響程度。

雙邊濾波的基本思路是同時考慮將要被濾波的像素點的空域(空間)信息(周圍像素點的位置的權重)和值域信息(周圍像素點的像素值的權重)。因為在邊緣處,臨近的像素點差異會比較大,如果只是使用空域信息來進行濾波的話,得到的結果必然是邊緣被模糊了,這樣我們就丟掉了邊緣信息。這也是一種非線性濾波

import cv2 as cvimg = cv.imread('../images/lvbo2.png')# 雙邊濾波
sb = cv.bilateralFilter(img, 9, 100, 100)cv.imshow('img', img)
cv.imshow('sb', sb)cv.waitKey(0)
cv.destroyAllWindows()

注意:

關于2個sigma參數:

簡單起見,可以令2個sigma的值相等;

如果他們很小(小于10),那么濾波器幾乎沒有什么效果

如果他們很大(大于150),那么濾波器的效果會很強,使圖像顯得非常卡通化

關于參數d

過大的濾波器(d>5)執行效率低。

對于實時應用,建議取d=5

對于需要過濾嚴重噪聲的離線應用,可取d=9;

二.圖像梯度處理

2.1 圖像梯度

????????把圖片想象成連續函數,因為邊緣部分的像素值是與旁邊像素有明顯區別,所以對圖片局部求極值,就可以得到整幅圖片的邊緣信息了。不過圖片是二維的離散函數,導數就變成了差分,這個差分就稱為圖像的梯度

2.2?垂直邊緣提取

????????這個核是用來提取圖片中的垂直邊緣(右側邊緣,若提取左邊緣卷積核中正負號換一下就好)的,中間像素就是這個卷積核卷積的結果

????????當前列左右兩側的元素進行差分,由于邊緣(當前列)的值明顯小于(或大于)周邊像素,所以邊緣(當前列)的差分結果會明顯不同,這樣就提取出了垂直邊緣。簡單理解,就是在‘1’位置右邊的像素值相對于‘-1’位置左邊的像素值的差距會顯示在中間的像素中,所以中間的列就是旁邊兩列的垂直差分

來介紹一下二維卷積函數:

cv2.filter2D(src, ddepth, kernel)

- src: 輸入圖像,一般為numpy數組。

- ddepth: 輸出圖像的深度,可以是負值(表示與原圖相同)、正值或其他特定值(常用-1 表示輸出與輸入具有相同的深度)。

- kernel: 卷積核,一個二維數組(通常為奇數大小的方形矩陣),用于計算每個像素周圍鄰域的加權和。

import cv2 as cv
import numpy as np# 模擬一張圖像,灰度圖
img=np.array([[100,102,109,110,98,20,19,18,21,22],[109,101,98,108,102,20,21,19,20,21],[109,102,105,108,98,20,22,19,19,18],[109,98,102,108,102,20,23,19,20,22],[109,102,105,108,98,20,22,19,20,18],[100,102,108,110,98,20,19,18,21,22],[109,101,98,108,102,20,22,19,20,21],[109,102,108,108,98,20,22,19,19,18],],dtype=np.float32)
# 定義卷積核,
kernel=np.array([[-1,0,1],[-2,0,2],[-1,0,1]],dtype=np.float32)
# 二維卷積操作
img2=cv.filter2D(img,-1,kernel)
# 打印卷積后的圖
print(img2)

[[ ? 0. ? -4. ? 30. ?-14. -356. -320. ? -6. ? ?2. ? 12. ? ?0.]
?[ ? 0. ?-17. ? 28. ?-10. -354. -317. ? -5. ? -3. ? ?7. ? ?0.]
?[ ? 0. ?-26. ? 29. ?-10. -352. -312. ? -4. ?-10. ? ?3. ? ?0.]
?[ ? 0. ?-22. ? 32. ?-14. -352. -310. ? -4. ?-11. ? ?4. ? ?0.]
?[ ? 0. ? -7. ? 30. ?-24. -354. -310. ? -5. ? -5. ? ?5. ? ?0.]
?[ ? 0. ? ?1. ? 29. ?-23. -356. -314. ? -6. ? ?0. ? ?9. ? ?0.]
?[ ? 0. ?-15. ? 28. ?-12. -354. -315. ? -5. ? -5. ? ?7. ? ?0.]
?[ ? 0. ?-24. ? 26. ?-12. -352. -312. ? -4. ?-10. ? ?2. ? ?0.]]

????????這里的值就是用上面的卷積核計算的,其中邊緣由于沒有左側的值無法做左右兩邊的差分,所以是0,也就是無梯度變化。然后中間兩列有著超出255的最大數值,這就會作為邊緣被提取出來。

????????差分后值的符號正負代表梯度的方向,差分值實際應該取絕對值,畢竟我們只是想看數值大小來提取邊緣。值超過了255都算(+-)255,即使是負號。

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

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

相關文章

安卓手機如何改ip地址教程

對于安卓手機用戶而言,ip修改用在電商、跨境電商、游戲搬磚、社交軟件這些需要開多個賬號的項目。因為多個設備或賬號又不能在同一ip網絡下,所以修改手機的IP地址防檢測成為一個必要的操作。以下是在安卓手機上更改IP地址的多種方法及詳細步驟&#xff0…

對象池模式在uniapp鴻蒙APP中的深度應用

文章目錄 對象池模式在uniapp鴻蒙APP中的深度應用指南一、對象池模式核心概念1.1 什么是對象池模式?1.2 為什么在鴻蒙APP中需要對象池?1.3 性能對比數據 二、uniapp中的對象池完整實現2.1 基礎對象池實現2.1.1 核心代碼結構2.1.2 在Vue組件中的應用 2.2 …

本地部署大模型實現掃描版PDF文件OCR識別!

在使用大模型處理書籍 PDF 時,有時你會遇到掃描版 PDF,也就是說每一頁其實是圖像形式。這時,大模型需要先從圖片中提取文本,而這就需要借助 OCR(光學字符識別)技術。 像 Gemini 2.5 這樣的強大模型&#x…

《Operating System Concepts》閱讀筆記:p700-p732

《Operating System Concepts》學習第 60 天,p700-p732 總結,總計 33 頁。 一、技術總結 1.Virtual machine manager (VMM) The computer function that manages the virtual machine; also called a hypervisor. VMM 也稱為 hypervisor。 2.types …

軟件項目驗收報告模板

軟件項目驗收報告 一、項目基本信息 項目名稱XX智能倉儲管理系統開發單位XX科技有限公司驗收單位XX物流集團合同簽訂日期2023年3月15日項目啟動日期2023年4月1日驗收日期2024年1月20日 二、驗收范圍 入庫管理模塊(包含RFID識別、庫存預警)出庫調度模…

深度學習筆記39_Pytorch文本分類入門

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 | 接輔導、項目定制 一、我的環境 1.語言環境:Python 3.8 2.編譯器:Pycharm 3.深度學習環境: torch1.12.1cu113torchvision…

二分查找-LeetCode

題目 給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。 示例 1: 輸入: nums [-1,0,3,5,9,12], target 9 輸出: 4 解釋: …

從 Ext 到 F2FS,Linux 文件系統與存儲技術全面解析

與 Windows 和 macOS 操作系統不同,Linux 是由愛好者社區開發的大型開源項目。它的代碼始終可供那些想要做出貢獻的人使用,任何人都可以根據個人需求自由調整它,或在其基礎上創建自己的發行版本。這就是為什么 Linux 存在如此多的變體&#x…

leetcode:3210. 找出加密后的字符串(python3解法)

難度:簡單 給你一個字符串 s 和一個整數 k。請你使用以下算法加密字符串: 對于字符串 s 中的每個字符 c,用字符串中 c 后面的第 k 個字符替換 c(以循環方式)。 返回加密后的字符串。 示例 1: 輸入&#xff…

JVM詳解(曼波腦圖版)

(?ω?)ノ 好噠!曼波會用最可愛的比喻給小白同學講解JVM,準備好開啟奇妙旅程了嗎?(??????)? 📌 思維導圖 ━━━━━━━━━━━━━━━━━━━ 🍎 JVM是什么?(蘋果式比…

ZStack文檔DevOps平臺建設實踐

(一)前言 對于軟件產品而言,文檔是不可或缺的一環。文檔能幫助用戶快速了解并使用軟件,包括不限于特性概覽、用戶手冊、API手冊、安裝部署以及場景實踐教程等。由于軟件與文檔緊密耦合,面對業務的瞬息萬變以及軟件的飛…

Git創建分支操作指南

1. 創建新分支但不切換&#xff08;僅創建&#xff09; git branch <分支名>示例&#xff1a;創建一個名為 new-feature 的分支git branch new-feature2. 創建分支并立即切換到該分支 git checkout -b <分支名> # 傳統方式 # 或 git switch -c <分支名&g…

package.json 中的那些版本數字前面的符號是什么意思?

1. 語義化版本&#xff08;SemVer&#xff09; 語義化版本的格式是 MAJOR.MINOR.PATCH&#xff0c;其中&#xff1a; MAJOR&#xff1a;主版本號&#xff0c;表示不兼容的 API 修改。MINOR&#xff1a;次版本號&#xff0c;表示新增功能但保持向后兼容。PATCH&#xff1a;修訂號…

如何有效防止服務器被攻擊

首先&#xff0c;我們要明白服務器被攻擊的危害有多大。據不完全統計&#xff0c;每年因服務器遭受攻擊而導致的經濟損失高達數十億。這可不是一個小數目&#xff0c;就好比您辛苦積攢的財富&#xff0c;瞬間被人偷走了一大半。 要有效防止服務器被攻擊&#xff0c;第一步就是…

Chainlit 快速構建Python LLM應用程序

背景 chainlit 是一款簡單易用的Web UI goggle&#xff0c;它支持使用 Python 語言快速構建 LLM 應用程序&#xff0c;提供了豐富的功能&#xff0c;包括文本分析&#xff0c;情感分析等。 這里我們以官網openai提供的例子&#xff0c;快速的開發一個帶有UI的聊天界面&#xf…

華為OD機試真題——硬件產品銷售方案(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《硬件產品…

【數據結構_6】雙向鏈表的實現

一、實現MyDLinkedList&#xff08;雙向鏈表&#xff09; package LinkedList;public class MyDLinkedList {//首先我們要創建節點&#xff08;因為雙向鏈表和單向鏈表的節點不一樣&#xff01;&#xff01;&#xff09;static class Node{public String val;public Node prev…

做Data+AI的長期主義者,加速全球化戰略布局

在Data與AI深度融合的新紀元&#xff0c;唯有秉持長期主義方能真正釋放數智化的深層價值。2025年是人工智能從技術爆發轉向規模化落地的關鍵節點&#xff0c;也是標志著袋鼠云即將迎來十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功舉辦了“做DataAI的長期主義者——…

構建基于PHP和MySQL的解夢系統:設計與實現

引言 夢境解析一直是人類心理學和文化研究的重要領域。隨著互聯網技術的發展,構建一個在線的解夢系統能夠幫助更多人理解自己夢境的含義。本文將詳細介紹如何使用PHP和MySQL構建一個功能完整的解夢系統,包括系統架構設計、數據庫模型、核心功能實現以及優化策略。 本文源碼下…

【桌面】【系統應用】Samba共享文件夾

目錄 場景一&#xff1a;銀河麒麟桌面與銀河麒麟桌面之間共享文件夾 環境準備 實現目標 操作步驟 &#xff08;一&#xff09;配置主機A共享文件夾 1、環境準備 2、在主機A創建共享文件夾 3、設置共享文件密碼 &#xff08;二&#xff09;主機B訪問主機A 場景二&…