# opencv图像读取的格式是BGR
# matplotlib读取图像的格式是RGB
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()

1 直方图

cv2.calcHist(images,channels,mask,histSize,ranges)

  • images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
  • channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
  • mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
  • histSize:BIN 的数目。也应用中括号括来
  • ranges: 像素值范围常为 [0,256]
img = cv2.imread("cat.jpg",0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape
(256, 1)
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]) 

mask操作

# 创建mask
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] = 255
cv_show("mask",mask)
plt.imshow(mask)
(414, 500)<matplotlib.image.AxesImage at 0x1eb6c520be0>

img = cv2.imread("cat.jpg", 0)
cv_show("image",img)
plt.imshow(img)
<matplotlib.image.AxesImage at 0x1eb6dfe65f8>

masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作cv_show("masked_img",masked_img)
plt.imshow(masked_img)
<matplotlib.image.AxesImage at 0x1eb6a0f65f8>

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

2 直方图均衡化

img = cv2.imread("clahe.jpg",0) #0表示灰度图 #clahe
plt.hist(img.ravel(),256);
plt.show()

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

res = np.hstack((img,equ))
cv_show("res",res)
plt.imshow(res)
<matplotlib.image.AxesImage at 0x1eb75a73780>

3 自适应直方图均衡化

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
res_clahe = clahe.apply(img)
res = np.hstack((img,equ,res_clahe))
cv_show("res",res)
plt.imshow(res)
<matplotlib.image.AxesImage at 0x1eb6e1e7cf8>

4 傅里叶变换

我们生活在时间的世界中,早上7:00起来吃早饭,8:00去挤地铁,9:00开始上班。。。以时间为参照就是时域分析。

但是在频域中一切都是静止的!

https://zhuanlan.zhihu.com/p/19763358

傅里叶变换的作用

  • 高频:变化剧烈的灰度分量,例如边界

  • 低频:变化缓慢的灰度分量,例如一片大海

滤波

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

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

  • opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32 格式。

  • 得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。

  • cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = 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)
# 得到灰度图能表示的形式
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()

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = 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# 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()

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# 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()


08 计算机视觉-opencv直方图与傅里叶变换相关推荐

  1. 【OpenCV 例程200篇】77. OpenCV 实现快速傅里叶变换

    [OpenCV 完整例程]77. OpenCV 实现快速傅里叶变换 欢迎关注 『OpenCV 完整例程 100 篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更 ...

  2. 【OpenCV 例程200篇】76. OpenCV 实现图像傅里叶变换

    [OpenCV 例程200篇]76. OpenCV 实现图像傅里叶变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  3. OpenCV实现基于傅里叶变换(FFT)的旋转文本校正(文字方向检测)

    OpenCV实现基于傅里叶变换的旋转文本校正 from: http://johnhany.net/2013/11/dft-based-text-rotation-correction/ 发布于 201 ...

  4. 基于OpenCV完成离散傅里叶变换

    基于OpenCV完成离散傅里叶变换 目标 学会使用函数: cv::copyMakeBorder() , cv::merge() , cv::dft() , cv::getOptimalDFTSize( ...

  5. OpenCV直方图比较Histogram Comparison

    OpenCV直方图比较Histogram Comparison 直方图比较Histogram Comparison 目标 理论 代码 这个程序做什么? 解释 结果 直方图比较Histogram Com ...

  6. 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...

    (7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...

  7. OpenCV系列之傅里叶变换 | 三十

    目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换 利用Numpy中可用的FFT函数 傅立叶变换的某些应用程序 我们将看到以下函数:cv.dft(),cv.idft()等 理论 傅立叶变 ...

  8. 使用OpenCV实现离散傅里叶变换(DFT)

    使用OpenCV实现离散傅里叶变换(DFT) 傅里叶变换,妈呀这个东东好高级啊!真的高级吗?理解起来还真是有点困难,需要一些高等数学的基础.有了OpenCV,你不理解也没问题,会用就OK!就好比你会用 ...

  9. 我是如何转型走上计算机视觉OpenCV开发之路的

    我是如何转型走上计算机视觉OpenCV开发之路的 2004年我大学毕业,学的是软件工程专业,第一份工作是在一家日资外包企业,无法忍受学习日语,忍无可忍无须再忍,干了八个月就跳槽啦,来到了第二家公司还是 ...

  10. OpenCV学习-P29-P32 Opencv直方图均衡化、掩膜

    OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜 1 直方图 2 直方图均衡化 3 直方图自适应均衡化 1 直方图 直方图原理:统计图像各个灰度区间的像素数 cv2.calcHist( ...

最新文章

  1. Swift基础之控制语句
  2. python echo函数_python如何调用php文件中的函数详解
  3. 大数据ab 测试_在真实数据上进行AB测试应用程序
  4. 大厂面试算法系列-如何实现链表的逆序(二)-递归法
  5. oracle三个配置文件详叙
  6. UDP数据包最大传输长度
  7. origin与matlab拟合的不同,Origin自定义模拟与matlab中cftool工具箱拟合结果比较 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  8. 计算机环境变量怎么恢复默认,环境变量怎么还原
  9. python教程-马哥教育官网-专业Linux培训班,Python培训机构
  10. Unity中的存档与读档
  11. 计算机系统原理,实验三:bomblab,汇编详解
  12. 10064---JVM GC 机制与性能优化
  13. 网易杭州研究院offer全过程(附加阿里巴巴笔经面经)
  14. nexus私服传项目-401 Unauthorized
  15. Java接口练习:求圆柱体和圆锥体的表面积和体积
  16. 2022年武汉市小微企业服务补贴券签约服务机构申报条件、材料和申报方式
  17. PulseSensor开发文档(二)动态阈值算法获取心率值
  18. 产品体验报告——百词斩
  19. 超声波测距模块(51单片机)
  20. C++11中=delete的巧妙用法

热门文章

  1. android 字符串 转json,Android将字符串转换为JSON
  2. Ubuntu1804安装ROS(melodic版本)
  3. 电脑计算机硬盘坏了如何修理,笔记本电脑硬盘坏了怎么修复怎么办
  4. JAVA九宫格拼图游戏怎么计时_九宫格拼图怎么拼 如何玩转九宫格拼图游戏
  5. sql创建和添加时间字段
  6. rs485转profinet网关485协议传报文解决方案远创智控
  7. magisk卸载内置软件_安卓刷XP框架 手机通用通用(Magisk+Riru+EdXposed)
  8. win7局域网ip切换工具内网外网多网段切换工具分享教程
  9. 尚硅谷-智慧校园项目总结(项目代码在最后)
  10. 伺服速度控制模式接线图_伺服控制的三种模式,接线方式与参数设置的讲解