OpenCV基础——傅里叶变换、角点检测

接上期:

OpenCV基础------轮廓检测、模板匹配、图像均衡化-CSDN博客


一.傅里叶变换

在生活中绝大多数事情都和时间相关,以时间为参照分析这些事情可以粗略理解为是时域分析。而傅里叶变换更关心事情发生的频率,即频域分析~在频域中事物是相对静止的。当然这里不涉及非常深刻的傅里叶变化理论知识,重点在于图像学方面的应用~

1.滤波器

滤波的作用就是保留一部分内容,且排除一部分内容:

  • 高频分量:变化剧烈的灰度分量,比如边界~
  • 低频分量:变化缓慢的灰度分量,比如一片大海~

如下面这张图,队徽内容及边界就是高频分量,而周围雾蒙蒙的红色背景为低频分量:

滤波器的选择:

  • 低频滤波器:只保留低频------图像会更加模糊
  • 高频滤波器:只保留高频------图像细节增强~

2.频域转换

两个函数,cv2.dft()和cv2.idft(),分别是转换为频域及其逆向操作~

3.图像处理

输入图像必须转换为np.float32的格式:

python 复制代码
import cv2
import numpy as np
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img=cv2.imread('D:\\Bayern.jpg',0)
img_float=np.float32(img)

转换为频域格式,并减低频域移动到中间的位置:

python 复制代码
dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift=np.fft.fftshift(dft)

对图像通过进行转换,并通过公式完成映射:

python 复制代码
magnitude_spectrum=20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

绘图:

python 复制代码
plt.subplot(121),plt.imshow(img,cmap='gray')
plt.subplot(122),plt.imshow(magnitude_spectrum,cmap='gray')
plt.show()

如下,越靠中间,频值越低:

4.掩膜

计算中心点位置,按照一定的长宽度勾画出来掩膜范围:

python 复制代码
rows,cols=img_float.shape
crow,cool=int(rows/2),int(cols/2)

5.低频

借助掩膜,黑色的都过滤掉,而白色的都留下~这里只将中间的部分设置为1,其余均为0~

python 复制代码
mask=np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30,cool-30:cool+30]=1
fshift=dft_shift*mask
f_ishift=np.fft.ifftshift(fshift)
img_back=np.fft.ifft2(f_ishift)
img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

低频滤波的效果是将图片变得模糊起来~

6.高频

反向,中间去掉,边缘保留,其余的部分一模一样:

python 复制代码
mask=np.ones((rows,cols,2),np.uint8)
mask[crow-30:crow+30,cool-30:cool+30]=0

只保留边界,中间部分的会模糊掉:

二.角点检测

在灰度图中,角点是指无论在水平方向还是垂直方向上,灰度级发生迅速变化的点位。

  • 平面:上图红色边框,无论垂直还是水平移动均无明显灰度变化
  • 边界:上图橙色边框,只在垂直一个方向上的变化较大
  • 角点:上图黄色边框,无论垂直还是水平变化都很大

在移动的过程中,通过移动后某一区域的像素点减去移动前区域的像素点,也即自相似性。这里数学原理不详细归纳。首先将图片读取为灰度图,这里还是用之前的户型图:

python 复制代码
import cv2
import numpy as np
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
img=cv2.imread('D:\\House.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.shape)

blockSize为角点检测中指定区域的大小,Ksize为sobel算子梯度检测时求偏导使用的窗口大小,k的取值为0.4或0.6都可以:

python 复制代码
dst=cv2.cornerHarris(gray,3,5,0.04)
print(dst.shape)

返回结果是每个点的自相似性:

在角点处用红色标记出来,这里判断是否为角点的公式要注意------即和自己图像中的最大值相比,并非所有图像都是某一固定值:

python 复制代码
img[dst>0.01*dst.max()]=[0,0,255]
cv_show(img,"img")
相关推荐
阿里云大数据AI技术12 分钟前
本体如何落地?阿里云 Milvus 把企业文档变成知识图谱和 Wiki
人工智能
QXWZ_IA28 分钟前
公安视频专网如何与定位数据融合?架构与实施要点
人工智能
小林ixn38 分钟前
GraphRAG 实战:用 Neo4j 知识图谱,让 RAG 从“找货“进化到“梳理关系“
人工智能·知识图谱·neo4j
敖老师44 分钟前
Dify 连局域网 Ollama 的两个坑:docker0 网段撞车,和请求里少掉的那个参数
人工智能
MocMoc1 小时前
从 0 到 1:把 Dify Chatflow 接进一个 qiankun 中后台
人工智能
总要学点什么1 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
田甲1 小时前
做一款 Type-C 母座读卡器:GL3224 双卡方案实测
c语言·开发语言
民乐团扒谱机1 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
严肃小白兔2 小时前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图