深度學習圖像增強方法(二)

三、直方圖均衡化

1. 普通直方圖均衡化

直方圖均衡化的原理是將圖像的灰度直方圖展平,使得每個灰度級都有更多的像素分布,從而增強圖像的對比度。具體步驟如下:

  • 計算灰度直方圖:統計圖像中每個灰度級的像素數量。
  • 計算累積分布函數(CDF):計算每個灰度級的累積概率。
  • 映射灰度值:將原始圖像中的每個灰度值映射到新的灰度值,使得新的灰度分布更加均勻。
  • 生成均衡化后的圖像:使用映射后的灰度值生成新的圖像。
    在這里插入圖片描述
    在這里插入圖片描述
import cv2
import numpy as np
import matplotlib.pyplot as pltdef histogram_equalization(image):"""直方圖均衡化:param image: 輸入圖像(灰度圖像):return: 處理后的圖像"""if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)equalized_image = cv2.equalizeHist(image)return equalized_imagedef main():# 讀取圖像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 直方圖均衡化equalized_image = histogram_equalization(image)# 顯示原始圖像和處理后的圖像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(equalized_image, cmap='gray')plt.title('Histogram Equalized Image')plt.axis('off')plt.tight_layout()plt.show()# 顯示直方圖plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.hist(image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Original Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.subplot(1, 2, 2)plt.hist(equalized_image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Equalized Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.tight_layout()plt.show()if __name__ == "__main__":

2. 限制對比度自適應直方圖均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)

限制對比度自適應直方圖均衡化在直方圖均衡化的基礎上進行了改進,通過限制對比度和局部均衡化來避免過度增強圖像的對比度,從而減少噪聲和不自然的效果。基本原理如下:

  • 圖像分割:將圖像分割成若干個小塊(稱為“tiles”),每個小塊的大小由 tileGridSize 參數指定。
  • 局部均衡化:對每個小塊分別進行直方圖均衡化。為了限制對比度,使用 clipLimit 參數來限制每個小塊的直方圖中像素值的最大數量。
  • 插值平滑:將每個小塊均衡化后的結果通過插值技術合并,以避免明顯的邊界和不連續性。

在這里插入圖片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef clahe_equalization(image, clipLimit=2.0, tileGridSize=(8, 8)):"""CLAHE均衡化:param image: 輸入圖像(灰度圖像):param clipLimit: 對比度限制閾值:param tileGridSize: 小塊大小:return: 處理后的圖像"""if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)clahe = cv2.createCLAHE(clipLimit=clipLimit, tileGridSize=tileGridSize)clahe_image = clahe.apply(image)return clahe_imagedef main():# 讀取圖像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# CLAHE均衡化clahe_image = clahe_equalization(image, clipLimit=2.0, tileGridSize=(8, 8))# 顯示原始圖像和處理后的圖像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(clahe_image, cmap='gray')plt.title('CLAHE Equalized Image')plt.axis('off')plt.tight_layout()plt.show()# 顯示直方圖plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.hist(image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Original Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.subplot(1, 2, 2)plt.hist(clahe_image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of CLAHE Equalized Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.tight_layout()plt.show()if __name__ == "__main__":main()

四、空間域(增強)

空間域增強方法直接操作圖像的像素值,常用于提高圖像的可視性和特征表現。空間域增強方法可以分為線性濾波和非線性濾波兩大類。此外,邊緣檢測也是一種重要的空間域增強技術,用于突出圖像中的邊緣和細節。

1. 線性濾波

線性濾波通過卷積操作對圖像進行處理,常用的線性濾波器包括方框濾波、均值濾波器、高斯濾波器和銳化濾波器等。

(1) 方框濾波(Box Filtering)

方框濾波是一種簡單的均值濾波,通過計算每個像素鄰域內的平均值來平滑圖像。具體來說,對于每個像素,取其鄰域內的所有像素值的平均值作為該像素的新值。
在這里插入圖片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef box_filter(image, kernel_size=(3, 3)):"""方框濾波:param image: 輸入圖像:param kernel_size: 濾波器大小:return: 處理后的圖像"""filtered_image = cv2.boxFilter(image, -1, kernel_size)return filtered_imagedef main():# 讀取圖像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 方框濾波box_filtered_image = box_filter(image, kernel_size=(5, 5))# 顯示原始圖像和處理后的圖像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(box_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Box Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(2) 均值濾波器(Mean Filter)

