OpenCV笔记(4)(直方图、傅里叶变换、高低通滤波)
一、直方图
用于统计图片中各像素值:
# 画一个图像各通道的直方图
def draw_hist(img):
color = ('b', 'g', 'r')
for i, col in enumerate(color):
hist = cv.calcHist([img], [i], None, [256], [0, 256])
# print(hist.shape)
plt.plot(hist, color=col)
plt.xlim([0, 256])
plt.show()

计算直方图时使用mask:
# 使用掩码
def draw_hist_with_mask(img):
mask = np.zeros(img.shape[:2], np.uint8)
mask[50:200, 100:350] = 255
cv.imshow('mask', mask) # 将掩码转换为bool类型
bi_mask = (mask == 255)
# 将掩码作用于原图上
cv.imshow('masked img', img * bi_mask[:, :, np.newaxis]) color = ('b', 'g', 'r')
for i, col in enumerate(color):
# 使用mask,只计算mask中的像素的直方图
hist = cv.calcHist([img], [i], mask, [256], [0, 256])
# print(hist.shape)
plt.plot(hist, color=col)
plt.xlim([0, 256])
plt.show()

直方图均衡:

# 直方图均衡
def equal_hist(image):
image = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
equ = cv.equalizeHist(image)
plt.hist(image.ravel(), 256)
plt.hist(equ.ravel(), 256)
plt.show()

图中蓝色部分为原图的直方图,橙色部分为均衡后的直方图,均衡前后的效果如下图所示:

CLAHE(限制对比度自适应直方图均衡):
# 自适应直方图均衡化
def CLAHE_proc(image):
'CLAHE:限制对比度自适应直方图均衡'
# 先转换为灰度图像
image = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
# 创建CLAHE分块
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 执行CLAHE均衡化
res_clahe = clahe.apply(image)
cv.imshow('res_clahe', res_clahe) # 对比普通均衡化
equ = cv.equalizeHist(image)
cv.imshow('equ', equ)

左图为CLAHE效果,右图为普通均衡化效果。CLAHE可以减少过爆或过暗,因为他不是基于整张图片来均衡。
二、傅里叶变换
通过傅里叶变换,我们可以将图像从空间域转换到频率域,然后在频率域中对其进行滤波,主要有高通滤波和低通滤波。
概念:
高频:变化剧烈的灰度分量,例如边界
低频:变化缓慢的灰度分量
高通滤波器:只保留高频,过滤出边界
低通滤波器:只保留低频,使图像变模糊
空间域转频率域:
# 将图像从空间域转换为频率域
def fourier_trans(img):
# 使用灰度图像
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
# uint8转换为float32
img_float32 = np.float32(img)
# 傅里叶转换为复数
dft = cv.dft(img_float32, flags=cv.DFT_COMPLEX_OUTPUT)
# 将低频从左上角转换到中心
dft_shift = np.fft.fftshift(dft)
# 转换为可以显示的图片(频谱图)
magnitude_spectrum = 20 * np.log(cv.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) # 使用plt展示原图的灰度图
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()

频率域转回空间域(并实验低通和高通滤波):
低频滤波:
# 从频率域转换回空间域(并使用低通滤波)
def fourier_trans_back(img):
# 使用灰度图像
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
# uint8转换为float32
img_float32 = np.float32(img)
# 傅里叶转换为复数
dft = cv.dft(img_float32, flags=cv.DFT_COMPLEX_OUTPUT)
# 将低频从左上角转换到中心
dft_shift = np.fft.fftshift(dft) # 在这里进行低通滤波
rows, cols = img.shape
c_row, c_col = int(rows / 2), int(cols / 2)
mask_low = np.zeros_like(dft_shift, np.uint8)
mask_low[c_row - 30:c_row + 30, c_col - 50:c_col + 50] = 1
# 使用低通滤波
fshift_low = dft_shift * mask_low
# 转换为可以显示的图片(fshift_low),fshift_low中包含实部和虚部
magnitude_spectrum_low = 20 * np.log(cv.magnitude(fshift_low[:, :, 0], fshift_low[:, :, 1])) f_ishift_low = np.fft.ifftshift(fshift_low)
img_back_low = cv.idft(f_ishift_low)
img_back_low = cv.magnitude(img_back_low[:, :, 0], img_back_low[:, :, 1]) # 使用plt低通滤波后的图像
plt.subplot(121)
plt.imshow(img_back_low, cmap='gray')
plt.title('Output Image')
plt.xticks([])
plt.yticks([])
# 展示低通滤波后的频谱图
plt.subplot(122)
plt.imshow(magnitude_spectrum_low, cmap='gray')
plt.title('magnitude_spectrum')
plt.xticks([])
plt.yticks([])
plt.show()

