前言
本章講講解圖像處理相關(guān)內(nèi)容,包括圖像金字塔、圖像輪廓模板提取、直方圖、圖像傅里葉變換等。
一、圖像金字塔
- 含義: 圖像金字塔是一種用于圖像處理和計(jì)算機(jī)視覺的技術(shù)。它是一系列圖像的集合,其中每個(gè)圖像比前一個(gè)圖像分辨率更低, 從而形成一種金字塔形的結(jié)構(gòu)。這些圖像可以由同一圖像的不同分辨率版本生成,也可以是不同圖像之間的掃描和縮小。
-
作用: 在圖像增強(qiáng)中,可以將圖像分解為一系列不同分辨率的圖像,然后對(duì)每個(gè)分辨率級(jí)別的圖像進(jìn)行處理,最終將它們合成為一張?jiān)鰪?qiáng)后的圖像。在圖像檢測(cè)中,可以使用金字塔技術(shù)進(jìn)行對(duì)象的尺度不變性檢測(cè)。在目標(biāo)跟蹤中,可以在不同的尺度上搜索目標(biāo)。
1.高斯金字塔
- 向下采樣(縮小 圖片):
- 首先進(jìn)行高斯濾波
- 去除偶數(shù)的行、列
- 向上采樣(放大圖片):
- 用零填充偶數(shù)行、列
[ 10 30 56 96 ] ? [ 10 0 30 0 0 0 0 0 56 0 96 0 0 0 0 0 ] \begin{bmatrix} 10& 30\\ 56&96\end{bmatrix}\Rightarrow \begin{bmatrix} 10 & 0 & 30 & 0\\ 0& 0 & 0 & 0\\ 56& 0& 96 &0 \\ 0& 0& 0&0\end{bmatrix} [1056?3096?]? ?100560?0000?300960?0000? ? - 對(duì)放大的圖片進(jìn)行高斯卷積,從而可對(duì)零值進(jìn)行填充
- 用零填充偶數(shù)行、列
# 向上采樣
cv2.pyrUp(src[, dst[, dstsize[, borderType]]]) -> dst
# 向下采樣
cv2.pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst
2.拉普拉斯金字塔
I
i
+
1
=
I
i
?
P
y
r
U
p
(
p
y
r
D
o
w
n
(
I
i
)
)
I_{i+1} = I_i - PyrUp(pyrDown(I_i))
Ii+1?=Ii??PyrUp(pyrDown(Ii?))
執(zhí)行上面的公式,就能得到每一層的圖像。
拉普拉斯金字塔和高斯金字塔是圖像金字塔的兩個(gè)重要概念,它們之間有以下不同點(diǎn):
-
算法步驟不同:高斯金字塔是由原始圖像不斷進(jìn)行下采樣(降分辨率)和高斯濾波得到的,每次下采樣都將圖像的尺寸減半。而拉普拉斯金字塔則是由高斯金字塔依次上采樣(放大)和減去對(duì)應(yīng)的低分辨率圖像得到的。
-
不同的金字塔目的:高斯金字塔主要用于圖像降采樣(縮小)和尺度空間分析,可以用于圖像的尺度不變性特征描述,如SIFT、SURF算法等。拉普拉斯金字塔則主要用于對(duì)圖像進(jìn)行增強(qiáng)、邊緣檢測(cè)和圖像融合等操作。
-
金字塔層數(shù)和大?。焊咚菇鹱炙膶訑?shù)與原始圖像的大小有關(guān),尺寸越大,高斯金字塔的層數(shù)也就越多。而拉普拉斯金字塔通常與高斯金字塔大小相同,因?yàn)樗怯筛咚菇鹱炙玫降摹?/p>
-
局部特征信息:盡管可逆性和單尺度不變性有用,但僅僅用于描述局部特征時(shí)可能不夠準(zhǔn)確。因此,拉普拉斯金字塔通常能夠提供比高斯金字塔更豐富的局部特征信息。
因此,根據(jù)不同的應(yīng)用場(chǎng)景,可以選擇高斯金字塔或拉普拉斯金字塔等適合的金字塔結(jié)構(gòu)來處理圖像。
二、圖像輪廓
1. 輪廓提取
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
其中:
-
image
:輸入的圖像,應(yīng)該是二值圖像,每個(gè)像素的值要么為0,要么為255,表示前景和背景兩種顏色。 -
mode
:輪廓檢索模式,是一個(gè)枚舉值,取值范圍包括:-
cv2.RETR_EXTERNAL
:只檢測(cè)最外層的輪廓,即只返回邊緣輪廓; -
cv2.RETR_LIST
:檢測(cè)所有的輪廓,并返回其完整的列表; -
cv2.RETR_CCOMP
:檢測(cè)所有的輪廓,但只返回兩級(jí)輪廓結(jié)構(gòu),即外層輪廓和內(nèi)層輪廓; -
cv2.RETR_TREE
:檢測(cè)所有的輪廓,并返回完整的輪廓樹結(jié)構(gòu)。
-
-
method
:輪廓近似方法,是一個(gè)枚舉值,取值范圍包括:-
cv2.CHAIN_APPROX_NONE
:存儲(chǔ)所有的輪廓點(diǎn),每個(gè)點(diǎn)的坐標(biāo)(x,y)都存儲(chǔ); -
cv2.CHAIN_APPROX_SIMPLE
:僅保留輪廓的端點(diǎn),只需存儲(chǔ)它們的坐標(biāo)即可,例如矩形輪廓僅需要4個(gè)點(diǎn)的坐標(biāo)即可。
-
-
contours
:輸出參數(shù),返回檢測(cè)到的輪廓,每個(gè)輪廓是一個(gè)由像素坐標(biāo)表示的Numpy數(shù)組。 -
hierarchy
:輸出參數(shù),返回輪廓的層級(jí)關(guān)系,每個(gè)輪廓由4個(gè)值(父級(jí)輪廓編號(hào),下一級(jí)輪廓編號(hào),第一個(gè)子級(jí)輪廓編號(hào),前一個(gè)兄弟輪廓編號(hào))
表示。
hierarchy的理解
2. 輪廓繪制
cv2.drawContours()
是OpenCV提供的一個(gè)函數(shù),能夠在圖像中繪制輪廓。
該函數(shù)的語(yǔ)法如下:
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
參數(shù)解釋如下:
-
image
: 要繪制輪廓的圖像。 -
contours
: 一個(gè)由輪廓點(diǎn)集組成的列表,可以通過cv2.findContours()
函數(shù)獲取。該參數(shù)可以是一個(gè)單獨(dú)的輪廓(Point集合),也可以是多個(gè)輪廓的列表。 -
contourIdx
: 指定要繪制的輪廓的編號(hào)。如果是負(fù)數(shù),則表示要繪制所有的輪廓。 -
color
: 輪廓顏色,可以是RGB元組或BGR元組。 -
thickness
: 輪廓線條粗細(xì),默認(rèn)值為1. -
lineType
: 線條類型,默認(rèn)值為8-connectivity(即cv2.LINE_8),也可以設(shè)置為4-connectivity(即cv2.LINE_4)或CV_AA。 -
hierarchy
: 輪廓層級(jí)信息,可選參數(shù)。 -
maxLevel
: 可以繪制的輪廓的最大級(jí)別,可選參數(shù)。 -
offset
: 輪廓計(jì)算的偏移量,可選參數(shù)。
3. 輪廓特征
在OpenCV中,對(duì)于圖像中的輪廓,有許多特征可以用來描述和分析這些輪廓。下面列出了一些主要的輪廓特征:
-
輪廓面積:輪廓曲線所包含的面積大小,可以用
cv2.contourArea()
函數(shù)計(jì)算。 -
輪廓周長(zhǎng):輪廓曲線的長(zhǎng)度,可以用
cv2.arcLength()
函數(shù)計(jì)算。 -
輪廓近似:通過降低輪廓點(diǎn)數(shù)目來近似表示輪廓形狀,可以用
cv2.approxPolyDP()
函數(shù)進(jìn)行處理。 -
輪廓重心:輪廓曲線所包含區(qū)域的質(zhì)心點(diǎn)坐標(biāo),可以用
cv2.moments()
函數(shù)計(jì)算。 -
輪廓方向:輪廓曲線的方向,可以用
cv2.fitEllipse()
或cv2.minAreaRect()
函數(shù)分別擬合橢圓或矩形來計(jì)算。 -
輪廓凸包:包含輪廓曲線所有點(diǎn)的凸邊形,可以用
cv2.convexHull()
函數(shù)計(jì)算。 -
輪廓缺陷:凸包與輪廓曲線之間的差距,可以用
cv2.convexityDefects()
函數(shù)計(jì)算。
這些輪廓特征可以結(jié)合使用,用來分析圖像中的輪廓形狀和特征。在實(shí)際應(yīng)用中,輪廓特征常常被用來進(jìn)行目標(biāo)檢測(cè)、圖像分類和圖像識(shí)別等任務(wù)。
4. 輪廓近似
-
原理:
首先連接A、B兩點(diǎn),然后在弧線AB上找一點(diǎn),使得該點(diǎn)到直線AB上的距離最大,記該點(diǎn)為C,該距離為d,若d小于指定的數(shù)值,則用直線AB代替弧線AB,否則則以C為中間點(diǎn),再分別判斷弧線AC與弧線CB的近似。
在OpenCV中,cv2.approxPolyDP()
函數(shù)可以對(duì)輪廓進(jìn)行近似處理,以減少輪廓點(diǎn)的數(shù)量,簡(jiǎn)化輪廓曲線,從而提高圖像處理的效率。該函數(shù)的語(yǔ)法如下:
cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
參數(shù)解釋如下:
-
curve
: 輸入的輪廓,一般是一個(gè)由點(diǎn)組成的列表或Numpy數(shù)組。 -
epsilon
: 指定近似程度,即對(duì)輪廓的最大誤差。如果指定的距離小于epsilon,那么就會(huì)被認(rèn)為是同一曲線上的點(diǎn)。 -
closed
: 指定是否是閉合曲線,如果為True
,表示曲線是閉合的,否則為打開的曲線。 -
approxCurve
: 輸出的近似輪廓,可以是numpy數(shù)組或空對(duì)象。如果不指定輸出數(shù)組,則函數(shù)會(huì)返回近似輪廓的坐標(biāo)點(diǎn)數(shù)組。
該函數(shù)的返回值表示的是近似輪廓的坐標(biāo)點(diǎn),可以通過對(duì)輸出數(shù)組的大小來確定近似后曲線上的點(diǎn)的數(shù)量。epsilon
的值受影響因素較多,需要根據(jù)具體情況進(jìn)行設(shè)定。
近似處理的效果往往受到調(diào)節(jié)參數(shù)的影響,如果epsilon
設(shè)置得過小,處理得過度,則可能會(huì)丟失重要的輪廓信息;如果epsilon
設(shè)置得過大,則可能會(huì)保留過多的輪廓信息,增加了計(jì)算量,并且可能導(dǎo)致輪廓的誤檢和漏檢等問題。因此,在進(jìn)行輪廓近似時(shí),需要根據(jù)具體情況進(jìn)行參數(shù)的調(diào)適,以達(dá)到最佳的處理效果。
5. 輪廓標(biāo)記
- 作用: 用一個(gè)形狀(矩形、圓圈等)將輪廓標(biāo)記出來。
# 背景畫布
canvabg = img.copy()
# 獲取輪廓
cnt0 = contours[0]
# 矩形邊框
startx,starty,width,height = cv2.boundingRect(cnt0)
cv2.rectangle(canvabg,(startx,starty),(startx + width,starty + height),(0,255,0),2)
# 獲取輪廓
cnt1 = contours[2]
# 圓圈外框
(cx,cy),radius = cv2.minEnclosingCircle(cnt1)
cv2.circle(canvabg,(int(cx),int(cy)),int(radius),(255,0,0),2)
三、模板匹配
- 思路: 將模板圖片當(dāng)作卷積核與被匹配的圖像進(jìn)行卷積操作,然后根據(jù)具體匹配算法計(jì)算出每一步卷積操作的置信度,根據(jù)置信度來確定模板圖像在被匹配圖像中的位置。
在OpenCV中,使用cv2.matchTemplate()
函數(shù)可以實(shí)現(xiàn)圖像匹配的功能。圖像匹配是指在一幅圖片中查找某個(gè)感興趣區(qū)域(通常是一個(gè)模板圖像)在該圖像中的位置和數(shù)量。
cv2.matchTemplate()
函數(shù)的語(yǔ)法如下:
cv2.matchTemplate(image, templ, method[, result[, mask]]) → result
參數(shù)解釋如下:
-
image
: 輸入圖像,應(yīng)該是8位或32位浮點(diǎn)型的灰度圖像。 -
templ
: 模板圖像,在輸入圖像中查找的圖像區(qū)域。與輸入圖像具有相同的數(shù)據(jù)類型和通道數(shù)。 -
method
:-
平方差匹配(
cv2.TM_SQDIFF
):此匹配方法會(huì)依次比較輸入圖像和模板圖像中像素點(diǎn)的差值平方,并返回差值的總和。匹配結(jié)果越小,匹配度越高。 -
歸一化平方差匹配(
cv2.TM_SQDIFF_NORMED
):此匹配方法與平方差匹配方法類似,但會(huì)將匹配結(jié)果歸一化,即匹配結(jié)果越小,匹配度越高。 -
相關(guān)匹配(
cv2.TM_CCORR
):此匹配方法將輸入圖像和模板圖像進(jìn)行互相關(guān)運(yùn)算,并返回相關(guān)系數(shù)的最大值。匹配結(jié)果越大,匹配度越高。 -
歸一化相關(guān)匹配(
cv2.TM_CCORR_NORMED
):此匹配方法與相關(guān)匹配方法類似,但會(huì)將匹配結(jié)果歸一化,即匹配結(jié)果越大,匹配度越高。 -
系數(shù)匹配(
cv2.TM_CCOEFF
):此匹配方法會(huì)計(jì)算輸入圖像和模板圖像之間的相關(guān)系數(shù),然后從相關(guān)系數(shù)圖像中找到最大值。匹配結(jié)果越大,匹配度越高。 -
歸一化系數(shù)匹配(
cv2.TM_CCOEFF NORMED
):計(jì)算歸一化相關(guān)系數(shù),計(jì)算出來的值越接近1,越相關(guān)。
-
-
result
: 匹配結(jié)果,一般不需要指定該參數(shù),函數(shù)會(huì)自動(dòng)創(chuàng)建。其大小為輸入圖像大小減去模板圖像大小加1,是一個(gè)二維數(shù)組。 -
mask
: 遮罩,如果指定,則只在遮罩區(qū)域內(nèi)進(jìn)行模板匹配。
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("F:/MyOpenCV/ai.jpg")
imgTmp = cv2.imread("F:/MyOpenCV/aitemp.jpg")
result = cv2.matchTemplate(img, imgTmp, cv2.TM_SQDIFF_NORMED)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
x, y = minLoc
h, w, t = imgTmp.shape
cv2.rectangle(img, minLoc, (x + w, y + h), (255, 0, 0), 2)
cv2.imshow("img", img)
cv2.imshow("imgsim", imgTmp)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、直方圖
1. 對(duì)比度
- 定義: 對(duì)比度是指圖像中最亮和最暗區(qū)域之間的差異度量,即白和黑之間的差異程度。在數(shù)字圖像處理中,對(duì)比度可用于調(diào)整圖像的明暗程度,通常是通過調(diào)整圖像中像素的亮度和顏色值來實(shí)現(xiàn)。較高的對(duì)比度可以使圖像更加清晰明亮,而較低的對(duì)比度則會(huì)使圖像顯得柔和、模糊或無法分辨。
2. 繪制直方圖
直方圖的橫坐標(biāo)為像素通道值的取值范圍,縱坐標(biāo)為數(shù)值出現(xiàn)的次數(shù)。
cv2.calcHist()
可以用于計(jì)算灰度圖像的直方圖,也可以用于計(jì)算彩色圖像的直方圖。
cv2.calcHist()
的語(yǔ)法如下:
hist = cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
參數(shù)說明如下:
-
images
: 輸入的圖像,以 numpy 數(shù)組的形式提供。如果要計(jì)算灰度圖像的直方圖,則images
的維度應(yīng)該是二維的,而對(duì)于彩色圖像,則應(yīng)該是三維的,其中第三維表示圖像的顏色通道。傳遞給函數(shù)的圖像應(yīng)該是一個(gè)列表,即使你只使用單個(gè)圖像,也要將圖像包裝在列表中。 -
channels
: 要統(tǒng)計(jì)的顏色通道的索引列表。對(duì)于灰度圖像,此參數(shù)應(yīng)該為[0]
,對(duì)于彩色圖像,則通常是[0, 1, 2]
表示三個(gè)顏色通道。 -
mask
: 可選的掩碼圖像,用于指定參與直方圖計(jì)算的像素位置。只有在掩碼圖像中對(duì)應(yīng)位置像素值為非零值時(shí),才會(huì)將該位置的像素納入直方圖計(jì)算。 -
histSize
: 直方圖的bin數(shù)量,也就是區(qū)間數(shù)量。該參數(shù)應(yīng)該為一個(gè)列表,每個(gè)元素表示一個(gè)通道的bin數(shù)量。 -
ranges
: 直方圖的像素值范圍,也就是區(qū)間范圍。該參數(shù)應(yīng)該為一個(gè)列表,每個(gè)元素表示一個(gè)通道的像素值范圍。 -
hist
: 可選的輸出直方圖數(shù)組對(duì)象。 -
accumulate
: 可選的累加標(biāo)志。
cv2.calcHist()
的返回值是一個(gè)numpy數(shù)組,表示所計(jì)算的直方圖。對(duì)于灰度圖像,返回的是一維數(shù)組;對(duì)于彩色圖像,返回的是一個(gè)三維數(shù)組,其中每個(gè)維度分別表示BGR三個(gè)通道的直方圖。
img = cv2.imread("F:/MyOpenCV/hello.jpg")
b, g, r = cv2.split(img)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
histGray = cv2.calcHist([imgGray], [0], None, [256], [0, 256])
# 繪制直方圖
plt.plot(histGray)
plt.xlim([0, 256])
plt.xlabel("灰度值")
plt.ylabel("像素?cái)?shù)量")
plt.show()
注:也可以使用matplotlib的方法,
plt.hist(data, histSize)
其中data為直方圖的一維數(shù)組,因此圖像數(shù)據(jù)調(diào)用ravel
函數(shù)。
3. 均衡化
3.1 理論
-
目的: 將原圖像通過變換,得到一幅灰度直方圖的灰度值均勻分布的新圖像。對(duì)在圖像中像素個(gè)數(shù)多的灰度級(jí)進(jìn)行展寬,而對(duì)像素個(gè)數(shù)少的灰度級(jí)進(jìn)行縮減。從而達(dá)到清晰圖像的目的。最理想的情況就是變換后,像素灰度概率完全一樣的,但是實(shí)際上做不到那么平均。
3.2 代碼
cv2.equalizeHist(src:image[, dst]) -> dst:image
4. CLAHE
-
直方圖均衡化問題:
- 全局效果,導(dǎo)致原來比較亮的地方變得更亮 原來暗的地方變得更暗 從而會(huì)導(dǎo)致細(xì)節(jié)的丟失。
- 可能導(dǎo)致噪點(diǎn)的放大。
-
思路: 將圖片進(jìn)行拆分,然后分別對(duì)每個(gè)部分進(jìn)行均衡化處理,且對(duì)每個(gè)部分的直方圖概率分布做限制。
-
算法實(shí)現(xiàn):
- 圖像分塊
- 找每個(gè)塊的中心點(diǎn)
- 分別計(jì)算每個(gè)塊的灰度直方圖,并進(jìn)行閾值限制
- 得到每個(gè)塊的直方圖分布后,根據(jù)直方圖均衡化算法對(duì)每個(gè)塊的中心點(diǎn)進(jìn)行均衡化處理。只對(duì)中心點(diǎn)進(jìn)行均衡化是為了加快計(jì)算速度。
- 根據(jù)中心點(diǎn)均衡化后的灰度值,利用差值算法計(jì)算圖像塊剩余像素的灰度值。
-
代碼:
# 生成自適應(yīng)均衡化算法 # clipLimit :閾值,1 表示不做限制。值越大,對(duì)比度越大 # tileGridSize:如何拆分圖像 clahe = cv2.createCLAHE([, clipLimit[, tileGridSize]]) -> retval # 對(duì)像素通道進(jìn)行自適應(yīng)均值化處理 dst = clahe.apply(src)
cv2.createCLAHE 函數(shù)可接受三個(gè)參數(shù),分別是 clipLimit、tileGridSize 和 tileGridSizeX(取代 tileGridSize),其中:
- clipLimit:保持對(duì)比度等級(jí)的限制值,這個(gè)值越小,保持的對(duì)比度等級(jí)越高;
- tileGridSize:將圖像分成的矩形塊的大小,以像素為單位。該參數(shù)應(yīng)該是奇數(shù)。若在 tileGridSizeX 參數(shù)中指定,那么就不需要輸入該參數(shù)。
- tileGridSizeX:同 tileGridSize,用于指定矩形塊的大小。
五、圖像傅里葉變換
-
擴(kuò)展閱讀
- 傅里葉變換
- 二維傅里葉變換
- 圖像傅里葉
5.1 正弦平面波
- 直觀定義: 將一維正弦曲線朝著縱向的一個(gè)方向上將其拉伸得到一個(gè)三維的波形,然后將波形的幅值變化用二維平面進(jìn)行表示,再將二維平面波繪制成灰度圖,從而波峰為255白色 波谷為0黑色,中間是一個(gè)灰度的過渡。
-
數(shù)學(xué)參數(shù):
- 正弦波:頻率w, 幅值A(chǔ),相位 φ \varphi φ
- 拉伸方向:在二維坐標(biāo)中,向量可以寫為 n → = ( μ , v ) \overrightarrow{n} = (\mu, v) n=(μ,v)
5.2 二維傅里葉變換
-
思想: 二維傅里葉變換中,認(rèn)為二維數(shù)據(jù)是由無數(shù)個(gè)
正弦平面波
所構(gòu)成。 -
離散傅里葉變換公式:
F ( u , v ) = 1 M N ∑ x = 0 M ? 1 ∑ y = 0 N ? 1 f ( x , y ) e ? i 2 π ( u x M + v y N ) F(u,v) = \frac{1}{MN}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-i2\pi(\frac{ux}{M}+\frac{vy}{N})} F(u,v)=MN1?x=0∑M?1?y=0∑N?1?f(x,y)e?i2π(Mux?+Nvy?) -
參數(shù)的解釋:
5.3 二維傅里葉變換結(jié)果 F ( u , v ) F(u, v) F(u,v)
- (u, v)拉伸方向的向量
- w = u 2 + v 2 w = \sqrt{u^2 + v^2} w=u2+v2? 向量的模表示正弦波的頻率
- F(u, v):復(fù)數(shù), 隱含了正弦波的幅值A(chǔ)和相位 φ \varphi φ。詳細(xì)的還是看上面的擴(kuò)展閱讀吧。
5.4 傅里葉變換的實(shí)現(xiàn)
OpenCV提供了dft(src:np.float[, dst[, flags[, nonzeroRows]]]) -> dst
來進(jìn)行傅里葉變換,參數(shù)含義如下:
-
src
:輸入的單通道圖像,必須為浮點(diǎn)型 -
dst
:輸出的復(fù)數(shù)形式的結(jié)果,大小與src
一致 -
flags
:變換操作的附加選項(xiàng),通??梢栽O(shè)置為cv2.DFT_COMPLEX_OUTPUT
表示輸出為復(fù)數(shù) -
nonzeroRows
:當(dāng)輸入圖像的尺寸不是2的冪次方時(shí),必須手動(dòng)指定變換中心(如果輸入圖像大小為偶數(shù),則默認(rèn)中心為圖像的中心,否則中心為左上角) -
n
:可選參數(shù),指定變換的大小,通常為src
的尺寸 - 返回值是是
雙通道
,第一個(gè)通道是實(shí)部,第二個(gè)通道是虛部
注:由于離散傅里葉變換具有共軛對(duì)稱性 因此只有四分之一是有效的其他是翻轉(zhuǎn)的。
-
頻譜圖中心化:
方便用于濾波操作。# 頻譜中心化 shiftA = np.fft.fftshift(A)
5.5 傅里葉濾波
-
思路:
- 對(duì)圖像灰度進(jìn)行傅里葉變換,得到頻域結(jié)果
- 將要?jiǎng)h除的頻率所對(duì)應(yīng)的傅里葉變換結(jié)果全部置為0+i0
- 對(duì)修改后的傅里葉變換結(jié)果進(jìn)行傅里葉反變換
5.5.1 低通濾波
將低頻部分的結(jié)果全部置為零
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("F:/MyOpenCV/ai.jpg")
yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
yfloat = np.float32(yuv[:, :, 0]) # 其實(shí)就是取了灰度圖
dft = cv2.dft(yfloat, flags=cv2.DFT_COMPLEX_OUTPUT) # 生成頻譜圖
dftShift = np.fft.fftshift(dft) # 中心化
centerRow = int(dftShift.shape[0] / 2) # 寬的中心
centerCol = int(dftShift.shape[1] / 2) # 列的中心
mask = np.zeros(dftShift.shape, dtype=np.uint8) # 構(gòu)造一個(gè)掩膜
mask[centerRow - 30 : centerRow + 30, centerCol - 30 : centerCol + 30, :] = 1
dftShift = dftShift * mask # 按位乘
dft = np.fft.ifftshift(dftShift) # 先反中心化
idft = cv2.idft(dft) # 再反傅里葉
iyDft = cv2.magnitude(idft[:, :, 0], idft[:, :, 1]) # 轉(zhuǎn)為實(shí)數(shù)
iy = np.uint8(iyDft / iyDft.max() * 255) # 映射
yuv[:, :, 0] = iy
imgRes = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR)
cv2.imshow("imgRes", imgRes)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.5.2 高通濾波
類似于低通 改一下掩膜就行 效果如下(有點(diǎn)恐怖 下次還是使用灰度圖吧)文章來源:http://www.zghlxwxcb.cn/news/detail-453981.html
總結(jié)
最近在忙實(shí)驗(yàn)室的項(xiàng)目,本篇搞的有點(diǎn)慢,這兩天把它弄完。文章來源地址http://www.zghlxwxcb.cn/news/detail-453981.html
到了這里,關(guān)于第五章 圖像處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!