OpenCV-Python Tutorial : A Candy from Official Main Page(三)

3.11傅立葉變換

3.11.1Fourier Transform in OpenCV-cv.dft、cv.magnitude、cv.idft

這兩個函數是圖像頻域處理(如去噪、邊緣增強、紋理分析)的基礎工具。

1.cv.dft()?—— 離散傅里葉變換

功能
將圖像從空間域(像素強度)轉換到頻域(頻率成分),用于分析圖像中的高頻(邊緣、噪聲)和低頻(平滑區域)信息。

dft_output = cv.dft(src, flags=cv.DFT_COMPLEX_OUTPUT)
src: 輸入圖像(需為單通道灰度圖,格式 np.float32)。
flags:
cv.DFT_COMPLEX_OUTPUT(默認):輸出復數形式(實部+虛部)。
cv.DFT_SCALE:歸一化結果(便于可視化)。
cv.DFT_ROWS:對多行單獨執行DFT。
返回值:
復數形式的頻域矩陣(尺寸與輸入相同,類型為 np.complex64 或雙通道 np.float32),是一個雙通道數組(dft[:,:,0]為實部,dft[:,:,1]為虛部)。

cv.magnitude()?是 OpenCV 中用于計算二維向量幅值的函數,在頻域處理中常用于從傅里葉變換的復數結果(實部 + 虛部)中提取幅度譜(即頻率分量的強度)

magnitude = cv.magnitude(x, y)
參數:
x:輸入矩陣的實部(如 dft[:,:,0])。
y:輸入矩陣的虛部(如 dft[:,:,1])。

返回值:與輸入同尺寸的單通道矩陣,每個元素值為:

?

作用:?

2.?cv.idft()?—— 逆離散傅里葉變換

功能
將頻域數據還原回空間域圖像,常用于濾波后的重建。

idft_output = cv.idft(src, flags=cv.DFT_SCALE | cv.DFT_REAL_OUTPUT)
src: 頻域數據(復數或雙通道浮點矩陣)。
flags:
cv.DFT_SCALE:對結果歸一化(抵消DFT的系數)。
cv.DFT_REAL_OUTPUT:輸出實數圖像(單通道)。
返回值:
重建的空間域圖像(雙通道 np.float32)。

關鍵注意事項

  1. 輸入格式cv.dft()?的輸入必須是單通道?np.float32

  2. 頻譜可視化:需對DFT結果取對數并歸一化(cv.magnitude()?+?cv.normalize())。

  3. 頻移操作:使用?np.fft.fftshift()?將低頻分量移到頻譜中心。

  4. 濾波應用:通過掩碼(mask)修改頻域數據(如高通/低通濾波)。

3.demo

通過DFT和IDFT)實現把圖片從顏色空間變換到頻域空間,再通過低通濾波,模糊圖像以去除高頻成分(如邊緣和噪聲)

from operator import eq
from turtle import title
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from numpy.fft import fftshiftimg = cv.imread("image4.png")
assert img is not None, "file could not be read, check with os.path.exists()"
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)# 轉到頻域可視化
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)magnitude = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))# 從頻域轉到顏色空間,帶有低通濾波mask
row,col = img.shape
crow,ccol = row//2,col//2
mask = np.zeros((row,col,2),np.uint8)
mask[crow-30:crow+30,ccol-30:ccol+30] = 1fshift = dft_shift * mask
fshift = np.fft.ifftshift(fshift)
img_back = cv.idft(fshift)
img_back = cv.magnitude(img_back[:,:,0],img_back[:,:,1])titles = ['img','dft','img_back']
images = [img,magnitude,img_back]
for i in range(3):plt.subplot(1,3,i+1)plt.imshow(images[i],cmap='gray')plt.title(titles[i])
plt.show()

?

4.解讀-幅度譜的關鍵特征
  • 中心亮點:代表低頻成分(圖像中的平滑區域,如背景或緩慢變化的顏色)。

  • 外圍亮點:代表高頻成分(圖像中的邊緣、紋理或噪聲)。

  • 對稱性:幅度譜是中心對稱的(因為DFT的結果是共軛對稱的)。

示例分析

  • 如果原始圖像中有明顯的邊緣(如物體的輪廓),幅度譜的外圍會顯示對應的亮點。

  • 如果圖像整體較模糊(低頻主導),幅度譜的中心區域會更亮。

