一、概述
1.計算機視覺的定義
計算機視覺(Computer Vision)是一個跨學科的研究領域,主要涉及如何使計算機能夠通過處理和理解數字圖像或視頻來自動進行有意義的分析和決策。其目標是使計算機能夠從視覺數據中獲取高層次的理解,類似于人類的視覺處理能力。
具體來說,計算機視覺包括以下幾個主要任務:
圖像分類:識別圖像中主要的物體或場景。例如,給定一張圖片,確定它是貓還是狗。
目標檢測:在圖像中定位和識別多個目標。例如,在街景圖像中識別并標注汽車、行人和交通標志的位置。
圖像分割:將圖像分割成不同的區域或對象。例如,將一張醫療影像分割成不同的器官和組織。
姿態估計:識別和分析人體或物體的姿態。例如,識別人類骨骼的關鍵點位置以估計其動作。
場景理解:從圖像中理解更復雜的場景信息,包括物體之間的關系和背景環境。
三維重建:從二維圖像中恢復三維結構信息。例如,從多張二維圖片生成一個三維模型。
動作識別:從視頻中識別和分類動作。例如,識別視頻中人物是否在走路、跑步或跳舞。
計算機視覺技術在許多領域有廣泛的應用,包括但不限于自動駕駛、醫療影像分析、人臉識別、監控系統、增強現實和虛擬現實、機器人技術以及智能制造。
為了實現這些目標,計算機視覺結合了多種技術和方法,包括但不限于圖像處理、模式識別、機器學習和深度學習等。近年來,隨著深度學習尤其是卷積神經網絡(CNN)的發展,計算機視覺技術取得了顯著的進展,顯著提高了在圖像和視頻分析任務中的性能。
2.計算機視覺的應用/任務
計算機視覺在許多領域有廣泛的應用,涵蓋了從日常生活到高科技工業的各個方面。以下是一些主要的應用和任務:
1. 自動駕駛
目標檢測和識別:識別道路上的車輛、行人、交通標志和其他障礙物。
車道檢測:檢測道路上的車道線,幫助車輛保持在正確的車道內。
路徑規劃:根據周圍環境的變化規劃行駛路線。
2. 醫療影像分析
圖像分割:分割醫學影像中的不同器官和病變區域,如腫瘤檢測。
診斷輔助:輔助醫生對X光片、CT掃描、MRI影像等進行診斷。
手術導航:在手術過程中提供實時的影像指導。
3. 安防監控
人臉識別:用于身份驗證和監控,識別人臉并匹配數據庫中的身份信息。
行為分析:檢測和分析人群行為,識別潛在的異常或危險行為。
入侵檢測:檢測并報警未授權的進入。
4. 零售和電子商務
產品識別:識別商品并進行分類,用于庫存管理和推薦系統。
虛擬試穿:通過增強現實技術,顧客可以虛擬試穿衣服或配飾。
客戶分析:通過攝像頭分析顧客的行為和購物模式,以優化店鋪布局和營銷策略。
5. 工業自動化
質量檢測:檢測生產線上產品的缺陷,如裂縫、瑕疵和尺寸偏差。
機器人引導:為工業機器人提供視覺導航,執行復雜的組裝和操作任務。
自動化監控:監控生產過程,檢測異常情況并及時報警。
6. 智能家居
人臉識別:用于智能門鎖、安防系統和用戶個性化服務。
姿態識別:識別用戶的姿態和動作,用于控制家電設備或提供健康監測。
環境監測:通過攝像頭監測家居環境,檢測火災、煙霧或水泄漏等情況。
7. 文檔處理
光學字符識別(OCR):將掃描的文檔或圖片中的文字轉換為可編輯的文本。
表單識別和處理:自動識別和提取表單中的信息,用于數據錄入和管理。
手寫體識別:識別和轉換手寫文字為數字文本。
8. 娛樂和媒體
視頻編輯:自動標記和剪輯視頻中的精彩片段,生成視頻摘要。
特效制作:在電影和電視制作中添加視覺特效和動畫。
增強現實(AR)和虛擬現實(VR):為游戲和娛樂應用提供沉浸式體驗。
9. 農業和環境監測
作物監測:通過無人機和衛星圖像監測農作物的生長情況和健康狀態。
害蟲檢測:識別農作物上的病害和害蟲,提供早期預警和防治措施。
環境保護:監測森林、河流和海洋的生態環境,檢測污染和自然災害。
這些應用展示了計算機視覺在不同領域的廣泛潛力和實際價值。隨著技術的不斷進步,計算機視覺的應用范圍和深度將會進一步擴展。
二、圖像處理基本操作
1.圖像存儲在矩陣中,其中每個元素代表像素值
2.圖像的表示:二值圖像,灰度圖,RGB圖
3.常見顏色空間
HSV
HSV(Hue, Saturation, Value)是色彩空間的一種,它將顏色表示為色調(Hue)、飽和度(Saturation)和明度(Value)。這種表示方法與人類對顏色的感知更接近,因此在圖像處理和計算機視覺中被廣泛使用。下面是對HSV色彩空間的詳細解釋:
1. 色調 (Hue)
色調表示顏色的類型,范圍通常在0到360度。
每個角度對應一種顏色:0度為紅色,120度為綠色,240度為藍色。
色調環繞一圈形成一個色環。
2. 飽和度 (Saturation)
飽和度表示顏色的純度或灰度成分的多少。
范圍從0到1(或0%到100%)。
0表示完全沒有顏色(灰色),1表示完全純色。
3. 明度 (Value)
明度表示顏色的亮度或強度。
范圍從0到1(或0%到100%)。
0表示最暗(黑色),1表示最亮(白色或最亮的顏色)。
4.優勢
直觀:HSV色彩空間更符合人類對顏色的感知方式。
靈活:在進行顏色篩選和調整時,HSV比RGB更方便。
5.應用場景
圖像分割:通過色調篩選特定顏色。
顏色校正:調整飽和度和明度以改善圖像質量。
增強現實:在實時視頻處理中使用色調分割對象。
HSV色彩空間在圖像處理和計算機視覺中具有廣泛的應用和實用性,尤其適合需要處理和分析顏色的任務。
YUV
YUV是一種顏色表示方法,廣泛應用于視頻壓縮、圖像處理和傳輸中。它將顏色信息分解為亮度(Y)和色度(U和V)分量。與RGB色彩空間不同,YUV分離了圖像的亮度和色度信息,便于在圖像處理和視頻壓縮中進行高效處理。
1. 分量介紹
Y(Luminance):亮度分量,表示圖像的明暗程度。這個分量包含了圖像的灰度信息。
U(Chrominance - Blue Projection):色度分量之一,表示藍色的投影。
V(Chrominance - Red Projection):色度分量之一,表示紅色的投影。
2. 優勢
分離亮度和色度:YUV分離了亮度和色度信息,使得在視頻壓縮和傳輸中可以優先保留更多的亮度信息,而降低色度信息的精度,從而減少數據量。
兼容性:YUV色彩空間與黑白電視信號兼容,確保在彩色電視上播放時可以兼容黑白電視。
3. 應用場景
視頻壓縮:許多視頻壓縮標準(如MPEG、H.264)都使用YUV色彩空間,因為它能更好地壓縮視頻數據。
圖像處理:在圖像處理中,可以獨立處理亮度和色度分量,提高處理效率和效果。
電視廣播:YUV色彩空間在模擬和數字電視廣播中被廣泛使用。
4.總結
YUV色彩空間通過將顏色分解為亮度和色度分量,提供了一種高效的顏色表示方法。它在視頻壓縮、圖像處理和傳輸中具有廣泛的應用,尤其適用于需要處理和優化亮度和色度信息的場景。
4.圖像平滑:均值濾波、中值濾波、低通濾波(允許低頻分量通過,高平分量濾除)
圖像平滑是一種區域增強的算法,主要目的是通過減少圖像中的高頻噪聲來改善圖像的質量。能夠減少甚至消除噪聲并保持高頻邊緣信息是圖像平滑算法追求的目標。
均值濾波(Mean Filtering)
均值濾波(Mean Filtering),也稱為平均濾波,是一種簡單且常用的圖像平滑技術,用于減少圖像中的噪聲。其基本思想是通過用局部鄰域內像素的平均值替換中心像素值來達到平滑效果。這種方法在平滑圖像的同時,可以有效地保留圖像的主要特征。
4. 優點和缺點
優點:
簡單易實現:均值濾波算法簡單,計算開銷低。
平滑效果好:能夠有效地去除圖像中的高頻噪聲。
缺點:
模糊邊緣:由于計算均值時考慮了周圍所有像素,圖像的邊緣和細節部分可能會被模糊。
不適用于脈沖噪聲:對于含有脈沖噪聲的圖像,均值濾波可能無法有效去噪,反而可能擴散噪聲。
5. 應用場景
噪聲去除:均值濾波廣泛用于圖像預處理,去除隨機噪聲。
圖像平滑:在圖像處理中,均值濾波常用于平滑圖像,以減少圖像中的細節或進行圖像分割前的預處理。
均值濾波作為一種基礎的圖像處理技術,在圖像預處理和噪聲去除中具有廣泛的應用。然而,對于某些應用場景,如邊緣保留和去除脈沖噪聲,可能需要使用更高級的濾波技術,如中值濾波或雙邊濾波。
中值濾波(Median Filtering)
中值濾波(Median Filtering)是一種常用的非線性濾波技術,用于去除圖像中的噪聲,同時保留圖像的邊緣信息。它在處理椒鹽噪聲(salt-and-pepper noise)方面特別有效。中值濾波的基本思想是用鄰域內像素值的中值替換中心像素值,從而減少噪聲的影響。
1. 基本原理
3. Python 示例
使用Python和OpenCV實現中值濾波:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取灰度圖像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 應用中值濾波
kernel_size = 5
filtered_image = cv2.medianBlur(image, kernel_size)
# 顯示原始圖像和中值濾波后的圖像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title(f'Median Filtered Image (Kernel Size: {kernel_size}x{kernel_size})')
plt.imshow(filtered_image, cmap='gray')
plt.axis('off')
plt.show()
4. 優點和缺點
優點:
保留邊緣:中值濾波在去噪的同時,能夠很好地保留圖像的邊緣信息。
有效去除脈沖噪聲:特別適用于去除椒鹽噪聲和其他類似的脈沖噪聲。
缺點:
計算復雜度較高:由于需要對窗口內的像素進行排序,中值濾波的計算復雜度高于均值濾波。
不適用于高斯噪聲:對于高斯噪聲,中值濾波的效果可能不如高斯濾波。
5. 應用場景
噪聲去除:中值濾波廣泛用于去除圖像中的椒鹽噪聲和其他類似的脈沖噪聲。
圖像預處理:在圖像分割、邊緣檢測等圖像處理任務中,中值濾波常用于平滑圖像,同時保留重要的邊緣信息。
中值濾波作為一種非線性濾波技術,在去除脈沖噪聲和保留邊緣信息方面具有顯著優勢。雖然計算復雜度較高,但在許多實際應用中,中值濾波仍然是非常有效的選擇。
低通濾波器(Low-Pass Filter)
低通濾波器(Low-Pass Filter)是一種允許低頻信號通過并阻止高頻信號的濾波器。它在圖像處理中的主要作用是平滑圖像,減少圖像中的高頻噪聲,同時保留圖像中的低頻信息。低通濾波器在邊緣檢測、圖像降噪和圖像重采樣等領域中有廣泛的應用。
1. 低通濾波的基本原理
在圖像處理中,低通濾波的基本思想是將圖像的高頻成分(如噪聲、細節等)進行衰減,而保留圖像的低頻成分(如整體的光滑區域)。這可以通過空間域或頻域來實現。
空間域中的低通濾波
在空間域中,低通濾波通常通過卷積操作實現,常用的低通濾波器包括均值濾波器和高斯濾波器。
均值濾波器(Mean Filter):使用鄰域內像素的平均值替代中心像素值。
高斯濾波器(Gaussian Filter):使用加權平均值替代中心像素值,其中權重由高斯分布決定。
頻域中的低通濾波
2. 數學表示
3. Python 示例
以下是使用Python和OpenCV實現低通濾波的示例:
使用均值濾波器(空間域)
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 應用均值濾波
kernel_size = 5
mean_filtered_image = cv2.blur(image, (kernel_size, kernel_size))
# 顯示原始圖像和均值濾波后的圖像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title(f'Mean Filtered Image (Kernel Size: {kernel_size}x{kernel_size})')
plt.imshow(mean_filtered_image, cmap='gray')
plt.axis('off')
plt.show()
使用高斯濾波器(空間域)
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 應用高斯濾波
kernel_size = 5
sigma = 1.0
gaussian_filtered_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
# 顯示原始圖像和高斯濾波后的圖像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title(f'Gaussian Filtered Image (Kernel Size: {kernel_size}x{kernel_size}, Sigma: {sigma})')
plt.imshow(gaussian_filtered_image, cmap='gray')
plt.axis('off')
plt.show()
使用低通濾波器(頻域)
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 進行傅里葉變換
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 創建低通濾波器
rows, cols = image.shape
crow, ccol = rows // 2 , cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
r = 30 # 低通濾波器的半徑
center = [crow, ccol]
x, y = np.ogrid[:rows, :cols]
mask_area = (x - center[0])**2 + (y - center[1])**2 <= r*r
mask[mask_area] = 1
# 應用濾波器并進行逆傅里葉變換
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 顯示原始圖像和低通濾波后的圖像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title('Low-Pass Filtered Image (Frequency Domain)')
plt.imshow(img_back, cmap='gray')
plt.axis('off')
plt.show()
4. 優點和缺點
優點:
減少噪聲:有效去除圖像中的高頻噪聲。
平滑圖像:使圖像變得更加平滑,適合在圖像分割和特征提取之前使用。
缺點:
模糊細節:會模糊圖像中的細節和邊緣。
不適用于所有噪聲類型:對于某些類型的噪聲(如低頻噪聲),效果不佳。
5. 應用場景
圖像降噪:在去除圖像中的隨機噪聲時使用。
圖像平滑:在圖像分割、邊緣檢測等處理之前對圖像進行平滑處理。
信號處理:在音頻和通信信號處理中,用于濾除高頻干擾信號。
低通濾波器作為一種基本的圖像處理工具,在去除噪聲和平滑圖像方面具有廣泛的應用。然而,在使用時需要注意它可能帶來的圖像模糊問題,并根據具體應用選擇合適的濾波器和參數。
5.圖像銳化:高通濾波(加強圖像的邊緣)
高通是圖像銳化 低通圖像平滑
? 在圖像的判讀或識別中常需要突出邊緣和輪廓信息,而圖像銳化處理的目的是加
強圖像中景物的邊緣和輪廓,使模糊圖像變得更清晰。
? 圖像模糊的可能是因為圖像受到平均或積分運算,因此對圖像采用逆運算。例
如對連續圖像微分或對離散圖像差分運算,即可使模糊圖像的質量得到改善。
? 從頻率域角度看,圖像的模糊是因為高頻分量受到衰減,所以采用合適的高通
濾波器也可以使圖像的清晰度增加
三、圖形去噪/邊緣檢測/深度學習基礎
1.常見圖像噪聲:高斯噪聲、椒鹽噪聲、脈沖噪聲
噪聲的特點是什么
噪聲在圖像處理和信號處理中是一個常見的概念,它具有幾個基本特點,包括以下幾點:
1.隨機性(隨機分布):
噪聲是在信號或圖像中無規律地出現的不希望的信號成分。它通常由于環境、傳感器本身的限制、傳輸過程中的干擾等因素引入。
噪聲的分布通常是隨機的,沒有明顯的可預測模式,如白噪聲和高斯噪聲。
2.無用信息(非信息性):
噪聲是與所需信號或圖像信息無關的信號成分,它不包含任何有用的信息,通常會干擾或模糊真實數據的內容。
3. 影響信號質量:
噪聲會降低信號或圖像的質量,使得原始信息變得不清晰或難以識別。
在圖像中,噪聲可能表現為像素的隨機變化,使圖像看起來粗糙或不連續。
4. 多樣性:
噪聲可以有多種形式和來源,如椒鹽噪聲(隨機黑白像素)、高斯噪聲(服從高斯分布的隨機變化)等。
每種類型的噪聲可能需要不同的處理方法來有效降低其對信號或圖像的影響。
5.波動性:
噪聲的強度和分布通常會隨著時間或空間的變化而波動,這使得在處理中需要考慮噪聲的動態特性。
在圖像處理中,理解噪聲的特點對于選擇合適的去噪方法和優化處理步驟至關重要。不同類型的噪聲可能需要不同的處理策略,以在保留盡可能多有用信息的同時有效降低噪聲水平。
常見圖像噪聲:
? 椒鹽噪聲:黑色像素和白色像素隨機出現,椒鹽噪聲也稱為脈沖噪聲
? 脈沖噪聲:白色像素隨機出現
? 高斯噪聲:噪聲強度變化服從高斯分布
2.圖像去噪流程,如高斯噪聲(高斯平滑),椒鹽噪聲(中值濾波)(綜合題)
(1)高斯噪聲
高斯噪聲(Gaussian Noise)是圖像處理和信號處理中的常見問題,去除高斯噪聲的過程稱為去噪。以下是一個標準的高斯噪聲去噪流程:
1. 圖像預處理
在進行去噪之前,首先需要對圖像進行預處理。這可能包括:
灰度化:如果圖像是彩色的,可以先將其轉換為灰度圖像。
歸一化:將像素值歸一化到0-1范圍內,以便后續處理。
2. 選擇去噪方法
去除高斯噪聲的方法有很多種,常用的包括:
3. 應用去噪方法
根據選擇的去噪方法,對圖像進行處理。一般步驟包括:
構建濾波器:根據選擇的濾波器構建濾波器核或函數。
應用濾波器:將濾波器應用到圖像上,得到去噪后的圖像。
4. 后處理
去噪后,可以進行一些后處理來提高圖像質量:
對比度調整:調整圖像的對比度,使得細節更明顯。
銳化處理:增強圖像的邊緣和細節。
5. 評價去噪效果
通過一些評價指標來判斷去噪效果,例如:
峰值信噪比(PSNR):評估去噪后圖像的質量。
結構相似性(SSIM):評估去噪后圖像與原圖像的相似性。
示例代碼
以下是一個簡單的Python代碼示例,使用OpenCV進行高斯噪聲的去噪:
import cv2
import numpy as np
# 讀取圖像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 高斯濾波去噪
denoised_image = cv2.GaussianBlur(image, (5, 5), 1.5)
# 顯示結果
cv2.imshow('Original Image', image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
通過以上步驟和代碼,可以實現高斯噪聲的有效去除,從而提高圖像的質量。不同的方法適用于不同的場景,需要根據實際情況選擇合適的去噪方法。
(2)椒鹽噪聲
椒鹽噪聲(Salt-and-Pepper Noise)是一種常見的圖像噪聲,表現為圖像中出現隨機的黑白像素點。去除椒鹽噪聲的過程可以通過多種方法實現。以下是一個詳細的椒鹽噪聲去噪流程:
1. 圖像預處理
在進行去噪之前,首先需要對圖像進行預處理,這可能包括:
灰度化:如果圖像是彩色的,可以先將其轉換為灰度圖像。
歸一化:將像素值歸一化到0-1范圍內,以便后續處理。
2. 選擇去噪方法
去除椒鹽噪聲的方法有多種,常用的包括:
3. 應用去噪方法
根據選擇的去噪方法,對圖像進行處理。一般步驟包括:
構建濾波器:根據選擇的濾波器構建濾波器核或函數。
應用濾波器:將濾波器應用到圖像上,得到去噪后的圖像。
4. 后處理
去噪后,可以進行一些后處理來提高圖像質量:
對比度調整:調整圖像的對比度,使得細節更明顯。
銳化處理:增強圖像的邊緣和細節。
5. 評價去噪效果
通過一些評價指標來判斷去噪效果,例如:
峰值信噪比(PSNR):評估去噪后圖像的質量。
結構相似性(SSIM):評估去噪后圖像與原圖像的相似性。
示例代碼
以下是一個簡單的Python代碼示例,使用OpenCV進行椒鹽噪聲的去噪:
import cv2
import numpy as np
# 讀取圖像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 添加椒鹽噪聲
def add_salt_and_pepper_noise(image, prob):
noisy = np.copy(image)
num_salt = np.ceil(prob * image.size * 0.5)
num_pepper = np.ceil(prob * image.size * 0.5)
# 添加鹽噪聲
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
noisy[coords[0], coords[1]] = 1
# 添加胡椒噪聲
coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
noisy[coords[0], coords[1]] = 0
return noisy
noisy_image = add_salt_and_pepper_noise(image, 0.05)
# 中值濾波去噪
denoised_image = cv2.medianBlur(noisy_image, 3)
# 顯示結果
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
通過以上步驟和代碼,可以有效地去除椒鹽噪聲,從而提高圖像的質量。不同的方法適用于不同的場景,需要根據實際情況選擇合適的去噪方法。
3.邊緣檢測流程,如canny邊緣檢測(綜合題)
邊緣檢測是圖像處理中的一種重要技術,用于識別圖像中的邊緣。邊緣是圖像中灰度變化顯著的區域,通常對應物體的邊界。以下是一個標準的邊緣檢測步驟:
1. 圖像預處理
在進行邊緣檢測之前,通常需要對圖像進行預處理。這些預處理步驟可能包括:
灰度化:將彩色圖像轉換為灰度圖像,以簡化處理。
平滑處理:使用高斯濾波等方法對圖像進行平滑處理,減少噪聲對邊緣檢測的影響。
import cv2
# 讀取彩色圖像
image = cv2.imread('image.jpg')
# 轉換為灰度圖像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用高斯濾波進行平滑處理
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 1.5)
2. 計算梯度
計算圖像的梯度以獲取邊緣信息。常用的方法有Sobel算子、Prewitt算子和Roberts算子等。梯度算子會計算圖像在x和y方向的導數。
# 使用Sobel算子計算梯度
grad_x = cv2.Sobel(blurred_image, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(blurred_image, cv2.CV_64F, 0, 1, ksize=3)
# 計算梯度幅值和方向
magnitude = cv2.magnitude(grad_x, grad_y)
angle = cv2.phase(grad_x, grad_y, angleInDegrees=True)
3. 非極大值抑制
非極大值抑制用于細化邊緣,通過保留局部最大值并抑制其他值,使得邊緣更加清晰。
def non_maximum_suppression(magnitude, angle):
row, col = magnitude.shape
suppressed = np.zeros((row, col), dtype=np.float32)
angle = angle % 180
for i in range(1, row-1):
for j in range(1, col-1):
q = 255
r = 255
# 根據梯度方向選擇比較的像素
if (0 <= angle[i, j] < 22.5) or (157.5 <= angle[i, j] <= 180):
q = magnitude[i, j+1]
r = magnitude[i, j-1]
elif 22.5 <= angle[i, j] < 67.5:
q = magnitude[i+1, j-1]
r = magnitude[i-1, j+1]
elif 67.5 <= angle[i, j] < 112.5:
q = magnitude[i+1, j]
r = magnitude[i-1, j]
elif 112.5 <= angle[i, j] < 157.5:
q = magnitude[i-1, j-1]
r = magnitude[i+1, j+1]
# 保留局部最大值
if (magnitude[i, j] >= q) and (magnitude[i, j] >= r):
suppressed[i, j] = magnitude[i, j]
else:
suppressed[i, j] = 0
return suppressed
suppressed_image = non_maximum_suppression(magnitude, angle)
4. 雙閾值處理
雙閾值處理用于進一步篩選邊緣,通過設置高閾值和低閾值,將邊緣分為強邊緣、弱邊緣和非邊緣。
# 設置高閾值和低閾值
high_threshold = suppressed_image.max() * 0.09
low_threshold = high_threshold * 0.5
# 應用雙閾值
strong_edges = (suppressed_image > high_threshold)
weak_edges = ((suppressed_image >= low_threshold) & (suppressed_image <= high_threshold))
# 初始化輸出圖像
edges = np.zeros_like(suppressed_image)
edges[strong_edges] = 255
edges[weak_edges] = 75
5. 邊緣連接
連接弱邊緣和強邊緣,確保弱邊緣連接到強邊緣才被保留。
def edge_tracking(edges, weak=75, strong=255):
row, col = edges.shape
for i in range(1, row-1):
for j in range(1, col-1):
if edges[i, j] == weak:
# 檢查8鄰域是否有強邊緣
if ((edges[i+1, j-1] == strong) or (edges[i+1, j] == strong) or (edges[i+1, j+1] == strong)
or (edges[i, j-1] == strong) or (edges[i, j+1] == strong)
or (edges[i-1, j-1] == strong) or (edges[i-1, j] == strong) or (edges[i-1, j+1] == strong)):
edges[i, j] = strong
else:
edges[i, j] = 0
return edges
final_edges = edge_tracking(edges)
6. 顯示結果
顯示原始圖像和處理后的邊緣檢測結果。
cv2.imshow('Original Image', image)
cv2.imshow('Edges', final_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
通過上述步驟,可以有效地進行邊緣檢測。常用的邊緣檢測算法包括Canny邊緣檢測、Sobel邊緣檢測和Laplacian邊緣檢測,其中Canny邊緣檢測結合了上述多個步驟,效果較好。
Canny
Canny邊緣檢測是一種廣泛使用的邊緣檢測算法,旨在提取圖像中的邊緣特征。其主要步驟如下:
高斯濾波 (Gaussian Filtering):
計算梯度 (Gradient Calculation):
使用Sobel算子計算圖像的梯度強度和方向。Sobel算子分別在水平方向(Gx)和垂直方向(Gy)上計算梯度。
非極大值抑制 (Non-maximum Suppression):
在梯度方向上對梯度強度進行抑制,只保留局部最大值,以細化邊緣,使邊界更清晰。具體步驟包括:
對每個像素,沿梯度方向檢查兩個相鄰像素的梯度強度。
如果當前像素的梯度強度大于相鄰像素的梯度強度,則保留,否則抑制為0。
雙閾值檢測 (Double Thresholding):
使用兩個閾值(低閾值和高閾值)進一步過濾邊緣。
如果像素的梯度強度大于高閾值,則被認為是強邊緣。
如果像素的梯度強度介于低閾值和高閾值之間,則被認為是弱邊緣。
如果像素的梯度強度小于低閾值,則被抑制為非邊緣。
邊緣連接 (Edge Tracking by Hysteresis):
通過連接弱邊緣和強邊緣來形成最終的邊緣。
從強邊緣像素開始,沿著梯度方向搜索弱邊緣,如果連接到強邊緣,則將弱邊緣視為真實邊緣。
總結來說,Canny邊緣檢測算法通過這五個步驟實現了對圖像邊緣的準確檢測,減少了噪聲的影響,精確地定位邊緣,并通過雙閾值和邊緣連接步驟保證了邊緣檢測的連貫性。
4.全連接神經網絡結構:輸入層、隱藏層、輸出層
全聯接網絡的輸出層什么的。設計一下手寫字,激活函數選擇 結構圖畫出
全連接神經網絡(Fully Connected Neural Network, FCNN)是一種基礎的神經網絡結構,由輸入層、隱藏層和輸出層組成。每一層中的神經元與前一層的所有神經元相連接。以下是各個層的詳細介紹:
1. 輸入層(Input Layer)
輸入層是神經網絡的第一層,它接受外部數據并將其傳遞給網絡的下一層。輸入層的神經元數量取決于輸入數據的特征數量。例如,如果輸入的是一個28x28像素的灰度圖像,輸入層將有784個神經元(28x28=784)。
2. 隱藏層(Hidden Layers)
隱藏層位于輸入層和輸出層之間,可以有一個或多個隱藏層。每一層中的神經元通過權重與前一層的所有神經元相連接。隱藏層的作用是通過激活函數引入非線性,使網絡能夠學習和表示復雜的模式和特征。
a. 權重和偏置(Weights and Biases)
每個連接都有一個權重,用于調整輸入信號的強度。每個神經元還有一個偏置,用于調整激活函數的輸出。
b. 激活函數(Activation Function)
每個隱藏層的神經元通常使用非線性激活函數,如ReLU、Sigmoid、Tanh等,以引入非線性并使網絡能夠學習復雜的特征。
3. 輸出層(Output Layer)
輸出層是神經網絡的最后一層,它將隱藏層的輸出轉換為網絡的最終輸出。輸出層的神經元數量取決于具體任務。例如,對于二分類問題,輸出層通常有一個神經元,輸出一個表示類別概率的值。對于多分類問題,輸出層的神經元數量等于類別數量,通