天天看點

關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

關于OpenCV的一些圖像處理函數

文章目錄

  • 關于OpenCV的一些圖像處理函數
  • 前言
  • 一、Opencv常用圖像處理函數彙總
    • 1、cv2.threshold門檻值處理函數
    • 2、均值濾波blur、中值濾波、方框濾波、高斯濾波
    • 3、形态學-腐蝕操作
    • 3、形态學-膨脹操作
    • 4、開運算與閉運算
    • 5、梯度運算
    • 6、禮帽與黑帽
    • 7、圖像梯度-Sobel算子、Scharr算子、laplacian算子
      • 1、Sobel算子
      • 2、Scharr算子
      • 3、laplacian算子
      • 4、代碼
    • 8、Canny邊緣檢測
    • 9、圖像金字塔
      • 1、高斯金字塔下采樣 cv2.pyrDown()
      • 2、高斯金字塔上采樣 cv2.pyrUp()
      • 3、拉普拉斯金字塔
      • 4、代碼
    • 10、圖像輪廓
      • 1、cv2.findContours()
      • 2、cv2.drawContours()
    • 11、傅裡葉變換
      • 1、傅裡葉變換
      • 2、低通
      • 3、 高通
  • 總結

前言

一、Opencv常用圖像處理函數彙總

1、cv2.threshold門檻值處理函數

