OpenCV 官翻6 - Computational Photography

文章目錄

  • 圖像去噪
    • 目標
    • 理論
  • OpenCV中的圖像去噪
    • 1、cv.fastNlMeansDenoisingColored()
    • 2、cv.fastNlMeansDenoisingMulti()
    • 附加資源
  • 圖像修復
    • 目標
    • 基礎概念
    • 代碼
    • 補充資源
    • 練習
  • 高動態范圍成像(HDR)
    • 目標
    • 理論基礎
  • 曝光序列HDR
    • 1、將曝光圖像加載到列表中
    • 2、將曝光序列合并為HDR圖像
    • 3、色調映射HDR圖像
    • 4、使用Mertens融合算法合并曝光圖像
    • 5、轉換為8位并保存
    • 結果
    • 德貝維克方法:
    • 羅伯遜方法:
    • Mertenes 融合算法:
  • 估計相機響應函數
    • 補充資源
    • 練習


圖像去噪

https://docs.opencv.org/4.x/d5/d69/tutorial_py_non_local_means.html


目標

在本章中,

  • 你將學習使用非局部均值去噪算法來消除圖像中的噪聲。
  • 你將了解不同的函數,如 cv.fastNlMeansDenoising()cv.fastNlMeansDenoisingColored() 等。

理論

在前面的章節中,我們已經了解了許多圖像平滑技術,如高斯模糊、中值模糊等,這些技術在去除少量噪聲方面有一定效果。在這些技術中,我們選取像素周圍的小鄰域,并通過高斯加權平均、取中值等操作來替換中心像素。簡而言之,像素點的去噪過程僅局限于其鄰近區域。

噪聲具有一個特性:通常被視為均值為零的隨機變量。假設一個含噪像素為 \(p = p_0 + n\),其中 \(p_0\) 是像素的真實值,\(n\) 是該像素的噪聲。若從不同圖像中獲取大量相同像素(比如 \(N\) 個)并計算其平均值,理想情況下應得到 \(p = p_0\),因為噪聲的均值為零。

你可以通過簡單實驗驗證這一點:用固定相機對準某場景拍攝幾秒鐘,這將獲得大量幀(即同一場景的多張圖像)。然后編寫代碼計算視頻中所有幀的平均值(這對現在的你應該非常簡單),最后將結果與第一幀對比,即可觀察到噪聲的減少。但遺憾的是,這種簡單方法無法應對相機和場景的運動,且通常我們只有一張含噪圖像可用。

因此,核心思路是:我們需要一組相似圖像來消除噪聲。假設在圖像中取一個小窗口(如5x5像素),很可能在圖像的其他位置(有時在其鄰近區域)存在相似的圖像塊。若能將這些相似塊集中并計算平均值,對該特定窗口而言效果會很好。參考下圖示例:

相似塊示意圖

圖中藍色塊看起來相似,綠色塊也彼此相似。具體操作是:選取一個像素,在其周圍取小窗口,在圖像中搜索相似窗口,對所有窗口取平均值后替換原像素。這種方法稱為非局部均值去噪(Non-Local Means Denoising)。雖然比之前介紹的模糊技術耗時更長,但效果顯著。更多細節和在線演示可參考附加資源中的第一個鏈接。

對于彩色圖像,會先轉換到CIELAB色彩空間,然后分別對L分量和AB分量進行去噪處理。


OpenCV中的圖像去噪

OpenCV提供了該技術的四種變體。

1、cv.fastNlMeansDenoising() - 處理單張灰度圖像
2、cv.fastNlMeansDenoisingColored() - 處理彩色圖像
3、cv.fastNlMeansDenoisingMulti() - 處理短時間內捕獲的圖像序列(灰度圖像)
4、cv.fastNlMeansDenoisingColoredMulti() - 同上,但適用于彩色圖像


常用參數說明:

  • h : 決定濾波強度的參數。較高的h值能更好去除噪聲,但也會損失圖像細節(推薦值10)
  • hForColorComponents : 與h相同,但僅適用于彩色圖像(通常與h值相同)
  • templateWindowSize : 應為奇數(推薦值7)
  • searchWindowSize : 應為奇數(推薦值21)

更多參數詳情請參閱附加資源中的第一個鏈接。