如何驗證結果是否正確?

?

5.最常用的2種濾波操作

必須避開的坑

  • 錯誤1:未轉float32直接DFT → 報錯

  • 錯誤2:逆變換后未取實部(.real)→ 結果異常

  • 錯誤3:未中心化頻譜 → 低頻分布在四角

3.11.2DFT的性能優化

3.11.3Why Laplacian is a High Pass Filter?

不做重點介紹

3.12模板匹配Template Matching-cv2.matchTemplate()、cv2.minMaxLoc()

模板匹配(Template Matching)

  • 作用:在輸入圖像(大圖)中查找與模板圖像(小圖)最相似的部分。
  • 原理:滑動模板窗口,用數學方法計算每個位置的相似度,返回最佳匹配位置。
  • 特點平移有效但對旋轉、縮放、光照變化敏感適合固定圖案的快速定位(如按鈕檢測、LOGO識別)

匹配函數:cv2.matchTemplate()

result = cv2.matchTemplate(image, templ, method, mask=None)
參數:
image:輸入圖像(大圖),必須為單通道灰度圖(若彩色需先轉灰度)。
templ:模板圖像(小圖),尺寸≤大圖且數據類型相同。
method:匹配方法(見下方6種選項)。
mask:可選掩模,與模板同尺寸,僅匹配掩模非零區域。
返回值:
result:浮點型矩陣,尺寸為 (W-w+1, H-h+1)(W/H=大圖寬高,w/h=模板寬高)。
每個像素值表示該位置的匹配程度(具體含義取決于method)。
method介紹如下:
方法名	公式/原理	最佳匹配位置	返回值范圍
cv2.TM_SQDIFF	平方差最小化	最小值點	[0, ∞)
cv2.TM_SQDIFF_NORMED	歸一化平方差	最小值點	[0, 1]
cv2.TM_CCORR	互相關(亮度敏感)	最大值點	[0, ∞)
cv2.TM_CCORR_NORMED	歸一化互相關	最大值點	[0, 1]
cv2.TM_CCOEFF	相關系數(去均值)	最大值點	[-1, 1]
cv2.TM_CCOEFF_NORMED	歸一化相關系數(推薦)	最大值點	[-1, 1]
推薦:TM_CCOEFF_NORMED(抗亮度變化)或 TM_SQDIFF_NORMED(精確差異)。

結果解析函數:cv2.minMaxLoc()

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
作用:找到匹配結果矩陣中的極值位置。
返回值:
min_val, max_val:最小/最大值(根據method決定取哪個)。
min_loc, max_loc:對應極值的坐標(左上角點,格式 (x, y))。

demo:完成單模板的匹配,多模板其實就是加個循環結構畫結果出來

from unittest import result
import cv2 as cv
import numpy as npimg1 = cv.imread('image4.png')
img = cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
template = cv.imread('template.png',cv.IMREAD_GRAYSCALE)
h,w = template.shaperesult = cv.matchTemplate(img,template,cv.TM_CCOEFF_NORMED)# 獲取最佳匹配位置
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
# print(min_val, max_val, min_loc, max_loc)
top_left = max_loc  # TM_CCOEFF_NORMED取最大值位置
bottom_right = (top_left[0] + w, top_left[1] + h)# 繪制矩形框
cv.rectangle(img1,top_left,bottom_right,[0,255,0],2)cv.imshow('match',img1)
cv.waitKey(0)
cv.destroyAllWindows()

3.13hough transformation-cv2.HoughLines()、cv2.HoughLinesP()、cv2.HoughCircles()

3.13.1直線霍夫變換

標準霍夫線變換:cv2.HoughLines()

lines = cv2.HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None)
參數:
image:輸入圖像(必須為二值圖,常用Canny邊緣檢測結果)。
rho:距離分辨率(像素),推薦1。
theta:角度分辨率(弧度),推薦np.pi/180(即1度)。
threshold:投票閾值(低于此值的直線被忽略),值越小檢測越多。
srn, stn:多尺度霍夫變換參數,通常設為0。
min_theta, max_theta:角度范圍限制(默認0~π)。
返回值:
lines:(N, 1, 2)的NumPy數組,每行為[ρ, θ]。

概率霍夫線變換(推薦):cv2.HoughLinesP()

