OpenCV圖像梯度、邊緣檢測、輪廓繪制、凸包檢測大合集

一、圖像梯度

在圖像處理中,「梯度(Gradient)」是一個非常基礎但又極其重要的概念。它是圖像邊緣檢測、特征提取、紋理分析等眾多任務的核心。梯度的本質是在空間上描述像素灰度值變化的快慢和方向。

但我們如何在圖像中計算梯度?又該選擇什么樣的算子?本文將從梯度的數學定義出發,逐步引入經典的 Sobel 與 Laplacian 算子,帶你了解圖像梯度的計算原理與實踐方式。

1.1 什么是圖像梯度?

圖像梯度反映的是像素值(灰度或強度)在空間中的變化率。可以類比為地形圖中的“坡度”:哪里灰度變化劇烈,哪里就是圖像的“邊緣”。

對于二維灰度圖像I(x,y)I(x,y)I(x,y),梯度定義為圖像對空間坐標的偏導數組成的向量:
?I=[?I?x,?I?y] \nabla I = \left[ \frac{\partial I}{\partial x}, \frac{\partial I}{\partial y} \right] ?I=[?x?I?,?y?I?]

  • ?I?x\frac{\partial I}{\partial x}?x?I?:表示圖像在水平方向(x軸)上的變化率;
  • ?I?y\frac{\partial I}{\partial y}?y?I?:表示圖像在垂直方向(y軸)上的變化率。

該向量的模長表示梯度的強度,方向表示灰度變化最劇烈的方向。

1.2 如何計算梯度

由于圖像是離散的,我們不能直接求導,而是通過離散卷積實現近似求導

使用cv2.filter2D自定義卷積核

OpenCV中filter2D可以對圖形施加自定義的卷積核,是實現梯度算子的基礎方法

語法如下所示:

dst = cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

filter2D函數是用于對圖像進行二維卷積(濾波)操作。它允許用戶自定義卷積核(kernal)來實現各種圖像處理效果,如平滑,銳化,邊緣檢測。

參數解析:

參數名類型說明
srcndarray輸入圖像,必須是單通道或多通道(如灰度圖或彩色圖)
ddepthint輸出圖像的深度(如 cv2.CV_64F, -1 表示與原圖相同)
kernelndarray卷積核(濾波器),必須是浮點型 np.float32np.float64
dstndarray(可選)輸出圖像,與 src 同大小
anchortuple卷積核錨點,默認 (-1, -1) 表示核中心
deltafloat可選偏移值,加到卷積結果上
borderTypeint邊界填充方式,常見如 cv2.BORDER_DEFAULT(邊界反射_101), cv2.BORDER_REPLICATE
import cv2 as cv
import numpy as np# 構造圖像:中心有明顯亮度突變
img = np.array([[10, 10, 10, 10, 10, 10, 10],[10, 10, 10, 255, 255, 10, 10],[10, 10, 10, 255, 255, 10, 10],[10, 10, 10, 255, 255, 10, 10],[10, 10, 10, 10, 10, 10, 10]
], dtype=np.uint8)# 使用 Sobel 水平方向邊緣檢測核
kernel = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]], dtype=np.float32)# 卷積
img2 = cv.filter2D(img, -1, kernel)print(img2)

結果展示:

[[  0   0 255 255   0   0   0][  0   0 255 255   0   0   0][  0   0 255 255   0   0   0][  0   0 255 255   0   0   0][  0   0 255 255   0   0   0]]

滑動卷積

1.3 常見的梯度算子

1?? Sobel 算子(Sobel Operator)

Sobel 是最常見的梯度算子之一,結合了高斯平滑微分運算,對噪聲更魯棒。

  • 水平方向梯度核:

Gx=[?101?202?101] Gx=\begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} Gx=??1?2?1?000?121??

  • 垂直方向梯度核:
    Gy=[?1?2?1000121] G_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} Gy?=??101??202??101??

在 OpenCV 中的實現:

語法說明:

