OpenCV常用基本处理函数(8)图像变换
傅里叶变换
傅里叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅里叶变换就表示f的频谱。
图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。
对于一个正弦信号,如果它的幅度变化非常快,我们可以说他是高频信号,如果变化非常慢,我们称之为低频信号。把这种想法应用到图像中,图像那里的频率变化非常大呢?边界点或者噪声。所以我们说边界和噪声是图像中的高频分量(高频是指灰度变化非常快,而非次数多,也可以说是图像灰度呈阶跃变化的区域)。没有大幅度变化我们称之为低频分量。除颗粒噪音外,图像细节的边缘、轮廓处都是灰度变化突变区域,它们都具有变换后的高频分量特征。
从物理效果看,傅里叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅里叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数。
傅里叶频谱图上我们看到的明暗不一的亮点,其意义是指图像上某一点与邻域点差异的强弱,即梯度的大小,(图像中的低频部分指低梯度的点)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅里叶变换后的频谱图,我们就可以直观地看出图像的能量分布:如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小);反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的、边界分明且边界两边像素差异较大的。
傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换(FFT)。
OpenCV 中相应的傅里叶变换和逆变换的函数是 cv2.dft() 和 cv2.idft()
其中得到结果之后还需要进行一次平移操作,通过np.fft.fftshift()进行平移,
下一步通过频率图构造振频谱(不是很懂);cv2.magnitude好像是合并两个不同方向的数据,例如x,y方向的梯度来形成整个图形的梯度;
import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('messi5.jpg',) dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
#构造振频谱
magnitude_spectrum = *np.log(cv2.magnitude(dft_shift[:,:,],dft_shift[:,:,])) plt.subplot(),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
HPF(高通滤波)将低频部分去除, LPF(低通滤波)将高频部分去除。其实就是对图像进行模糊操作,比如我们可以使用一个60x60 的矩形窗口(高斯窗口最佳)对图像进行掩模操作从而去除低频分量;
首先需要构建一个掩模,与低频区域对应的地方设置为 1, 与高频区域对应的地方设置为 0。
HPF包括sobal算子和拉普拉斯算子,使用此算子进行操作,达到计算梯度的目的,也可以说是边缘检测;
模板匹配
模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。OpenCV 为我们提供了函数:cv2.matchTemplate()。和 2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像和与其对应的输入图像的子区域进行比较。
具体匹配算法有多种;
多对象的模板匹配
import cv2
import numpy as np
from matplotlib import pyplot as plt img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',)
w, h = template.shape[::-] res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-]):
cv2.rectangle(img_rgb, pt, (pt[] + w, pt[] + h), (,,), ) cv2.imwrite('res.png',img_rgb)
效果如图:
霍夫变换
霍夫变换在检测各种形状的的技术中非常流行,如果你要检测的形状可以用数学表达式写出,你就可以是使用霍夫变换检测它。
参考自:opencv-python中文文档以及博客https://www.cnblogs.com/Undo-self-blog/p/8439279.html
OpenCV常用基本处理函数(8)图像变换的更多相关文章
- OpenCV常用数据结构和函数
点的表示:Point类 Point类数据结构表示二维坐标系下的点,即由其图像坐标x,y指定的2D点. 用法如下 Point point; point.x = 10; point.y = 8; 或者 P ...
- OpenCV常用基本处理函数(4)简单变换,阈值等
几何变换 缩放 img=cv2.imread('messi5.jpg') # 下面的 None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子 # 因此这里为 None res=cv2.res ...
- [opencv]常用阵列操作函数总结
/*=========================================================================*/ // 阵列操作 /*============ ...
- OpenCV常用基本处理函数(7)图像金字塔和直方图
高斯金字塔 高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的.顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值. 这样操作一次一个 MxN 的图像就变成了一个 M/2xN/ ...
- OpenCV常用基本处理函数(6)图像梯度
形态学转换 腐蚀 img = cv2.imread() kernel = np.ones((,),np.uint8) erosion = cv2.erode(img,kernel,iterations ...
- OpenCV常用基本处理函数(5)图像模糊
2D卷积操作 cv.filter2D() 可以让我们对一幅图像进行卷积操作, 图像模糊(图像平滑)使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音 ...
- OpenCV常用基本处理函数(3)颜色空间
颜色空间转换 对图像进行颜色空间转换,比如从 BGR 到灰度图,或者从BGR 到 HSV 等 我们要用到的函数是:cv2.cvtColor(input_image ,flag),其中 flag就是转换 ...
- OpenCV常用基本处理函数(2)图像基本操作
可以根据像素的行和列的坐标获取他的像素值.对 BGR 图像而言,返回值为 B,G,R 例如获取蓝色的像素值: img=cv2.imread('messi5.jpg')px=img[100,100]bl ...
- OpenCV常用基本处理函数(1)读写
图像的基本操作 cv.imread() 读取图片 cv.imshow() 显示图片 cv2.imwrite() 保存图像 使用摄像头捕获实时图像 OpenCV 为这中应用提供了 ...
随机推荐
- Erlang/Elixir精选-第4期(20191223)
精选文章 A digital symphony - The architecture of API Fortress. 使用Actor模型来支持基于微服务的大规模分布式软件架构.用实例解释了Actor ...
- http 换成 https
UPDATE SYS_MENU M SET M.href = ( SELECT CASE WHEN substr(N.href, 0, 5) = 'http:' THEN 'https:'||subs ...
- Delphi 自带了 Base64 编解码的单元
Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个单元提供两套四个公开函数: 对流的编解码: procedu ...
- git私立的代码库邀请合作者步骤
第一步,点击setting,如下图: 第二步输入对方的用户名,点击添加. 第三步拷贝链接给对方,等待对方访问加入. 对方访问后可以看到: 加入就可以了 然后对方可以看到:
- 树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数
/** * 树形数据提取节点 * @param {*} data */ export function treeDataGetnode (data) { var res = [] var child= ...
- Vue&webpack入门实践
目录 1. 下载安装Vue 2. Vue 2.1 Vue要素 2.2 指令 2.3 组件化 2.4 vue-router 3. webpack 3.1 webpack简介 3.2 四个核心概念 3.3 ...
- Hive SQL语法总结
Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作. Hive 查询操作过程严格遵守Hadoop MapReduce 的作业 ...
- apr not found,APR-util not found,pcre,
1.下载所需软件包(此下载链接经由作者验证可使用): wget http://archive.apache.org/dist/apr/apr-1.4.5.tar.gz wget http://arch ...
- day 52协程
协程进程线程: # 进程 启动多个进程 进程之间是由操作系统负责调用 # 线程 启动多个线程 真正被CPU执行的最小单位实际是线程 # 开启一个线程 创建一个线程 寄存器 堆栈 # 关闭一个线程 # ...
- 用vim写go代码——vim-go插件
GoImport:导入包 GoImport!:导入远程包 GoImportAs: 导入包并且重命名