均值濾波器通過計算每個像素鄰域內的平均值來平滑圖像。具體來說,對于每個像素,取其鄰域內的所有像素值的平均值作為該像素的新值。
在這里插入圖片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef mean_filter(image, kernel_size=(3, 3)):"""均值濾波:param image: 輸入圖像:param kernel_size: 濾波器大小:return: 處理后的圖像"""filtered_image = cv2.blur(image, kernel_size)return filtered_imagedef main():# 讀取圖像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 均值濾波mean_filtered_image = mean_filter(image, kernel_size=(5, 5))# 顯示原始圖像和處理后的圖像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(mean_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Mean Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(3) 高斯濾波器(Gaussian Filter)

高斯濾波器通過高斯核對圖像進行卷積操作,以平滑圖像并減少噪聲。高斯核的權重分布符合高斯分布,中心權重最大,邊緣權重逐漸減小。
在這里插入圖片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef gaussian_filter(image, kernel_size=(5, 5), sigmaX=0):"""高斯濾波:param image: 輸入圖像:param kernel_size: 濾波器大小:param sigmaX: 高斯核的標準差:return: 處理后的圖像"""filtered_image = cv2.GaussianBlur(image, kernel_size, sigmaX)return filtered_imagedef main():# 讀取圖像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 高斯濾波gaussian_filtered_image = gaussian_filter(image, kernel_size=(5, 5), sigmaX=0)# 顯示原始圖像和處理后的圖像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(gaussian_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Gaussian Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(4) 銳化濾波器(Sharpening Filter)

銳化濾波器通過增強圖像的邊緣和細節來提高圖像的清晰度。常用的銳化濾波器包括拉普拉斯算子和高通濾波器。
在這里插入圖片描述

import cv2
import numpy as np
import matplotlib.pyplot as pltdef sharpen_filter(image, kernel_size=(3, 3), alpha=1.5):"""銳化濾波:param image: 輸入圖像:param kernel_size: 濾波器大小:param alpha: 銳化因子:return: 處理后的圖像"""# 創建銳化濾波器kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 

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

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

相關文章

QT——信號與槽/自定義信號與槽

1 信號與槽基本介紹 提出疑問,界面上已經有按鍵了,怎么操作才能讓用戶按下按鍵后有操作上的反應呢? 在 Qt 中,信號和槽機制是一種非常強大的事件通信機制。這是一個重要的概念,特別是對于初學者來說,理解它…

Spring原理揭秘--Spring的AOP

在這之前我們已經介紹了AOP的基本功能和概念,那么當AOP集成到spring則會發生改變。Spring AOP 中的Joinpoint:之前提高了很多Joinpoint的類型,但是在spring中則只會有方法級別的Joinpoint,像構造方法,字段的調用都沒適…

C++學習筆記五

C繼承//基類 class Animal{};//派生類 class Dog : public Animal{};#include<iostearm> using namespace std;//基類 class Shape{public:void setwidth(int w){width w;}void setheight(int h){height h;}protected:int width;int height;}//派生類 class Rectangle …

AndroidStudio環境搭建

一、AndroidStudio下載 正常百度出來的站會自動翻譯成中文&#xff0c;導致歷史版本的界面總是顯示不出可下載的地方&#xff0c;點擊成切回英文&#xff0c;就能看出了。 歷史版本&#xff1a;https://developer.android.google.cn/studio/archive

Java大廠面試實錄:從Spring Boot到AI大模型的深度技術拷問

場景&#xff1a;互聯網大廠Java后端面試 面試官&#xff08;嚴肅&#xff09;&#xff1a;小曾&#xff0c;請坐。今天主要考察Java后端技術棧&#xff0c;包括微服務、大數據、AI等。我們先從簡單問題開始。 小曾&#xff08;搓手&#xff09;&#xff1a;好嘞&#xff01;面…

深入解析Hadoop中的HDFS架構設計

HDFS概述與核心設計原則作為Hadoop生態系統的基石&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;是一種專為大規模數據處理而設計的分布式文件系統。它的核心設計理念源于對互聯網時代數據特征的深刻洞察——數據規模呈指數級增長&#xff0c;而硬件…

ota之.加密算法,mcu加密方式

一、ota之.加密算法&#xff0c;mcu加密方式 前面一篇文章&#xff0c;講了soc的加密方式&#xff0c;但是soc資源充足&#xff0c;mcu沒有&#xff0c;所以不會用openss生成公私鑰 切計算哈希用rsa256位。 ECC&#xff08;橢圓曲線加密&#xff09; 是一種非對稱加密算法&…

LangChain面試內容整理-知識點23:實戰案例:檢索增強生成(RAG)系統

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種將LLM與外部知識庫結合的方法,通過實時檢索相關信息來輔助生成答案。這極大緩解了LLM“封閉知識”過期或不足的問題。LangChain非常適合構建RAG系統,因為它提供了文檔加載、向量存儲、檢索接口、LLM組合的一站式方…

探索阿里云ESA:開啟邊緣安全加速新時代