lines = cv2.HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
參數:
minLineLength:線段最小長度(小于此值被過濾)。
maxLineGap:允許的同一直線上點的最大間隔。
返回值:
lines:(N, 1, 4)數組,每行為[x1, y1, x2, y2](線段端點坐標)。

對比

  • HoughLines:返回無限長的直線參數,需自行計算端點。
  • HoughLinesP:直接返回線段端點,更易使用。

demo1:使用標準霍夫變換

import cv2 as cv
import numpy as npimg = cv.imread(cv.samples.findFile('sudoku.png'))
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)lines = cv.HoughLines(edges,1,np.pi/180,200)
for line in lines:rho,theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a*rhoy0 = b*rhox1 = int(x0 + 1000*(-b))y1 = int(y0 + 1000*(a))x2 = int(x0 - 1000*(-b))y2 = int(y0 - 1000*(a))cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)cv.imwrite('houghlines3.jpg',img)

demo2:使用概率霍夫變換

import cv2 as cv
import numpy as npimg = cv.imread(cv.samples.findFile('sudoku.png'))
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
lines = cv.HoughLinesP(edges,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:x1,y1,x2,y2 = line[0]cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)cv.imwrite('houghlines5.jpg',img)

3.13.2霍夫圓變換

demo:檢測圓形

import numpy as np
import cv2 as cvimg = cv.imread('opencv-logo-white.png', cv.IMREAD_GRAYSCALE)
assert img is not None, "file could not be read, check with os.path.exists()"
img = cv.medianBlur(img,5)
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)circles = cv.HoughCircles(img,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)circles = np.uint16(np.around(circles))
for i in circles[0,:]:# draw the outer circlecv.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)# draw the center of the circlecv.circle(cimg,(i[0],i[1]),2,(0,0,255),3)cv.imshow('detected circles',cimg)
cv.waitKey(0)
cv.destroyAllWindows()

3.14基于分水嶺算法的圖像分割-cv2.watershed()

這一節簡單介紹原理,目前分割基本都是基于深度學習的。如果需要處理重疊/粘連物體,那么需要這個方法。

markers = cv2.watershed(image, markers)
參數:
image:輸入3通道彩色圖像(BGR格式)。
markers:標記矩陣(與圖像同尺寸,數據類型為int32):
markers[i,j]=0:未確定區域(待分割)
markers[i,j]>0:前景對象的唯一標簽
markers[i,j]=-1:算法輸出的邊界像素
返回值:
修改后的markers矩陣,邊界像素被標記為-1。

3.15GrabCut算法-cv2.grabCut()

mask, bgdModel, fgdModel = cv2.grabCut(image, mask, rect, bgdModel, fgdModel, iterCount, mode
)
參數說明:
參數	類型	說明
image	np.uint8 (RGB)	輸入圖像(必須為3通道彩色圖)
mask	np.uint8	掩模矩陣,取值:
? 0(GC_BGD): 明確背景
? 1(GC_FGD): 明確前景
? 2(GC_PR_BGD): 可能背景
? 3(GC_PR_FGD): 可能前景
rect	tuple	前景的矩形框 (x,y,w,h),僅在 mode=GC_INIT_WITH_RECT 時使用
bgdModel/fgdModel	np.float64	算法內部使用的臨時數組,初始化為 np.zeros((1,65), np.float64)
iterCount	int	迭代次數(通常5~10次)
mode	int	GC_INIT_WITH_RECT(矩形初始化)或 GC_INIT_WITH_MASK(掩模初始化)
返回值:
mask:更新后的掩模(需后處理提取最終結果)
bgdModel/fgdModel:可復用的模型參數

關鍵注意事項

  1. 輸入圖像:必須是RGB格式(BGR順序),且為np.uint8類型。

  2. 掩模初始化

    • 矩形模式:mask會被自動覆蓋,無需手動設置。

    • 掩模模式:需提前用GC_FGD/GC_BGD標記明確區域。

  3. 結果優化

    • 對邊緣粗糙部分,可用cv2.erode()cv2.GaussianBlur()平滑。

  4. 性能權衡

    • iterCount=5:快速但可能欠分割

    • iterCount=10:速度慢但精度高

demo:使用該方法進行分割

