OpenCV 11~13 傅立叶变换、画图、直方图???

11 傅立叶变换

11.1 傅立叶变换基础理论

分开高低频率,取出需要的频率,逆变换。


11.2 numpy实现傅立叶变换

  1. 获取频谱:numpy.fft.fft2
  2. 将零频率分量移动到频谱中心:numpy.fft.fftshift()
  3. 20*np.log(np.abs(fshift))
import cv2 
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')
f = np.fft.fft2(img)  # 数组
fshift = np.fft.fftshift(f)  # 低频移动到中心
r = 20*np.log(np.abs(fshift))  # 0~255
plt.subplot(121)
plt.mshow(img,cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122)
plt.mshow(r,cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()

11.3 numpy实现逆傅立叶变换

  1. 逆傅立叶变换:通过频谱得到原始图像。
  2. numpy.fft.ifft2
  3. numpy.fft.ifftshift()
  4. iimg = np.abs(逆傅立叶变换结果) # 0~255
import cv2 
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')

f = np.fft.fft2(img)         # 傅立叶变换得到复数数组
fshift = np.fft.fftshift(f)  # 低频移动到中心
ishift = np.fft.ifftshift(fshift)  # 低频由中心移动到左上角
iimg = np.fft.ifft2(ishift)  # 逆傅立叶变换
iimg = np.abs(iimg)          # 0~255


plt.subplot(121)
plt.mshow(img,cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122)
plt.mshow(r,cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()

11.4 高通滤波

  1. 在频域进行高通滤波
  2. 傅立叶变换–>高低频率–> 处理高低频 -->逆傅立叶变换
  3. 图像增强、去噪、边缘检测、特征提取、压缩、加密
  4. 高通滤波保留边缘,去掉细节
  5. r,c = img.shape
  6. cr,cc = int(r/2),int(c/2)
  7. fshift[cr-30:cr+30,cc-30:cc+30] = 0 # 中心区域变成0
import cv2 
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')

f = np.fft.fft2(img)         # 傅立叶变换得到复数数组
fshift = np.fft.fftshift(f)  # 低频移动到中心

r,c = img.shape
cr,cc = int(r/2),int(c/2)
fshift[cr-30:cr+30,cc-30:cc+30] = 0  # 中心区域变成0

ishift = np.fft.ifftshift(fshift)  # 低频由中心移动到左上角
iimg = np.fft.ifft2(ishift)  # 逆傅立叶变换
iimg = np.abs(iimg)          # 0~255


plt.subplot(121)
plt.mshow(img,cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122)
plt.mshow(r,cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()

11.5 OpenCV实现傅立叶变换

  1. 结果的实数部分,结果的虚数部分 = cv2.dft(img,转换标识)
  2. 转换标识:flags = cv2.DFT_COMPLEX_OUTPUT 保证输出一个复数矩阵
  3. np.float32(img) 把输入图像转换成float32格式
  4. np.fft.fftshift() # 将低频移动到频谱中心
  5. 显示:返回值 = cv2.magnitude(参数1,参数2) # 数据转换到[0~255]
import cv2 
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)         # 傅立叶变换得到复数数组
dftshift = np.fft.fftshift(dft)  # 将低频移动到中心
r = 20*np.log(cv2.magnitude(dftshift[:,:,0],dftshift[:,:,1]))  # 把双通道转换成 0~255


plt.subplot(121)
plt.mshow(img,cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122)
plt.mshow(r,cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()

11.6 OpenCV实现逆傅立叶变换

  1. r = cv2.idft(原始数据)
  2. 返回值 = cv2.magnitude(参数1,参数2)
  3. np.fft.ifftshift()
import cv2 
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)         # 傅立叶变换得到复数数组
dftshift = np.fft.fftshift(dft)  # 将低频移动到中心
ishift = np.fft.ifftshift(dftshift)

iimg = cv2.idft(ishift)  
cv2.magnitude(iimg[:,:,0],iimg[:,:,1])

plt.subplot(121)
plt.mshow(img,cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122)
plt.mshow(r,cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()

11.7 低通滤波

  1. 在频域进行低通滤波
  2. 傅立叶变换–>高低频率–> 处理低频 -->逆傅立叶变换
  3. 低通滤波保留细节
  4. 图像增强、去噪、边缘检测、特征提取、压缩、加密
  5. r,c = img.shape
  6. cr,cc = int(r/2),int(c/2)
  7. mask = np.zeros((r,c),uibt8)
  8. mask[cr-30:cr+30,cc-30:cc+30] = 1 # 中心区域变成1
import cv2 
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('')

dft = np.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)         # 傅立叶变换得到复数数组
dftshift = np.fft.fftshift(dft)  # 低频移动到中心

r,c = img.shape
cr,cc = int(r/2),int(c/2)
mask = np.zeros((r,c),uibt8)
mask[cr-30:cr+30,cc-30:cc+30] = 1  # 中心区域变成1
fshift = dftshift*mask

ishift = np.fft.ifftshift(fshift)  # 低频由中心移动到左上角
iimg = cv2.idft.(ishift)  # 逆傅立叶变换
cv2.magnitude(iimg[:,:,0],iimg[:,:,1])         # 0~255


plt.subplot(121)
plt.mshow(img,cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122)
plt.mshow(r,cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()

12 画图

import cv2 
import numpy as np
imgshape = (500,500,3)
dst = np.zeros(imgshape,np.uint8)
cv2.line(dst,(100,100),(400,400),(0,0,255))
cv2.line(dst,(200,300),(400,800),(0,0,255),20,cv.LINE_AA)
# 绘制线段
cv2.line(dst,(100,100),(40,140),(0,0,255))
cv2.line(dst,(40,140),(400,380),(255,0,0))
cv2.line(dst,(400,380),(200,400),(0,255,0))
# 长方形
cv2.rectangle(dst,[50,100],[150,400],(0,0,255),20)
# 圆
cv2.circle(dst,(100,100),(100,90),0,0,90,20,(0,0,255),-1)
# 椭圆
cv2.ellipse(dst,(),(),0,0,180,)
cv2.imshow('dst',dst)
cv2.waitKey(3)
# 多边形
points = np.array([[100,100],[40,140],[200,300],[400,800]],np.uint8)
points = points.reshape((-1,1,2))
cv2.polylines(dst,[points],True,(0,255,255))
cv2.imshow('dst',dst)
cv2.waitKey(3)

# 4.10 文字图片绘制
import cv2 as cv
import numpy as np
img = cv2.imread('',1)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.rectangle(img,[50,100],[150,400],(0,0,255),20)
cv2.putText(img,'Hello LS',(100,300),font,1,(20,100,255),2,cv2.LINE_AA)

13 直方图

13.1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值