dst = cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
參數名類型說明
srcndarray輸入圖像(通常為灰度圖)
ddepthint輸出圖像的數據深度(OpenCV 中,-1 表示輸出圖像的深度與輸入圖像相同。)
dxintx 方向求導階數(1 表示對 x 求一階導),獲取的垂直邊緣
dyinty 方向求導階數,獲取的水平邊緣
ksizeintSobel 核大小(可為 1, 3, 5, 7,常用 3)
scalefloat可選縮放因子,對導數結果進行縮放(一般為 1)
deltafloat可選偏移量,結果加上 delta(一般為 0)
borderTypeint邊界填充方式,默認 cv2.BORDER_DEFAULT

示例代碼:Sobel算子的使用

# sobel算子import cv2 as cvshudu = cv.imread('../images/shudu.png', cv.IMREAD_GRAYSCALE)# x方向
dst_x = cv.Sobel(shudu, -1, 1, 0, ksize=3)# y方向
dst_y = cv.Sobel(shudu, -1, 0, 1, ksize=3)# x和y方向
dst_xy = cv.Sobel(shudu, -1, 1, 1, ksize=3)cv.imshow('shudu', shudu)
cv.imshow('dst_x', dst_x)
cv.imshow('dst_y', dst_y)
cv.imshow('dst_xy', dst_xy)
cv.waitKey(0)
cv.destroyAllWindows()

結果輸出:

image-20250726152449232image-20250726152520688image-20250726152546696image-20250726152615977
灰度圖dx=1,dy=0(獲取垂直邊緣)dx=0,dy=1(獲取水平邊緣)dx=1,dy=1(不建議使用),用Laplacian來獲取水平垂直邊緣。

dxdy可以都為1,獲取的垂直和水平方向上的梯度。dxdy不能都為0。

  • grad_x: 圖像在 x 方向的梯度(橫向變化)
  • grad_y: 圖像在 y 方向的梯度(縱向變化)

我們可以將它們組成一個向量:
G?=(grad_x,?grad_y) \vec{G} = (grad\_x, \, grad\_y) G=(grad_x,grad_y)
然后,使用勾股定理計算這個向量的長度(也就是梯度強度):
magnitude=grad_x2+grad_y2 \text{magnitude} = \sqrt{grad\_x^2 + grad\_y^2} magnitude=grad_x2+grad_y2?


2?? Laplacian 算子(Laplacian Operator)

一、什么是 Laplacian 算子?

Laplacian(拉普拉斯算子)是二階微分算子,用于度量函數在某點處的“變化率的變化”,即函數曲率。

在圖像處理中,它能檢測圖像中灰度變化最顯著的地方——邊緣,尤其是亮度快速變化的區域,對噪聲也很敏感。

數學定義如下:
Δf=?2f?x2+?2f?y2 \Delta f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} Δf=?x2?2f?+?y2?2f?


🧮 二、從一維差分到二維卷積核
1. 一維差分

一階差分(梯度近似):
f′(x)≈f(x+1)?f(x) f'(x) \approx f(x+1) - f(x) f(x)f(x+1)?f(x)
二階差分(Laplacian 近似):
f′′(x)≈f(x+1)+f(x?1)?2f(x) f''(x) \approx f(x+1) + f(x-1) - 2f(x) f′′(x)f(x+1)+f(x?1)?2f(x)
對應的卷積核(差分模板)為:
k=[1,?2,1] k=[1,?2,1] k=[1,?2,1]


2. 推導二維 Laplacian 卷積核

對于二維函數 f(x,y)f(x,y)f(x,y)

水平方向二階導數:
?2f?x2≈f(x+1,y)+f(x?1,y)?2f(x,y) \frac{\partial^2 f}{\partial x^2} \approx f(x+1, y) + f(x-1, y) - 2f(x, y) ?x2?2f?f(x+1,y)+f(x?1,y)?2f(x,y)
垂直方向二階導數:
?2f?y2≈f(x,y+1)+f(x,y?1)?2f(x,y) \frac{\partial^2 f}{\partial y^2} \approx f(x, y+1) + f(x, y-1) - 2f(x, y) ?y2?2f?f(x,y+1)+f(x,y?1)?2f(x,y)
將它們相加:
Δf(x,y)≈f(x+1,y)+f(x?1,y)+f(x,y+1)+f(x,y?1)?4f(x,y) \Delta f(x, y) \approx f(x+1, y) + f(x-1, y) + f(x, y+1) + f(x, y-1) - 4f(x, y) Δf(x,y)f(x+1,y)+f(x?1,y)+f(x,y+1)+f(x,y?1)?4f(x,y)
這就是最常見的 4 鄰域 Laplacian 模板:
k=[0101?41010] k = \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix} k=?010?1?41?010??