阿里云 ESA 是什么&#xff1f;阿里云 ESA&#xff0c;全稱邊緣安全加速&#xff08;Edge Security Acceleration&#xff09; &#xff0c;其前身為全站加速 DCDN&#xff08;Dynamic Content Delivery Network&#xff09;。在 2024 年 9 月 30 日&#xff0c;阿里云完成了這…

醋酸鈰:賦能科技創新的稀土之力

一、什么是醋酸鈰醋酸鈰是鈰元素與醋酸根離子形成的化合物。鈰作為稀土元素中的重要一員&#xff0c;廣泛應用于材料科學、催化劑、電子產品等領域。醋酸鈰以無色結晶或淺黃色結晶的形式存在&#xff0c;是鈰的有機鹽之一。它不僅具有穩定的化學性質&#xff0c;而且在某些特定…

數據結構之普利姆算法

前言&#xff1a;Prim算法是圖論中的算法&#xff0c;用來生成圖的最小生成樹。本篇文章介紹算法的流程&#xff0c;實現思想&#xff0c;和具體代碼實現&#xff0c;使用c語言。學習需要輸出才能理解的更透徹&#xff0c;所以說堅持寫文章&#xff0c;希望可以用自己的方式把一…

構建強大的物聯網架構所需了解的一切

數據正驅動著當今的商業發展&#xff0c;而物聯網&#xff08;IoT&#xff09;則有助于為企業的增長和創新開辟新的機遇。麥肯錫的研究表明&#xff0c;全球數據在四年內實現了驚人的 7 倍增長。隨著越來越多的物聯網設備進入市場&#xff0c;更多企業開始需要強大的物聯網架構…

java之json轉excel生成

背景 業務為實現自定義樣式excel的導出&#xff0c;常規的做法就是根據數據在代碼中進行類似模版的配置&#xff1b;這樣的體驗不是很好&#xff0c;只要用戶改變下樣式的設置不用代碼改動就能實現自定義excel的導出更加靈活。 以下是具體實現 pom依賴 <dependency><g…

新版本Cursor中配置自定義MCP服務器教程,附MCP工具開發實戰源碼

在 Cursor 中配置自定義 MCP 服務器&#xff1a;打造你的 AI 開發工具鏈 引言 隨著 AI 編程助手的普及&#xff0c;開發者們越來越希望能夠定制化自己的開發環境。Cursor 作為一款強大的 AI 編程編輯器&#xff0c;提供了 Model Context Protocol (MCP) 支持&#xff0c;新版本…

前端面試十二之vue3基礎

一、ref和reactive在 Vue 3 中&#xff0c;ref 和 reactive 是兩種主要的響應式數據創建方式&#xff0c;它們各有特點和適用場景。1.refref 主要用于創建單個值的響應式引用&#xff0c;通常用于基本類型數據&#xff0c;如數字、字符串等。使用 ref 創建的引用對象可以通過 .…

設計模式四:裝飾模式(Decorator Pattern)

裝飾模式是一種結構型設計模式&#xff0c;它允許你動態地給一個對象添加額外的職責&#xff0c;相比繼承更加靈活。1. 模式定義裝飾模式&#xff1a;動態地給一個對象添加一些額外的職責。就增加功能來說&#xff0c;裝飾模式相比生成子類更為靈活。2. 模式結構主要角色&#…

神經網絡常見激活函數 14-Mish函數

文章目錄Mish函數導函數函數和導函數圖像優缺點PyTorch 中的 Mish 函數TensorFlow 中的 Mish 函數Mish 論文 https://arxiv.org/pdf/1908.08681 函數導函數 Mish函數 Mish(x)x?tanh??(softplus(x))x?tanh??(ln??(1ex))\begin{aligned} \text{Mish}(x) & x \cdot \t…

LAMP遷移LNMP Nginx多站點配置全流程

文章目錄前言備份與停止服務nginx安裝與配置nginx 編譯安裝配置服務php-fpm多站點配置phf-fpm介紹多站點配置nginx 多站點配置nginx ssl 配置參考前言 之前服務器使用的是 LAMP環境&#xff0c;想充分利用服務器資源&#xff0c;再運行另外一個站點 在LAMP環境下應該是也可以…

Nginx屏蔽國外IP訪問

下載IP列表 # 下載到文件 wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest # 直接輸出到終端 curl -sSL https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest得到一份國內IP配置 # 原始IP列表格式&#xff1a;apnic|CN|ipv4|218.78.0.0|1310…

stl-string模擬

1.介紹主要進行cpp中string的模擬&#xff0c;方便我們更好的對stl進行使用&#xff0c;string沒有模板&#xff0c;我們將頭文件和函數寫在兩個不同的文件2.頭文件3.cpp文件如有問題&#xff0c;歡迎糾正&#xff01;