高频滤波:
# 从频率域转换回空间域(并使用高通滤波)
def fourier_trans_back(img):
# 使用灰度图像
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
# uint8转换为float32
img_float32 = np.float32(img)
# 傅里叶转换为复数
dft = cv.dft(img_float32, flags=cv.DFT_COMPLEX_OUTPUT)
# 将低频从左上角转换到中心
dft_shift = np.fft.fftshift(dft) # 在这里进行高通滤波
rows, cols = img.shape
c_row, c_col = int(rows / 2), int(cols / 2)
mask_high = np.ones_like(dft_shift, np.uint8)
mask_high[c_row - 30:c_row + 30, c_col - 50:c_col + 50] = 0
# 使用高通滤波
fshift_high = dft_shift * mask_high
# 转换为可以显示的图片(fshift_high),fshift_high中包含实部和虚部
magnitude_spectrum_high = 20 * np.log(cv.magnitude(fshift_high[:, :, 0], fshift_high[:, :, 1])) f_ishift_high = np.fft.ifftshift(fshift_high)
img_back_high = cv.idft(f_ishift_high)
img_back_high = cv.magnitude(img_back_high[:, :, 0], img_back_high[:, :, 1]) # 使用plt高通滤波后的图像
plt.subplot(121)
plt.imshow(img_back_high, cmap='gray')
plt.title('Output Image')
plt.xticks([])
plt.yticks([])
# 展示高通滤波后的频谱图
plt.subplot(122)
plt.imshow(magnitude_spectrum_high, cmap='gray')
plt.title('magnitude_spectrum')
plt.xticks([])
plt.yticks([])
plt.show()

OpenCV笔记(4)(直方图、傅里叶变换、高低通滤波)的更多相关文章
- 机器学习进阶-直方图与傅里叶变换-傅里叶变换(高低通滤波) 1.cv2.dft(进行傅里叶变化) 2.np.fft.fftshift(将低频移动到图像的中心) 3.cv2.magnitude(计算矩阵的加和平方根) 4.np.fft.ifftshift(将低频和高频移动到原来位置) 5.cv2.idft(傅里叶逆变换)
1. cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 进行傅里叶变化 参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法 ...
- OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在数 ...
- python实现直方图均衡化,理想高通滤波与高斯低通滤波
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...
- opencv笔记4:模板运算和常见滤波操作
time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...
- Opencv笔记(二十一)——傅里叶变换
参考 Numpy 中的傅里叶变换 首先我们看看如何使用 Numpy 进行傅里叶变换.Numpy 中的 FFT 包可以帮助我们实现快速傅里叶变换.函数 np.fft.fft2() 可以对信号进行频率转换 ...
- 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...
- opencv笔记6:角点检测
time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
- OpenCV成长之路(7):图像滤波
滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号.其中像素点灰度值的高低代表信号的强弱. 高频:图像中灰度变化剧烈的点. 低频:图像中平坦的,灰度变化不大的点. 根据图像的高频与 ...
- opencv笔记5:频域和空域的一点理解
time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...
随机推荐
- Hadoop系列读书笔记
<Hadoop应用架构>是Orilley旗下精品系列的图书 Hadoop序列化 Thrift 不支持内部压缩 不能分片 缺少MapReduce的原生支持 Protocol Buffers ...
- 什么是云数据库RDS PPAS 版
云数据库PPAS版,是阿里云与EnterpriseDB公司合作基于PostgreSQL高度兼容Oracle语法的数据库服务,为用户提供易于操作的迁移工具,兼容范围涵盖:PL/SQL.数据类型.高级函数 ...
- 依赖作用域之<scope>test</scope>
经常在代码中看到依赖的作用域为<scope>test</scope>,它的作用是,只能在test目录(通过右键->Make Directory as->Test S ...
- 关于maven自动部署tomcat9 步骤
maven 自动部署tomcat9 (远程方法) 1.首先要去配置用户,在tomcat的conf中有tomcat_users.xml,在其中有tomcat-user的配置 配置:<tommcat ...
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- 屏幕的遮挡层,js得到屏幕宽高、页面宽高 (window.screen.availHeight)等--
window.screen.availWidth 返回当前屏幕宽度(空白空间) ------当手机有输入法的时候,要注意................window.screen.availHeigh ...
- 数据结构(三) 树和二叉树,以及Huffman树
三.树和二叉树 1.树 2.二叉树 3.遍历二叉树和线索二叉树 4.赫夫曼树及应用 树和二叉树 树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱. ...
- 基于IdentityServer4的声明的授权
## 概述 基于Asp.net Core 1.1 ,使用IdentityServer4认证与授权. ## 参考资料 [微软教程](https://docs.microsoft.com/zh-cn/as ...
- O010、动手实践虚拟网络
参考https://www.cnblogs.com/CloudMan6/p/5296573.html 本节将演示如何在实验环境中实现下图所示的虚拟网络
- Js阻止冒泡,Vue中如何阻止冒泡事件
js解决冒泡:event.stopPropagation() vue解决冒泡: 事件.stop,例如:@click.stop="" ,@mouseover.stop="& ...