圖像門檻值

  • src: 輸入圖,隻能輸入單通道圖像,通常來說為灰階圖
  • dst: 輸出圖
  • thresh: 門檻值
  • maxval: 當像素值超過了門檻值(或者小于門檻值,根據type來決定),所賦予的值
  • type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
  • cv2.THRESH_BINARY 超過門檻值部分取maxval(最大值),否則取0
  • cv2.THRESH_BINARY_INV THRESH_BINARY的反轉
  • cv2.THRESH_TRUNC 大于門檻值部分設為門檻值,否則不變
  • cv2.THRESH_TOZERO 大于門檻值部分不改變,否則設為0
  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反轉
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
# 顯示函數
def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
#img = cv2.imread("D:/code/jupyter_code/data/lena.jpg")
img=cv2.imread('./data/cat.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉灰階圖
#cv_show1('lena',img)

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

2、均值濾波blur、中值濾波、方框濾波、高斯濾波

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
# 顯示函數
def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg")
cv_show1('lena',img)

# 均值濾波
# 簡單的平均卷積操作
blur = cv2.blur(img, (3, 3))
# 中值濾波
# 相當于用中值代替
median = cv2.medianBlur(img, 5)  # 中值濾波
# 方框濾波
# 基本和均值一樣,可以選擇歸一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  
# 高斯濾波
# 高斯模糊的卷積核裡的數值是滿足高斯分布,相當于更重視中間的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  
# cv_show1('blur',blur)
# cv_show1('box',box)
# cv_show1('median',median)
# cv_show1('aussian',aussian)
# 展示所有的 
res = np.hstack((img,blur,box,aussian,median))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

3、形态學-腐蝕操作

卷積核沿着圖像滑動,如果與卷積核對應的原圖像的所有像素值都是1,那麼中心元素就保持原來的像素值,否則就變為零。

将前景物體變小,了解成将圖像斷開裂縫變大。

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg")

cv_show1('img',img)
kernel = np.ones((3,3),np.uint8) 
# 函數參數, img是輸入的圖檔, Kernel是卷積核的大小, iterations是重複運作次數。
erosion = cv2.erode(img,kernel,iterations = 1)
cv_show1('erosion',erosion)
kernel = np.ones((30,30),np.uint8) 
erosion_1 = cv2.erode(img,kernel,iterations = 1)
erosion_2 = cv2.erode(img,kernel,iterations = 2)
erosion_3 = cv2.erode(img,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

3、形态學-膨脹操作

将前景物體變大,了解成将圖像斷開裂縫變小,與腐蝕相反。

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/dige.png")

cv_show1('img',img)
kernel = np.ones((3,3),np.uint8) 
# 函數參數, img是輸入的圖檔, Kernel是卷積核的大小, iterations是重複運作次數。
erosion = cv2.dilate(img,kernel,iterations = 1)
cv_show1('erosion',erosion)
kernel = np.ones((30,30),np.uint8) 
img = cv2.imread("D:/code/jupyter_code/data/pie.png")
erosion_1 = cv2.dilate(img,kernel,iterations = 1)
erosion_2 = cv2.dilate(img,kernel,iterations = 2)
erosion_3 = cv2.dilate(img,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

4、開運算與閉運算

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/dige.png")
cv_show1('img',img)
# 開:先腐蝕,再膨脹
kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv_show1('opening',opening)

# 閉:先膨脹,再腐蝕
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv_show1('closing',closing)
           

5、梯度運算

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
# 梯度=膨脹-腐蝕
pie = cv2.imread("D:/code/jupyter_code/data/pie.png")
kernel = np.ones((7,7),np.uint8) 
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
res = np.hstack((dilate,erosion,gradient))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

6、禮帽與黑帽

  • 禮帽 = 原始輸入-開運算結果
  • 黑帽 = 閉運算-原始輸入
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    
#禮帽
img = cv2.imread("D:/code/jupyter_code/data/dige.png")
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

#黑帽
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
res = np.hstack((img,tophat,blackhat))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

7、圖像梯度-Sobel算子、Scharr算子、laplacian算子

1、Sobel算子

Sobel算子是典型的基于一階導數的邊緣檢測算子,算子引入了類似局部平均的運算,對噪聲具有平滑作用,能夠很好的消除噪聲的影響。缺點:并沒有将圖像的主題與背景嚴格地區分開。

關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結
  • ddepth:圖像的深度
  • dx和dy分别表示水準和豎直方向
  • ksize是Sobel算子的大小
import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    
img = cv2.imread("D:/code/jupyter_code/data/pie.png")
# 水準方向
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
# 豎直方向
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely = cv2.convertScaleAbs(sobely)  
# 求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)

res = np.hstack((img,sobelx,sobely,sobelxy))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

2、Scharr算子

Scharr算子,具有和Sobel算子同樣的速 度,且精度更高。可以将Scharr算子看作對Sobel算子的改進,其核通常為:

關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

src:輸入圖像

dst:輸出圖像,大小和類型與 src 相同

ddepth:輸出圖檔的資料深度,由輸入圖像的深度進行選擇

dx:x 軸方向導數的階數

dy:y 軸方向導數的階數

scale:縮放比例因子,可選項,預設值為 1

delta:輸出圖像的偏移量,可選項,預設值為 0

borderType:邊界擴充的類型,注意不支援對側填充(BORDER_WRAP)

3、laplacian算子

Laplacian算子是一種各向同性算子,二階微分算子,在隻關心邊緣位置,不考慮其周圍的像素灰階內插補點時較為合适,具有無方向性的優點。對孤立像素的響應要比對邊緣或線的響應更強烈,隻适用于無噪聲圖像。存在噪聲情況下,使用Laplacian算子檢測邊緣之前,要進行低通濾波。分割算法都是把Laplacian算子和平滑算子結合起來,生成一個新的模闆。

關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

4、代碼

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg")

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

res = np.hstack((sobelxy,scharrxy,laplacian))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

8、Canny邊緣檢測

Canny算子是一個具有濾波,增強,檢測的多階段的優化算子,在進行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法采用一階偏導的有限差分來計算梯度幅值和方向,在處理過程中,Canny算子還将經過一個非極大值抑制的過程,最後Canny算子還采用兩個門檻值來連接配接邊緣。

1、使用高斯濾波器,以平滑圖像,濾除噪聲。

2、計算圖像中每個像素點的梯度強度和方向。

3、應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應。

4、應用雙門檻值(Double-Threshold)檢測來确定真實的和潛在的邊緣。

5、通過抑制孤立的弱邊緣最終完成邊緣檢測。

優點:該方法不容易受噪聲幹擾,能夠檢測到真正的弱邊緣。

缺點: 易使高頻邊緣被平滑掉,進而造成邊緣丢失。

edges=cv.Canny(image,threshold1,threshold2[,apertureSize[,L2gradient]])
           

● edges為計算得到的邊緣圖像。

● image為8位輸入圖像。

● threshold1表示處理過程中的第一個門檻值。

● threshold2表示處理過程中的第二個門檻值。

● apertureSize表示Sobel算子的孔徑大小。

● L2gradient為計算圖像梯度幅度(gradient magnitude)的辨別。其預設值為False。

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg")

v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)

res = np.hstack((v1,v2))
cv_show1('res',res)
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

9、圖像金字塔

1、高斯金字塔下采樣 cv2.pyrDown()

cv2.pyrDown()函數首先對原始圖像進行高斯變換,再通過抛棄偶數行和偶數列實作下采樣。

dst_img:目标圖像

src_img:原始圖像

dstsize:目标圖像大小。 預設行和列都會變成原始圖像行和列的1/2, 整幅圖像會變成原始圖像的1/4。

2、高斯金字塔上采樣 cv2.pyrUp()

cv2.pyrUp() 函數首先在原始圖像的每個像素的右側和下側分别插入零值列和零值行,得到一個偶數行,偶數列(新增的行和列)都是零值的新圖,在進行高斯變換,得到上采樣的結果圖像。

dst_img:目标圖像

src_img:原始圖像

dstsize:目标圖像大小。 預設行和列都會變成原始圖像行和列的2倍, 整幅圖像會變成原始圖像的4倍。

3、拉普拉斯金字塔

拉普拉斯金字塔的目的就是為了恢複高分辨率的圖像。

關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

4、代碼

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    
img = cv2.imread("D:/code/data/AM.png")

down= cv2.pyrDown(img)
up=cv2.pyrUp(img)

down_up=cv2.pyrUp(down)
l_1=img-down_up
cv_show1('img',img)
cv_show1('down',down)
cv_show1('up',up)
cv_show1('l_1',l_1)
           

10、圖像輪廓

1、cv2.findContours()

輸入變量:

mode:輪廓檢索模式

RETR_EXTERNAL :隻檢索最外面的輪廓;

RETR_LIST:檢索所有的輪廓,并将其儲存到一條連結清單當中;

RETR_CCOMP:檢索所有的輪廓,并将他們組織為兩層:頂層是各部分的外部邊界,第二層是空洞的邊界;

RETR_TREE:檢索所有的輪廓,并重構嵌套輪廓的整個層次;

method:輪廓逼近方法

CHAIN_APPROX_NONE:以Freeman鍊碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)。

CHAIN_APPROX_SIMPLE:壓縮水準的、垂直的和斜的部分,也就是,函數隻保留他們的終點部分。

輸出變量:

contours:一個包含了圖像中所有輪廓的list對象。其中每一個獨立的輪廓資訊以邊界點坐标(x,y)的形式儲存在numpy數組中。

hierarchy:一個包含4個值的數組:[Next, Previous, First Child, Parent],一般不使用hierarchy。

2、cv2.drawContours()

顯示函數

參數說明:

第一個參數是圖像,第二個參數輪廓資訊的python 清單,第三個參數是輪廓索引,第四個是輪廓顔色,還有厚度 等等。

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    
img = cv2.imread("D:/code/jupyter_code/data/contours.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv_show1('thresh',thresh)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

#傳入繪制圖像,輪廓,輪廓索引,顔色模式,線條厚度
# 注意需要copy,要不原圖會變。。。
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
cv_show1('res',res)
           

11、傅裡葉變換

1、傅裡葉變換

傅裡葉變換的作用:

  • 高頻:變化劇烈的灰階分量,例如邊界
  • 低頻:變化緩慢的灰階分量,例如一片大海
  • 低通濾波器:隻保留低頻,會使得圖像模糊
  • 高通濾波器:隻保留高頻,會使得圖像細節增強

opencv中主要就是cv2.dft()和cv2.idft(),輸入圖像需要先轉換成np.float32 格式。

得到的結果中頻率為0的部分會在左上角,通常要轉換到中心位置,可以通過shift變換來實作。

cv2.dft()傳回的結果是雙通道的(實部,虛部),通常還需要轉換成圖像格式才能展示(0,255)。

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
# 顯示函數
def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg",0)
img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 得到灰階圖能表示的形式
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

2、低通

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
# 顯示函數
def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg",0)
img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2)     # 中心位置

# 低通濾波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# IDFT
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.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show()  
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

3、 高通

import cv2 #opencv讀取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
# 顯示函數
def cv_show1(name, img):  # 長寬高
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("D:/code/jupyter_code/data/lena.jpg",0)
img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2)     # 中心位置

# 高通濾波
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0

# IDFT
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.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show()  
           
關于OpenCV的一些圖像處理函數關于OpenCV的一些圖像處理函數前言一、Opencv常用圖像處理函數彙總總結

總結