3. 加上對角(斜對角)項:8 鄰域

如果你想讓算子對角方向也敏感,可以擴展為:
k=[1111?81111] k = \begin{bmatrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{bmatrix} k=?111?1?81?111??

這種核能更廣泛捕捉到不同方向的邊緣,但也更敏感。

OpenCV 使用方式:

cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
參數含義
src輸入圖像,必須是灰度圖
ddepth輸出圖像的深度,常用 cv2.CV_64F,避免溢出
ksize卷積核大小,必須是奇數,一般設為 1 表示使用標準核(上面那個)
scale縮放梯度值,默認 1
delta可選的偏移值,默認 0
borderType邊緣填充方式,默認 cv2.BORDER_DEFAULT

與 Sobel 不同,Laplacian 不區分方向,輸出的是一種方向無關的邊緣響應

示例代碼
# Laplacian算子
import cv2 as cvshudu = cv.imread('../images/shudu.png', cv.IMREAD_GRAYSCALE)# Laplacian算子
dst = cv.Laplacian(shudu, -1, ksize=1)
cv.imshow('shudu', shudu)
cv.imshow('dst', dst)
cv.waitKey(0)
cv.destroyAllWindows()
image-20250726161527158image-20250726161549023
灰度圖Laplacian算子

二、圖像邊緣檢測

2.1. 什么是圖像邊緣?

從數學角度來看,圖像邊緣是圖像灰度函數的一階導數(梯度)取得極大值的位置,或二階導數(Laplacian)為零的地方。

我們把二維圖像 f(x,y)f(x,y)f(x,y) 看作一個連續函數,圖像的變化速率(即灰度變化)就是它的梯度:
?f=(?f?x,?f?y) \nabla f = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right) ?f=(?x?f?,?y?f?)
梯度的模長即為邊緣強度:
∣?f∣=(?f?x)2+(?f?y)2 |\nabla f| = \sqrt{ \left( \frac{\partial f}{\partial x} \right)^2 + \left( \frac{\partial f}{\partial y} \right)^2 } ∣?f=(?x?f?)2+(?y?f?)2?


2. 2. 邊緣檢測的整體流程圖

原始圖像
高斯濾波\n去噪
Sobel卷積\n計算梯度與方向
非極大值抑制\n細化邊緣
雙閾值篩選\n連接邊緣
輸出邊緣圖像

2. 3. 高斯濾波去噪

邊緣檢測屬于一種“銳化”操作,容易放大噪聲。為此,第一步通常使用高斯濾波對圖像進行平滑處理,消除小范圍內的噪點干擾:

blur = cv2.GaussianBlur(img, (5, 5), 1.4)

高斯核示例(5x5):
1273[1474141626164726412674162616414741] \frac{1}{273} \begin{bmatrix} 1 & 4 & 7 & 4 & 1\\ 4 & 16 & 26 & 16 & 4\\ 7 & 26 & 41 & 26 & 7\\ 4 & 16 & 26 & 16 & 4\\ 1 & 4 & 7 & 4 & 1 \end{bmatrix} 2731??14741?41626164?72641267?41626164?14741??


2.4. Sobel算子計算梯度與方向

📌 Sobel 卷積核

用于計算圖像在水平與垂直方向上的一階導數:

  • 水平(x方向)

Gx=[?101?202?101] G_x = \begin{bmatrix} -1 & 0 & 1\\ -2 & 0 & 2\\ -1 & 0 & 1 \end{bmatrix} Gx?=??1?2?1?000?121??

  • 垂直(y方向)

