opencv——傅里叶变换、低通与高通滤波及直方图等操作

1、傅里叶变换

a、傅里叶变换原理

时域分析:以时间为参照进行分析。

频域分析:相当于上帝视角一样,看事物层次更高,时域的运动在频域来看就是静止的。

eg:投球——时域分析:第1分钟投了3分,第2分钟投了2分,第3分钟投了1分......第n分钟投了2分。

频域分析:每隔一分钟投一个3分球,每隔一分钟投一个2分球。

关于傅里叶变换详细描述可以参考知乎上的这篇文章:

文章链接:https://zhuanlan.zhihu.com/p/19763358

傅里叶变换的作用: 低频——变化缓慢的灰度分量

高频——变化剧烈的灰度分量

滤波: 低通滤波器——只保留低频,会使得图像模糊

高通滤波器——只保留高频,会使得图像细节增强

频域转换代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("lena.jpg",0)
img_float32=np.float32(img)
dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT)#图像转为频域,输入图像需要先转化为float32格式
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()

b、低通与高通滤波

低通滤波代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("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
fshift=dshift*mask
f_isift=np.fft.fftshift(fshift)
img_back=cv2.idft(f_ishift)#将图像转回去,和dft为互逆运算
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("result1")
plt.xticks()
plt.yticks()
plt.show()

高通滤波代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("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
fshift=dshift*mask
f_isift=np.fft.fftshift(fshift)
img_back=cv2.idft(f_ishift)#将图像转回去,和dft为互逆运算
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("result1")
plt.xticks()
plt.yticks()
plt.show()

2、直方图

图像像素点数值图

直方图

直方图:横坐标为像素值,从左到右即从0到255,纵坐标为每个像素值在图像中出现的次数。

单通道直方图代码:

import matplotlib.pyplot as plt
import cv2
img=cv2.imread("cat.jpg",0)#0代表灰度图
hist=cv2.calcHist([img],[0],None,[256],[0,256])#参数从左到右依次为图像、通道(012,BGR)、掩膜图像、histsize(BIN数量)、像素值范围
hist.shape
plt.hist(img.ravel(),256)
plt.show()

三个通道直方图代码:

img=cv2.imread("cat.jpg")
color=['b','g','r']
for i col in enumerate(color):
    histr=cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color=col)
    plt.xlim([0,256])
    plt..show()

3、掩膜图像

创建掩膜代码:

import numpy as np
mask=np.zeros(img.shape[:2],np.uint8)
mask[100:300,100:400]=255
cv2.imshow("mask",mask)
cv2.waitKey()
cv2.destroyAllWindows()

掩膜操作:

mask_img=cv2.bitwise_and(img,img,mask=mask)#与操作
cv2.imshow("mask_img",mask_img)
cv2.waitKey()
cv2.destroyAllWindows()

计算掩膜操作的直方图:

hist_mask=cv2.calcHist([img],[0],mask,[256],[0,256])
plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

4、直方图均衡化

a、均衡化原理及计算方法

均衡化:让原本分布不均衡的直方图在坐标轴上变得更为均衡,如下图所示。

原图像及直方图

均衡化后的图像及直方图

均衡化计算过程:

步骤1:原图像灰度值统计

步骤2:每个灰度的个数、概率及累积概率(累积概率:加上前面几个像素点的概率,如:0.1875+0.25=0.4375)

步骤3:累积概率*灰度值取值范围(0.25*(255-0))

步骤4:均衡化后的灰度值统计

b、均衡化代码及效果

均衡化前的直方图展示:

img=cv2.imshow("cat.jpg")
plt.hist(img.ravel(),256)
plt.show()

均衡化代码:

equ=cv2.equalizeHist(img)
plt.hist(img.ravel(),256)
plt.show()

自适应均衡化:

clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
res_clahe=clahe.apply(img)
res=np.hstack((img,equ,res_clahe))
cv2.imshow("res",res)
cv2.waitKey()
cv2.destroyAllWindows()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一瞬にして失う

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值