我們將在此演示第2和第3種方法,其余方法留給讀者自行探索。


1、cv.fastNlMeansDenoisingColored()

如上所述,該方法用于去除彩色圖像中的噪聲(假設噪聲服從高斯分布)。參見以下示例:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread('die.png')dst = [cv.fastNlMeansDenoisingColored`](https://docs.opencv.org/4.x/d1/d79/group__photo__denoise.html#ga03aa4189fc3e31dafd638d90de335617)(img,None,10,10,7,21)plt.subplot(121),plt.imshow(img)
plt.subplot(122),plt.imshow(dst)
plt.show()

以下是放大后的結果。我的輸入圖像帶有標準差為 \(\sigma = 25\) 的高斯噪聲。

查看效果:


2、cv.fastNlMeansDenoisingMulti()

現在我們將同樣的方法應用于視頻處理。第一個參數是含噪聲的幀列表。第二個參數imgToDenoiseIndex指定需要去噪的幀,這里我們傳入輸入列表中該幀的索引值。第三個參數temporalWindowSize表示用于去噪的鄰近幀數量,該值應為奇數。此時將使用共計temporalWindowSize幀,其中中心幀就是待去噪的幀。例如,你傳入包含5幀的輸入列表,設imgToDenoisingIndex = 2且temporalWindowSize = 3,那么將使用frame-1、frame-2和frame-3來對frame-2進行去噪。下面來看具體示例。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltcap = cv.VideoCapture('vtest.avi')# create a list of first 5 frames
img = [cap.read()[1] for i in range(5)]# convert all to grayscale
gray = [cv.cvtColor(i, cv.COLOR_BGR2GRAY) for i in img]# convert all to float64
gray = [np.float64(i) for i in gray]# create a noise of variance 25
noise = np.random.randn(*gray[1].shape)*10# Add this noise to images
noisy = [i+noise for i in gray]# Convert back to uint8
noisy = [np.uint8(np.clip(i,0,255)) for i in noisy]# Denoise 3rd frame considering all the 5 frames
dst = cv.fastNlMeansDenoisingMulti(noisy, 2, 5, None, 4, 7, 35)plt.subplot(131),plt.imshow(gray[2],'gray')
plt.subplot(132),plt.imshow(noisy[2],'gray')
plt.subplot(133),plt.imshow(dst,'gray')
plt.show()

下圖展示了我們獲得結果的放大版本:

該計算過程需要耗費大量時間。在結果中,第一張是原始幀圖像,第二張是添加噪聲后的圖像,第三張則是去噪后的圖像。


附加資源

1、http://www.ipol.im/pub/art/2011/bcm_nlm/(包含詳細資料、在線演示等,強烈推薦訪問。我們的測試圖像即源自此鏈接)
2、Coursera在線課程(第一張圖像取自此處)

本文檔由 doxygen 1.12.0 生成于 2025年4月30日 星期三 23:08:43,適用于 OpenCV



圖像修復

https://docs.opencv.org/4.x/df/d3d/tutorial_py_inpainting.html


目標

在本章中,

  • 我們將學習如何通過一種稱為"修復"的方法去除舊照片中的小噪點、劃痕等
  • 我們將了解OpenCV中的圖像修復功能

基礎概念

想必大家家中都保存著一些老舊褪色的照片,上面可能布滿黑點或劃痕。你是否曾想過如何修復它們?我們無法簡單地用繪圖工具擦除這些瑕疵,因為這樣只會將黑色結構替換為白色結構,毫無實際意義。針對這種情況,就需要使用一種稱為圖像修復(image inpainting)的技術。其核心思想很簡單:用鄰近像素替換這些瑕疵區域,使其與周圍環境自然融合。如下圖所示(圖片來自維基百科):



為此人們設計了多種算法,OpenCV提供了其中兩種實現。兩者都可通過同一個函數 cv.inpaint() 調用。

第一種算法基于Alexandru Telea 2004年發表的論文**《基于快速行進法的圖像修復技術》**,其核心是快速行進法(Fast Marching Method)。算法從待修復區域的邊界開始,逐步向內推進,優先填充邊界區域。對于每個待修復像素,算法會取其周圍小鄰域內的已知像素,用歸一化加權和進行替換。權重分配至關重要:離目標點越近、越接近邊界法線方向、或位于邊界輪廓上的像素會獲得更高權重。完成當前像素修復后,通過快速行進法移動到下一個最近像素。這種機制確保已知像素附近的區域優先修復,模擬人工修復的啟發式過程。可通過標志位 cv.INPAINT_TELEA 啟用該算法。

第二種算法基于Bertalmio、Marcelo、Andrea L. Bertozzi和Guillermo Sapiro 2001年發表的論文**《納維-斯托克斯方程、流體力學與圖像視頻修復》**,采用流體動力學和偏微分方程方法。其基本原理是啟發式的:首先沿著已知區域到未知區域的邊緣行進(因為邊緣具有連續性),通過保持等照度線(連接相同強度點的線條,類似等高線連接相同海拔點)的同時匹配修復區域邊界的梯度向量。這一過程運用了流體動力學中的方法,獲得這些信息后,通過填充顏色使該區域方差最小化。可通過標志位 cv.INPAINT_NS 啟用該算法。


代碼

我們需要創建一個與輸入圖像大小相同的掩碼,其中非零像素對應需要修復的區域。其他部分都很簡單。我的圖像被一些黑色筆劃(我手動添加的)破壞了。我使用畫圖工具創建了相應的筆劃。

import numpy as np
import cv2 as cvimg = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png', cv.IMREAD_GRAYSCALE)dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

查看下方結果。第一張圖顯示的是降質輸入圖像。第二張圖是掩膜。第三張圖是第一種算法的處理結果,最后一張圖是第二種算法的處理結果。



補充資源

1、Bertalmio, Marcelo, Andrea L. Bertozzi, 和 Guillermo Sapiro. “Navier-stokes, fluid dynamics, and image and video inpainting.” 收錄于《計算機視覺與模式識別,2001年CVPR會議論文集》,第1卷,第I-355頁。IEEE,2001年。
2、Telea, Alexandru. “An image inpainting technique based on the fast marching method.” 《圖形工具雜志》9.1 (2004): 23-34.


練習

1、OpenCV 自帶了一個關于圖像修復的交互式示例 samples/python/inpaint.py,請嘗試運行它。
2、幾個月前,我觀看了一個關于 Content-Aware Fill 的視頻,這是 Adobe Photoshop 中使用的一種高級圖像修復技術。經過進一步搜索,我發現 GIMP 中也有相同的技術,只是名稱不同,叫做 “Resynthesizer”(需要單獨安裝插件)。我相信你會喜歡這個技術。


生成于 2025年4月30日 星期三 23:08:43,由 doxygen 1.12.0 為 OpenCV 生成


高動態范圍成像(HDR)

https://docs.opencv.org/4.x/d2/df0/tutorial_py_hdr.html


目標

在本章中,我們將:

  • 學習如何從曝光序列生成并顯示HDR圖像。
  • 使用曝光融合技術合并曝光序列。

理論基礎

高動態范圍成像(HDRI 或 HDR)是一種用于圖像和攝影的技術,能夠再現比標準數字成像或攝影技術更寬的亮度動態范圍。雖然人眼可以適應各種光照條件,但大多數成像設備每個通道僅使用8位,因此我們被限制在256個亮度級別內。當我們拍攝真實場景時,明亮區域可能會過度曝光,而黑暗區域則可能曝光不足,因此無法通過單次曝光捕捉所有細節。HDR成像使用每通道超過8位(通常為32位浮點值)的圖像,從而實現了更寬的動態范圍。

獲取HDR圖像有多種方法,最常見的是使用不同曝光值拍攝同一場景的照片。為了合并這些曝光圖像,了解相機的響應函數非常有用,并且有多種算法可以對其進行估計。HDR圖像合并后,需要將其轉換回8位才能在普通顯示器上查看,這一過程稱為色調映射。如果場景中的物體或相機在拍攝過程中移動,會帶來額外的復雜性,因為不同曝光的圖像需要進行配準和對齊。

本教程將展示兩種算法(Debevec、Robertson),用于從曝光序列生成并顯示HDR圖像,同時介紹一種稱為曝光融合(Mertens)的替代方法,該方法可直接生成低動態范圍圖像且無需曝光時間數據。此外,我們還將估計相機響應函數(CRF),這對許多計算機視覺算法具有重要價值。HDR流程的每個步驟都可以采用不同的算法和參數實現,具體可參考相關手冊了解全部選項。


曝光序列HDR

本教程我們將分析以下場景,其中包含4張不同曝光的圖像,曝光時間分別為:15秒、2.5秒、1/4秒和1/30秒。(您可以從Wikipedia下載這些圖像)


曝光序列示例


1、將曝光圖像加載到列表中

第一階段只需將所有圖像加載到一個列表中。此外,常規HDR算法還需要曝光時間參數。需特別注意數據類型:圖像應為單通道或三通道8位格式(np.uint8),而曝光時間需為float32類型且以秒為單位。

import cv2 as cv
import numpy as np# Loading exposure images into a list
img_fn = ["img0.jpg", "img1.jpg", "img2.jpg", "img3.jpg"]
img_list = [cv.imread(fn) for fn in img_fn]
exposure_times = np.array([15.0, 2.5, 0.25, 0.0333], dtype=np.float32)

2、將曝光序列合并為HDR圖像

在此階段,我們將曝光序列合并為一張HDR圖像,展示OpenCV中提供的兩種方法。第一種是Debevec算法,第二種是Robertson算法。需要注意的是,HDR圖像的類型是float32而非uint8,因為它包含了所有曝光圖像的全部動態范圍。

# Merge exposures to HDR image
merge_debevec = cv.createMergeDebevec()
hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy())
merge_robertson = cv.createMergeRobertson()
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())

3、色調映射HDR圖像

我們將32位浮點HDR數據映射到[0…1]范圍內。實際上,在某些情況下數值可能大于1或小于0,因此請注意后續需要對數據進行裁剪以避免溢出。

# Tonemap HDR image
tonemap1 = cv.createTonemap(gamma=2.2)
res_debevec = tonemap1.process(hdr_debevec.copy())

4、使用Mertens融合算法合并曝光圖像

這里我們展示一種替代算法來合并曝光圖像,該算法無需知道曝光時間。我們也不需要任何色調映射算法,因為Mertens算法直接給出了[0…1]范圍內的結果。

# Exposure fusion using Mertens
merge_mertens = cv.createMergeMertens()
res_mertens = merge_mertens.process(img_list)

5、轉換為8位并保存

為了保存或顯示結果,我們需要將數據轉換為[0…255]范圍內的8位整數。

# Convert datatype to 8-bit and save
res_debevec_8bit = np.clip(res_debevec*255, 0, 255).astype('uint8')
res_robertson_8bit = np.clip(res_robertson*255, 0, 255).astype('uint8')
res_mertens_8bit = np.clip(res_mertens*255, 0, 255).astype('uint8')cv.imwrite("ldr_debevec.jpg", res_debevec_8bit)
cv.imwrite("ldr_robertson.jpg", res_robertson_8bit)
cv.imwrite("fusion_mertens.jpg", res_mertens_8bit)

結果

可以看到不同的效果,但請注意每個算法都有額外的參數需要調整才能獲得理想結果。最佳實踐是嘗試不同方法,看看哪種最適合您的場景。


德貝維克方法:


低動態范圍圖像處理示例


羅伯遜方法:


低動態范圍圖像處理示例


Mertenes 融合算法:


融合效果示意圖


估計相機響應函數

相機響應函數(CRF)建立了場景輻射度與測量強度值之間的關聯關系。CRF在某些計算機視覺算法(包括HDR算法)中具有重要作用。本文我們將估計逆相機響應函數,并將其用于HDR圖像合成。

# Estimate camera response function (CRF)
cal_debevec = cv.createCalibrateDebevec()
crf_debevec = cal_debevec.process(img_list, times=exposure_times)
hdr_debevec = merge_debevec.process(img_list, times=exposure_times.copy(), response=crf_debevec.copy())
cal_robertson = cv.createCalibrateRobertson()
crf_robertson = cal_robertson.process(img_list, times=exposure_times)
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy(), response=crf_robertson.copy())

相機響應函數通過一個256維向量表示每個顏色通道。針對該序列,我們得到以下估計結果:


補充資源

1、Paul E Debevec 和 Jitendra Malik。從照片中恢復高動態范圍輻射圖。收錄于 ACM SIGGRAPH 2008 課程,第 31 頁。ACM,2008 年。[68]
2、Mark A Robertson、Sean Borman 和 Robert L Stevenson。通過多重曝光改善動態范圍。收錄于《圖像處理,1999 年國際會議論文集》,第 3 卷,第 159–163 頁。IEEE,1999 年。[228]
3、Tom Mertens、Jan Kautz 和 Frank Van Reeth。曝光融合。收錄于《計算機圖形與應用,2007 年太平洋會議》,第 382–390 頁。IEEE,2007 年。[189]
4、圖片來自 Wikipedia-HDR


練習

  1. 嘗試所有色調映射算法:cv::TonemapDragocv::TonemapMantiukcv::TonemapReinhard
  2. 嘗試修改HDR校準和色調映射方法中的參數

生成于 2025年4月30日 星期三 23:08:43 由 doxygen 1.12.0 生成


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

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

相關文章

APT32F1732RBT8愛普特微電子 32位MCU國產芯片 智能家居/工業控制 首選

APT32F1732RBT8 愛普特微電子,32位MCU國產芯片一、產品簡介APT32F1732RBT8 是愛普特微電子(APT)推出的高性能32位ARM Cortex-M0內核MCU,主頻高達48MHz,內置64KB Flash8KB RAM,專為智能家居、工業控制、消費…

Smart Tomcat

本篇博客的內容是教你借助idea中的插件,把tomcat集成到idea中安裝 Smart Tomcat 插件搜索下載 ,如果一直處于加載界面,就嘗試一下科學上網配置 Smart Tomcat 插件 點擊右上角的 "Add Configuration"選擇左側的 "Smart Tomcat" 在 Name 這一欄填寫一個名字(…

Linux_shell編寫

title: Linux_4 shell編寫 shell pwd (/root/A/2025_7/19/myshell) 首先需要設計命令行提示 (MakeCommandLine()) 首先獲取相關信息 getenv(“name”) // 獲取用戶名 const char* GetUserName() {const char* name getenv("USER");if (name …

【數據結構】棧的深入解析--用C語言實現

文章目錄1.棧的概念2.棧的底層結構3.棧的功能4.棧的實現4.1.棧結構的定義4.2.棧的初始化4.3.棧的銷毀4.4.入棧4.5.出棧4.6.取棧頂元素4.7.獲取棧中有效元素個數5.完整代碼Stack.hStack.cmain.c運行結果1.棧的概念 是一種特殊的線性表,只允許數據在固定的一段進行插…

Git倉庫核心概念與工作流程詳解:從入門到精通

Git倉庫的基本概念版本庫(Repository)是Git的核心概念,你可以簡單理解為一個被Git管理的目錄。這個目錄里的所有文件都能被Git跟蹤,記錄每次修改和刪除,讓你可以隨時追溯歷史或在未來某個時刻"還原"文件。Gi…

Web開發 05

1 React庫(人話詳解版)別慌,React 剛接觸時是會有點懵,咱們用 “人話 類比” 一步步拆:核心概念先抓牢組件(Component)把它想成 “樂高積木”,比如做個社交 App,頂部導航…

RustDesk 自建中繼服務器教程(Mac mini)

📖 教程目標 在家里的 Mac mini 上部署 RustDesk 中繼服務器 (hbbs hbbr),讓你從辦公室、筆電或手機 低延遲、安全 地遠程控制家里的 Windows 和 Mac mini。 ? 不依賴第三方服務器 ? 支持 P2P 和中繼雙模式 ? 全流量可控、跨平臺 🏗? 架…

數據庫—修改某字段默認值

前言有時候,數據庫的字段默認值沒有正確設置,這時候需要改默認值。以下是我做的改默認值的記錄,希望對網友有所幫助。1.SQL SERVER下面的示例假設你要修改名為 YourColumnName 的字段,并為其設置一個新的默認值 NewDefaultValue。…

Spring快速整合Mybatis

MyBatis是一個優秀的持久層框架&#xff0c;Spring則是廣泛使用的Java應用框架。可以將兩者整合可以充分發揮各自的優勢。 1、Spring整合MyBatis的基本配置 添加依賴&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spri…

基于深度學習的語音識別:從音頻信號到文本轉錄

前言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能領域中一個極具挑戰性和應用前景的研究方向。它通過將語音信號轉換為文本&#xff0c;為人們提供了更加自然和便捷的人機交互方式。近年來&#xff0c;深度學習技術在語音識別領域取得了顯著…

本地部署Nacos開源服務平臺,并簡單操作實現外部訪問,Windows 版本

Nacos 是一款阿里開源的動態服務發現、配置、管理平臺&#xff0c;擁有易于集成、高可用與可擴展等特點。它提供了動態服務注冊和發現能力&#xff0c;使得服務自動注冊到服務器并且消費真能夠發現提供者。本文將詳細介紹如何在本地安裝 Nacos &#xff0c;以及結合nat123端口映…

數據結構:反轉字符串(Reversing a String)

目錄 方法一&#xff1a;雙指針法 方法二&#xff1a;輔助數組 方法對比總結&#xff1a; 問題定義 給定一個字符串&#xff0c;例如&#xff1a; char str[] "hello";我們的目標是把它反轉成&#xff1a; "olleh"&#x1f4cc; 輸入特點&#xff…

Redis Copy-on-Write機制:

Copy-on-Write機制&#xff1a; 父子進程共享內存頁 當父進程修改數據時&#xff0c;內核會復制被修改的頁 這可能導致內存使用量暫時增加 通俗的話描述一下可以用一個生活中的例子來通俗解釋 Copy-on-Write&#xff08;寫時復制&#xff09; 機制&#xff1a;&#x1f4d6; 比…

iOS加固工具有哪些?從零源碼到深度混淆的全景解讀

在iOS安全加固領域&#xff0c;不同項目類型對保護需求有著本質差異&#xff1a;“我有源碼”與“我只有IPA”兩條路徑決定了你該用什么工具。本文將從 無需源碼處理整個IPA包 到 源碼級編譯期混淆&#xff0c;分層探討主流工具如何發揮價值&#xff0c;并附上適配方案建議。工…

Composer 可以通過指定 PHP 版本運行

是的&#xff0c;Composer 可以通過指定 PHP 版本運行&#xff0c;尤其是在服務器上有多個 PHP 版本時&#xff08;如 PHP 7.x 和 PHP 8.x&#xff09;。以下是幾種常見方法&#xff1a;方法 1&#xff1a;使用 php 命令指定版本 Composer 依賴系統中的 php 命令&#xff0c;因…

vscode文件顏色,只顯示自己更改的文件顏色

這個主要是因為你github git下來以后&#xff0c;用vscode打開會默認顯示更改了&#xff0c;你只要在這里先手動取消更改就行了&#xff0c;注意不要把你自己更改的取消了

記錄我coding印象比較深刻的BUG

4778&#xff1a;我的BUG噩夢問題描述&#xff1a;DAB播放中關ACC掉電后開ACC&#xff0c;手動切到FM/AM(有時第一次切換出現問題/有時第二次切換出現問題)&#xff0c;FM/AM不記憶關ACC前電臺或者FM/AM關ACC掉電后開ACC&#xff0c;手動切到DAB再回到FM/AM&#xff0c;FM/AM不…

Kubernetes集群中Istio mTLS握手失敗問題排查與解決方案

Kubernetes集群中Istio mTLS握手失敗問題排查與解決方案 在微服務架構中&#xff0c;Istio 提供了基于 Envoy 的服務網格能力&#xff0c;其中 mTLS&#xff08;雙向 TLS&#xff09;是確保服務間通信安全的重要機制。但在生產環境中&#xff0c;開發者常常會遇到 mTLS 握手失敗…

antd+react+可輸入的下拉選擇組件

該組件是一個可輸入的下拉選擇組件&#xff0c;支持從預設選項中選擇或手動輸入自定義值。組件基于 React 和 Ant Design 實現&#xff0c;具有良好的交互體驗和靈活的配置選項。 &#x1f9e0; 核心邏輯分析 1. 狀態管理 const [isInput, setIsInput] useState(false); con…

React 面試題庫

openAI React 面試題庫 以下題庫按模塊分類&#xff08;React 架構與運行機制、核心 API、Diff 算法與事件機制、Fiber 架構與調度、并發模式與過渡、生命周期及新版生命周期對照、綜合源碼題、擴展專題、React 與 Vue 對比&#xff09;&#xff0c;并按難度&#xff08;初級…