Gy=[?1?2?1000121] G_y = \begin{bmatrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1 & 2 & 1 \end{bmatrix} Gy?=??101??202??101??

梯度值與方向

grad_x = cv2.Sobel(blur, cv2.CV_64F, 1, 0)
grad_y = cv2.Sobel(blur, cv2.CV_64F, 0, 1)
magnitude = cv2.magnitude(grad_x, grad_y)
angle = cv2.phase(grad_x, grad_y, angleInDegrees=True)
  • 梯度幅值(強度):

G=Gx2+Gy2 G = \sqrt{G_x^2 + G_y^2} G=Gx2?+Gy2??

  • 梯度方向:

θ=arctan?(GyGx) \theta = \arctan\left( \frac{G_y}{G_x} \right) θ=arctan(Gx?Gy??)


2.5. 非極大值抑制(NMS)

目的:只保留梯度方向上的局部極大值點,細化邊緣線條

步驟如下:

  1. 對于每一個像素,查找其在梯度方向上的鄰接像素。
  2. 如果當前像素的梯度值不是三者中最大的,就將其抑制為0。

為了比較非整數方向上的像素值,需要使用線性插值

得到θ\thetaθ的值之后,就可以對邊緣方向進行分類,為了簡化計算過程,一般將其歸為四個方向:水平方向、垂直方向、45°方向、135°方向。并且:

θ\thetaθ值為-22.5°~22.5°,或-157.5°~157.5°,則認為邊緣為水平邊緣;

當法線方向為22.5°~67.5°,或-112.5°~-157.5°,則認為邊緣為45°邊緣;

當法線方向為67.5°~112.5°,或-67.5°~-112.5°,則認為邊緣為垂直邊緣;

當法線方向為112.5°~157.5°,或-22.5°~-67.5°,則認為邊緣為135°邊緣;

image-20250726162939631


2.6. 雙閾值連接(Hysteresis)

非極大值抑制后,圖像中仍有很多邊緣片段。通過設定高低兩個閾值,連接可靠的邊緣:

  • 高于高閾值 → 強邊緣(保留)
  • 低于低閾值 → 弱邊緣(舍棄)
  • 介于之間 → 如果與強邊緣連接,則保留;否則丟棄

image-20250726163059933

推薦設置

edges = cv2.Canny(img, threshold1=50, threshold2=150)

閾值比建議控制在 2:1 到 3:1 之間。


2.7. Canny 算子:全流程封裝

OpenCV 內置的 Canny 算子封裝了所有步驟:

edges = cv2.Canny(image, 50, 150)

參數說明:

  • image: 輸入灰度/二值化圖像
  • threshold1: 低閾值,用于決定可能的邊緣點。
  • threshold2: 高閾值,用于決定強邊緣點。

2.8. 總結

步驟作用工具/算子
高斯濾波平滑圖像,去除噪聲cv2.GaussianBlur
梯度計算提取邊緣強度與方向cv2.Sobel
非極大值抑制邊緣細化自定義插值
雙閾值鏈接連接可靠邊緣,抑制偽邊緣cv2.Canny

三、圖像輪廓提取與繪制

圖像輪廓是計算機視覺中一個非常關鍵的概念,它廣泛應用于目標檢測、圖像分割、形狀分析等領域。

3.1 什么是輪廓(Contours)

輪廓是將具有相同灰度值的像素點連接成線的過程。在圖像中,輪廓通常用于表示物體的邊界或形狀。

? 輪廓與邊緣的區別:

  • 邊緣是強度變化的位置(如 Canny)
  • 輪廓是封閉的路徑,更強調形狀和結構
  • 邊緣可能是離散點,輪廓是連續曲線

示意圖:

image-20250726164247720


3.2 尋找輪廓的流程

輪廓提取的流程通常如下:

graph TD
A[彩色圖像] --> B[灰度化]
B --> C[二值化]
C --> D[查找輪廓 \n cv2.findContours()]

3.3 OpenCV 提供了非常方便的函數:

contours, hierarchy = cv2.findContours(image, mode, method)
3.3.1 參數說明:
參數說明
image輸入圖像,必須是二值圖像
mode輪廓檢索模式(如下表)
method輪廓逼近方法(如下表)
contours返回的輪廓點坐標數組列表
hierarchy返回輪廓間的層級結構

3.3.2 mode 參數解釋(輪廓層次結構)
mode 值含義
RETR_EXTERNAL只提取最外層輪廓(最常用)
RETR_LIST提取所有輪廓,但不構建父子關系
RETR_CCOMP提取所有輪廓,并將外層和內層分層保存
RETR_TREE提取所有輪廓并構建完整層次樹結構

層次結構說明圖(RETR_TREE):

hierarchy[i] = [next, previous, child, parent]

3.3.3 method 參數解釋(輪廓點存儲方式)
method 值含義
CHAIN_APPROX_NONE保存所有邊界點
CHAIN_APPROX_SIMPLE壓縮冗余點,只保留關鍵點(如直線只保留端點)
CHAIN_APPROX_TC89_L1使用 Teh-Chin 鏈碼逼近算法,效率更高(較少使用)

3.4 繪制輪廓

查找到輪廓后,可以使用以下函數將輪廓畫出來:

cv2.drawContours(image, contours, contourIdx, color, thickness)

參數說明

參數名含義
image輸入/輸出圖像(會被修改)
contours找到的輪廓點數組
contourIdx要繪制的輪廓索引(-1 表示繪制所有)
color輪廓線顏色(BGR)
thickness線條粗細,負值表示填充區域

3.5 實戰代碼示例:

import cv2 as cv
from socks import PRINTABLE_PROXY_TYPES# 讀取圖像
img = cv.imread('../images/num.png')# 轉換為灰度圖像
img_gray =cv.cvtColor(img,cv.COLOR_BGR2GRAY)#二值化
_,img_binary = cv.threshold(img_gray,127,255,cv.THRESH_BINARY_INV)# 尋找輪廓
counters,hierarchy = cv.findContours(img_binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)print(counters)
print(len(counters))
print('-------')
print(hierarchy)# 繪制輪廓
cv.drawContours(img,counters,-1,(0,255,0),3,cv.LINE_AA)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

image-20250726165323496


3.6 小貼士:輪廓查找注意事項

  • 🔸 輸入圖像必須為二值圖像(黑白),推薦使用 cv2.threshold()
  • 🔸 可以先做邊緣檢測(如 Canny),再輪廓提取。
  • 🔸 cv2.findContours() 會修改原圖像,最好用拷貝版本。
  • 🔸 drawContours() 可以搭配 boundingRect()minAreaRect() 等函數做目標框選。

3.7總結

步驟內容
1??灰度化原圖
2??二值化處理
3??使用 cv2.findContours 提取輪廓
4??使用 cv2.drawContours 繪制輪廓
5??可結合形狀分析、ROI 提取等進一步處理

四、繪制凸包

我們已經知道了如何獲取輪廓點(contours)以及如何通過 cv2.convexHull() 得到 凸包點集。接下來,我們通過繪圖的方式將凸包顯示出來。


4.1 算法特點

在計算幾何中,**窮舉法(Brute Force)QuickHull是兩種常見的凸包(Convex Hull)**構造算法,它們各有優缺點,適用于不同場景。下面為你簡要整理兩者特點,并通過表格進行對比:

1. 窮舉法(Brute Force)

原理
遍歷所有點對,判斷這條邊是否是凸包邊:即判斷所有其他點是否都在該邊的同一側。若是,則保留該邊。

特點

  • 算法思想簡單直觀
  • 時間復雜度較高O(n3)O(n^3)O(n3)
  • 適合教學/小規模數據集
  • 實現容易理解,但不適合大數據場景。

2. QuickHull 算法

原理
類似快速排序的分治思想。先找出最左和最右的兩個點作為“線段”,劃分上下兩部分遞歸尋找最外層點,逐步構造出凸包。

特點

  • 平均性能優良,時間復雜度大約為 O(nlog?n)O(n \log n)O(nlogn)
  • 適合中大型數據
  • 實現相對復雜,但效率更高;
  • 對輸入數據分布較敏感(最壞 O(n2)O(n^2)O(n2))。

函數一覽

函數功能
cv2.findContours()獲取輪廓點
cv2.convexHull()根據輪廓點獲取凸包點
cv2.polylines()根據點集繪制折線(或閉合多邊形)
# 獲取凸包點
import cv2 as cv# 讀取圖像
image_tu = cv.imread('../images/tu.png')# 轉換為灰度圖像
image_gray = cv.cvtColor(image_tu, cv.COLOR_BGR2GRAY)# 二值化處理
_,image_binary = cv.threshold(image_gray,127,255,cv.THRESH_BINARY)# 尋找輪廓
counters,_ = cv.findContours(image_binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)# 獲取凸包
convex_hull= []
for cnt in counters:convex_hull.append(cv.convexHull(cnt))cv.polylines(image_tu,convex_hull,True,(255,0,0),3,cv.LINE_AA)
cv.imshow('binary',image_binary)
cv.imshow('tu',image_tu)
cv.waitKey(0)
cv.destroyAllWindows()

4.4 結果效果

假設你的原始圖像中有一個不規則物體,該代碼會:

  • 提取其輪廓
  • 計算包住這個物體的最小凸多邊形(凸包)
  • 用線條將這個凸包標出

如圖所示:

image-20250726165945562


4.5 應用場景總結

應用領域使用場景
手勢識別識別手指個數:凸包與缺陷分析(defects)
目標檢測將不規則輪廓轉為規則包圍多邊形
圖像壓縮簡化輪廓特征
安全區域包圍任意散點區域

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

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

相關文章

GitHub 趨勢日報 (2025年07月25日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖1814Resume-Matcher985neko714Qwen3-Coder622OpenBB542BillionMail486hrms219hyper…

編程語言Java——核心技術篇(五)IO流:數據洪流中的航道設計

🌟 你好,我是 勵志成為糕手 ! 🌌 在代碼的宇宙中,我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光,在邏輯的土壤里生長成璀璨的銀河; 🛠? 每一個算法都是我繪制…

基于FPGA的16QAM軟解調+卷積編碼Viterbi譯碼通信系統,包含幀同步,信道,誤碼統計,可設置SNR

目錄 1.引言 2.算法仿真效果 3.算法涉及理論知識概要 3.1 16QAM調制軟解調原理 3.2 幀同步 3.3 卷積編碼,維特比譯碼 4.Verilog程序接口 5.參考文獻 6.完整算法代碼文件獲得 1.引言 基于FPGA的16QAM軟解調卷積編碼Viterbi譯碼通信系統開發,包含幀同步,高斯…

Python數據分析基礎(二)

一、Numpy 常用函數分類概覽函數類別常用函數基本數學函數np.sum(x)、np.sqrt(x)、np.exp(x)、np.log(x)、np.sin(x)、np.abs(x)、np.power(a, b)、np.round(x, n) 等統計函數np.mean(x)、np.median(x)、np.std(x)、np.var(x)、np.min(x)、np.max(x)、np.percentile(x, q) 等比…

Colab中如何臨時使用udocker(以MinIO為例)

本文主要是想記錄一下自己在Colab中用udocker啟動一個MinIO的容器的過程。 1. 命令行配置環境 由于目前沒有用到GPU,所以我選擇的是CPU的環境。(內存12G)然后就可以在命令行里安裝udocker了,并配置minio的環境 # 由于minio需要做兩個端口映射&#xff0c…

rt-thread 5.2.1 基于at-start-f437開發過程記錄

基于rt-thread 5.2.1 bsp/at/at32f437-start進行開發,記錄詳細過程,包括中間遇到的各種坑。 at32f437-start原理圖 自己設計的電路板主要換了一塊小封裝的同系列芯片, 目標是移植opENer。 1. 開發環境 env長時間不用,有點忘了。這次新下載…

EMCCD相機與電可調變焦透鏡的同步控制系統設計與實現

EMCCD相機與電可調變焦透鏡的同步控制系統設計與實現 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家,覺得好請收藏。點擊跳轉到網站。 摘要 本文詳細介紹了基于Python的EMCCD相機&#xff0…

前綴和-560.和為k的子數組-力扣(LeetCode)

一、題目解析1.子數組是數組中元素的連續非空序列2.nums[i]范圍為[-1000,1000],存在負數3.由于2的題目條件,該題不能用雙指針算法,不具備單調性 二、算法原理解法1:暴力解法->枚舉 O(N^2)固定一個值,向后枚舉數組和…

解決企業微信收集表沒有圖片、文件組件,不能收集圖片的問題

問題: 企業微信里面的收集表功能,有一個圖片收集的收集表,但是插入的組件沒有收集圖片的組件? 原因: 大概率是微盤未啟用 解決方法: 1、登陸企業微信管理后臺 企業微信 2、訪問微盤頁面,…

認識單片機

《認識單片機》課程內容 一、課程導入 在我們的日常生活中,有很多看似普通卻充滿智慧的小物件。比如家里的智能電飯煲,它能精準地控制煮飯的時間和溫度,讓米飯煮得香噴噴的;還有樓道里的聲控燈,當有人走過發出聲音時&a…

數據結構(2)順序表算法題

一、移除元素1、題目描述2、算法分析 思路1:查找val值對應的下標pos,執行刪除pos位置數據的操作。該方法時間復雜度為O(n^2),因此不建議使用。思路2:創建新數組(空間大小與原數組一致&#xff0…

汽車電子架構

本文試圖從Analog Devices官網中的汽車解決方案視角帶讀者構建起汽車電子的總體架構圖,為國內熱愛和從事汽車電子行業的伙伴們貢獻一份力量。 一 、汽車電子架構總覽 整個汽車電子包括四個部分:車身電子(Body Electronics)、座艙與…

pycharm 2025 專業版下載安裝教程【附安裝包】

安裝之前,請確保已經關閉所有安全軟件(如殺毒軟件、防火墻等)安裝包 👇鏈接:https://pan.xunlei.com/s/VOU-5_L1KOH5j3zDaaCh-Z28A1# 提取碼:6bjy下載 PyCharm2025專業版 安裝包 并 進行解壓運行 pycharm-2…

在 Java 世界里讓對象“旅行”:序列化與反序列化

Java 生態里關于 JSON 的序列化與反序列化(以下簡稱“序列化”)是一個久經考驗的話題,卻常因框架繁多、配置瑣碎而讓初學者望而卻步。本文將圍繞一段極簡的 JsonUtils 工具類展開,以 FastJSON 與 Jackson 兩大主流實現為例&#x…

High Speed SelectIO Wizard ip使用記錄

本次實驗的目的是通過VU9P開發板的6個TG接口,采用固定連接的方式,即X和X-維度互聯,其框圖如下所示:IP參數配置通過調用High Speed SelectIO Wizard來實現數據通路,High Speed SelectIO Wizard ip有24對數據通道&#x…

Execel文檔批量替換標簽實現方案

問題背景需求:俺現網班級作為維度,批量導出每個班級學員的數據,excel的個數在1k左右,每一張表的人數在90左右。導出總耗時在10小時左右。代碼編寫完成并導出現網數據后,發現導出的標題錯了。解決方案1.通過修改代碼&am…

SpringBoot配置多數據源多數據庫

Springboot支持配置多數據源。默認情況,在yml文件中只會配置一個數據庫。如果涉及到操作多個數據庫的情況,在同實例中(即同一個ip地址下的不同數據庫),可以采用數據庫名點數據庫表的方式,實現跨庫表的操作。…

Rocky9.4部署Zabbix7

一、配置安裝源 rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-7.0-5.el9.noarch.rpm ? yum clean all 二、安裝Zabbix server,Web前端,agent yum install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf z…

【Java】對象類型轉換(ClassCastException)異常:從底層原理到架構級防御,老司機的實戰經驗

在開發中,ClassCastException(類轉換異常)就像一顆隱藏的定時炸彈,常常在代碼運行到類型轉換邏輯時突然爆發。線上排查問題時,這類異常往往因為類型關系復雜而難以定位。多數開發者習慣于在轉換前加個instanceof判斷就…

探路者:用 AI 面試加速人才集結,為戶外愛好者帶來更專業的服務

作為深耕戶外用品領域的知名品牌,探路者已構建起覆蓋全國的銷售服務網絡,上千品種的產品矩陣更是為品牌在市場中站穩腳跟提供了有力支撐。對探路者來說,要持續為戶外愛好者帶來專業且貼心的體驗,專業人才是核心支撐。然而&#xf…