import numpy as np
import cv2# 1. 加載圖像
img = cv2.imread('test.jpg')
mask = np.zeros(img.shape[:2], np.uint8)  # 初始化掩模# 2. 定義前景矩形框 (x,y,width,height)
rect = (50, 50, 300, 400)  # 需完全包圍目標物體# 3. 執行GrabCut
bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)# 4. 提取前景(類型轉換)
mask = np.where((mask==1)|(mask==3), 255, 0).astype('uint8')# 5. 應用掩模并顯示
result = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('Result', result)
cv2.waitKey(0)

此方法速度很慢,并不是特別適合處理一般圖像。

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

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

相關文章

移動端字體適配

一、移動端圖片適配1、使用 <img> 的 srcset<img src"logo.png"srcset"logo2x.png 2x,logo3x.png 3x"alt"Logo">優點&#xff1a;原生支持&#xff0c;瀏覽器自動選擇最合適的圖片。2、使用媒體查詢切換背景圖.logo {background-ima…

git起步

git官網&#xff1a;https://git-scm.com git使用手冊&#xff1a;https://git-scm.com/book/zh/v2 一、Git 是什么&#xff1f; 1、版本控制 版本控制是一種記錄一個或若干文件內容變化&#xff0c;以便將來查閱特定版本修訂情況的系統。我們經常是用的是保存軟件源代碼的…

SSL與HTTP概述

一、概念1.SSL概念SSL&#xff08;Secure Sockets Layer&#xff09;是一種網絡安全協議&#xff0c;用于在互聯網通信中建立加密鏈接&#xff0c;保護在網絡中傳輸的敏感數據免遭竊取或篡改。2.TLS概念雖然現在更先進的 TLS&#xff08;Transport Layer Security&#xff09; …

前端報錯:“Uncaught SyntaxError: missing ) after argument list

問題描述&#xff1a;前端報錯&#xff1a;“Uncaught SyntaxError: missing ) after argument list在 JavaScript 中遇到“SyntaxError: missing ) after argument list”這個錯誤通常意味著在函數調用或者聲明中&#xff0c;參數列表的括號沒有正確閉合。錯誤代碼&#xff1a…

廣州郵科光纖交換機的應用:網絡世界中的幕后核心

你知道嗎&#xff1f;在我們每天暢游互聯網&#xff0c;發送郵件、看視頻、打游戲時&#xff0c;背后支撐這一切流暢體驗的關鍵設備之一就是光纖交換機。它像一個幕后英雄&#xff0c;默默地確保信息傳輸高效、穩定。那么&#xff0c;究竟郵科光纖交換機有哪些不可或缺的應用領…

C++內存布局、構造函數規則和優化策略解析

一、類對象內存布局深度解析 1.1 核心內存占用規則 ?非靜態成員變量?&#xff1a;每個對象獨立存儲&#xff0c;按聲明順序排列&#xff08;含內存對齊填充&#xff09; 示例&#xff1a;class A{int x; char y;}; → 實際占用8字節&#xff08;413填充&#xff09;4?靜態…

Fastapi框架總覽與核心架構

Fastapi框架總覽與核心架構 FastAPI 是一個基于 Python 的現代 Web 框架&#xff0c;專注于 高性能、高并發 和 開發效率&#xff0c;特別適合構建 異步 API 服務、微服務接口&#xff0c;同時在大模型接口封裝中也廣泛應用。它基于 Starlette&#xff08;異步 Web 框架&#x…

高并發四種IO模型的底層原理

高并發四種IO模型的底層原理 1 IO讀寫的基本原理 為了避免用戶進程直接操作內核&#xff0c;保證內核安全&#xff0c;操作系統將內存&#xff08;虛擬內存&#xff09;劃分為兩部分&#xff1a;一部分是內核空間(Kernel-Space)&#xff0c;另一部分是用戶空間(User-Space)。在…

騰訊云短信實戰:Spring Boot接入YML配置與簽名/模板/發送/統計/狀態/號碼包工具類詳解

下面是一個Spring Boot集成騰訊云短信服務的詳細示例&#xff0c;包含配置和6個工具類&#xff08;簽名、模板、發送、統計、狀態&#xff09;&#xff0c;采用YML配置&#xff1a; 1. 添加Maven依賴 <dependency><groupId>com.tencentcloudapi</groupId>&…

【Java篇】IntelliJ IDEA 安裝與基礎配置指南

序 本篇文章將介紹IDEA 2023 版本。 提高開發人員的生產力。無論您是剛開始接觸編程的新手&#xff0c;還是經驗豐富的開發專家。 一&#xff1a;官網下載安裝包&#xff1a; IDEA下載鏈接 這個版本可以根據自己的需要選擇。 二、安裝方法 雙擊進這個.exe文件 這里要選擇合…

2-Nodejs運行JS代碼

2-Nodejs運行JS代碼 創建一個 js 文件編寫 JS 代碼 要注意的是&#xff0c;在nodejs環境中不能操作瀏覽器 DOM 對象相關的api&#xff0c;在Nodejs 中運行 JS 代碼 按住 shift 鍵&#xff0c;在 js 文件所在文件夾空白處右鍵&#xff0c;選擇 Powershell 窗口執行如下命令&…

vue中使用西瓜播放器xgplayer (封裝)+xgplayer-hls 播放.m3u8格式視頻

1.西瓜播放器官網 http://h5player.bytedance.com/guide/2.安裝 # 最新穩定版 $ npm install xgplayer對于已有項目也可以通過 CDN 引入&#xff0c;代碼如下&#xff1a; <script src"//unpkg.byted-static.com/xgplayer/2.31.2/browser/index.js" type"tex…

2025-07-15通過邊緣線檢測圖像里的主體有沒有出血

本節觀點&#xff1a;一個好的提問就已經解決了問題的90%。 對于問題的描述正確與否決定了解決問題的方法和路徑&#xff0c;所以我們在AI時代必須要學會正確的描述問題和表達問題&#xff0c;否則即使有AI輔助也是很難精準的解決問題。 我的問題&#xff1a; 如何利用代碼從圖…

【Docker基礎】Dockerfile指令速覽:文件與目錄操作指令詳解

目錄 引言 1 ADD&#xff1a;高級文件復制與解壓 1.1 指令簡介 1.2 語法 1.3 功能詳解 1.4 使用場景 1.5 執行流程 1.6 示例 1.7 注意事項 2 WORKDIR&#xff1a;設置工作目錄 2.1 指令簡介 2.2 語法 2.3 使用場景 2.4 創建流程 2.5 示例 2.6 注意事項 3 VOLU…

Python 程序設計講義(2):Python 概述

Python 程序設計講義&#xff08;2&#xff09;&#xff1a;Python 概述 一、Python 語言的發展史 Python 語言誕生于 1990 年。 2002 年 10 月&#xff0c;Python2.0 正式發布。 2008 年 12 月&#xff0c;Python3.0 正式發布。 Python3.0 在語法層面和解釋器內部做了很多重大…

多租戶SaaS系統中設計安全便捷的跨租戶流程共享

四維協同架構??,結合動態授權、加密傳輸、行為審計和智能策略 一、??權限控制體系?? 1. ??動態權限模型? ? 2. ??授權策略實現?? ??RBAC+ABAC混合模型?? 在流程表增加shared_tenants字段存儲授權信息,結合屬性動態校驗: CREATE TABLE workflow_process…

Spring Ioc Bean 到底是什么

Bean 到底是什么&#xff1f; 簡單來說&#xff0c;Spring Bean 就是一個由 Spring IoC 容器負責創建、管理和裝配的 Java 對象。 它不是一種新的技術&#xff0c;它本質上還是一個普普通通的 Java 對象&#xff08;POJO - Plain Old Java Object&#xff09;&#xff0c;但它的…

【PCIe 總線及設備入門學習專欄 5.1.1 -- PCIe PERST# 信號的作用】

文章目錄 PCIe PERSTN#PERST# 信號作用概述簡要定義PERST# 的關鍵功能PERST# 的時序圖示意Synopsys PCIe EP IP 中 PERST# 的作用關鍵信號接口典型復位流程示例代碼(Verilog for Synopsys PCIe)PERST# 使用場景舉例(Synopsys PCIe EP)1. 系統上電初始化2. 熱復位特定設備3.…

使用python的pillow模塊將圖片轉化為灰度圖,獲取值和修改值

使用python的pillow模塊可以將圖片轉化為灰度圖&#xff0c; 可以獲取灰度圖的特定點值&#xff0c;區域值&#xff0c; 修改值并保存到圖片 圖片轉換為灰度圖 from PIL import Image# 打開圖片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

記憶力訓練day41

通常是一個地點記2組詞 數字和人體記憶宮殿更注重 即時性&#xff1b;地點記憶宮殿是長久性