【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』


【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法

4.3 纹理特征之频谱方法

傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性,因此可以基于傅里叶变换对纹理进行频谱分析。

纹理与图像频谱中的高频分量密切相关,纹理模式在频谱图表现为高能量的爆发。

傅里叶谱具有三个特征可以描述纹理的性质:

(1)傅里叶频谱中的突出峰值对应于纹理模式的主方向;
(2)频域图中的峰值位置对应于纹理模式在空间上的基本周期;
(3)通过滤波消除周期分量,用统计方法描述剩下的非周期性信号。

把傅里叶幅度谱转换到极坐标中表示为函数 S(r,θ)S(r,\theta)S(r,θ),可以简化对频谱特性的解释。S 是频谱函数,r 和 θ\thetaθ 是极坐标系的半径和角度坐标轴。S 对于每一个方向 θ\thetaθ 可以简化为一维函数 Sθ(r)S_{\theta}(r)Sθ(r);S 对于每一个半径 r 也可以简化为一维函数 Sr(θ)S_r(\theta)Sr(θ)

分别对一维函数 Sθ(r)S_{\theta}(r)Sθ(r)Sr(θ)S_r(\theta)Sr(θ) 积分,可以获得纹理频谱的全局描述:
S(r)=∑θ=0πSθ(r)S(θ)=∑r=1RSr(θ)S(r) = \sum_{\theta=0}^{\pi} S_{\theta}(r) \\ S(\theta) = \sum_{r=1}^{R} S_r (\theta) S(r)=θ=0πSθ(r)S(θ)=r=1RSr(θ)
如果纹理具有空间的周期性或确定的方向性,则一维函数 S(r)S(r)S(r)S(θ)S(\theta)S(θ) 在对应的频率具有峰值。


例程 14.13:特征描述之傅里叶频谱纹理分析

本例选自冈萨雷斯《数字图像处理(第四版)》P617 例11.14。一幅包含随机分布目标的图像和另一幅周期性排列目标的图像,在傅里叶变换的幅度谱具有不同的表现形式。

对于随机摆放和整齐摆放的物体图像,使用傅里叶频谱可以显示不同的图像,但直接分析频谱图像比较困难。将其转换到极坐标系中,用一维函数 S(r)S(r)S(r)S(θ)S(\theta)S(θ) 表示就非常直观。

对于随机摆放的火柴图像,函数 S(r)S(r)S(r) 曲线没有很强的周期分量;而对于整齐摆放的火柴图像,函数 S(r)S(r)S(r) 曲线在r=15、r=25 附近具有很强的峰值,对应于频谱图中的亮区域的周期性水平重复。类似地,随机摆放火柴图像的Sr(θ)S_r(\theta)Sr(θ) 曲线的分布混乱没有显著的峰值,而在整齐摆放的火柴图像中,Sr(θ)S_r(\theta)Sr(θ) 曲线在 θ=90o\theta = 90^oθ=90o 具有非常强烈的能量峰值,对应于频谱图中的水平方向的能量爆发。

    # 14.13 特征描述之纹理谱分析def halfcircle(radius, x0, y0):  # 计算圆心(x0,y0) 半径为 r 的半圆的整数坐标degree = np.arange(180, 360, 1)  # 因对称性可以用半圆 (180,)theta = np.float32(degree * np.pi / 180)  # 弧度,一维数组 (180,)xc = (x0 + radius * np.cos(theta)).astype(np.int)  # 计算直角坐标,整数yc = (y0 + radius * np.sin(theta)).astype(np.int)return xc, ycdef intline(x1, x2, y1, y2):  # 计算从(x1,y1)到(x2,y2)的线段上所有点的坐标dx, dy = np.abs(x2-x1), np.abs(y2-y1)  # x, y 的增量if dx==0 and dy==0:x, y = np.array([x1]), np.array([y1])return x, yif dx > dy:if x1>x2:x1, x2 = x2, x1y1, y2 = y2, y1m = (y2-y1) / (x2-x1)x = np.arange(x1, x2+1, 1)  #[x1,x2]y = (y1 + m*(x-x1)).astype(np.int)else:if y1>y2:x1, x2 = x2, x1y1, y2 = y2, y1m = (x2-x1) / (y2-y1)y = np.arange(y1, y2+1, 1)  # [y1,y2]x = (x1 + m*(y-y1)).astype(np.int)return x, ydef specxture(gray):# cv2.dft 实现图像的傅里叶变换height, width = gray.shapex0, y0 = int(height / 2), int(width / 2)  # x0=300, y0=300rmax = min(height, width) // 2 - 1  # rmax=299print(height, width, x0, y0, rmax)# FFT 变换 (youcans)gray32 = np.float32(gray)  # 将图像转换成 float32dft = cv2.dft(gray32, flags=cv2.DFT_COMPLEX_OUTPUT)  # 傅里叶变换,(600, 600, 2)dftShift = np.fft.fftshift(dft)  # 将低频分量移动到频域图像的中心sAmp = cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1])  # 幅度谱,中心化 (600, 600)sAmpLog = np.log10(1 + np.abs(sAmp))  # 幅度谱对数变换 (600, 600)# FFT 频谱沿半径的分布函数sRad = np.zeros((rmax,))  # (299,)sRad[0] = sAmp[x0, y0]for r in range(1, rmax):xc, yc = halfcircle(r, x0, y0)  # 半径为 r 的圆的整数坐标 (360,)sRad[r] = sum(sAmp[xc[i], yc[i]] for i in range(xc.shape[0]))  # (360,)sRadLog = np.log10(1 + np.abs(sRad))  # 极坐标幅度谱 youcans 对数变换# FFT 频谱沿角度的分布函数xmax, ymax = halfcircle(rmax, x0, y0)  # 半径为 xupt 的圆的整数坐标 (360,)sAng = np.zeros((xmax.shape[0],))  # (360,)for a in range(xmax.shape[0]):  # xmax.shape[0]=(360,)xr, yr = intline(x0, xmax[a], y0, ymax[a])  # 从(x0,y0)到(xa,ya)线段所有点的坐标 (300,)sAng[a] = sum(sAmp[xr[i], yr[i]] for i in range(xr.shape[0]))  # (360,)return sAmpLog, sRadLog, sAng# 纹理的傅里叶频谱分析gray1 = cv2.imread("../images/Fig1135a.tif", flags=0)  # flags=0 读取为灰度图像gray2 = cv2.imread("../images/Fig1135b.tif", flags=0)sAmpLog1, sRadLog1, sAng1 = specxture(gray1)  # 图像纹理的频谱分析sAmpLog2, sRadLog2, sAng2 = specxture(gray2)print(sAmpLog1.shape, sRadLog1.shape, sAng1.shape)plt.figure(figsize=(9, 6))plt.subplot(241), plt.axis('off'), plt.title("Random matches"), plt.imshow(gray1, 'gray')plt.subplot(242), plt.axis('off'), plt.title("Amp spectrum"), plt.imshow(sAmpLog1, 'gray')plt.subplot(243), plt.axis('off'), plt.title("Arranged matches"), plt.imshow(gray2, 'gray')plt.subplot(244), plt.axis('off'), plt.title("Amp spectrum"), plt.imshow(sAmpLog2, 'gray')plt.subplot(245), plt.plot(sRadLog1), plt.title("S1 (radius)"), plt.xlim(0,300), plt.yticks([])plt.subplot(246), plt.plot(sAng1), plt.title("S1 (theta)"), plt.xlim(0,180), plt.yticks([])plt.subplot(247), plt.plot(sRadLog2), plt.title("S2 (radius)"), plt.xlim(0,300), plt.yticks([])plt.subplot(248), plt.plot(sAng2), plt.title("S2 (theta)"), plt.xlim(0,180), plt.yticks([])plt.tight_layout()plt.show()

在这里插入图片描述



【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125704655)
Copyright 2022 youcans, XUPT
Crated:2022-7-10

231. 特征描述之 灰度共生矩阵(GLCM)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码,测试连接,若通过说明成功;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念,是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、图像编…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM) 4.2.4 灰度共生矩阵(GLCM) 灰度共生矩阵(Gray level co-occurrence matrix,GLCM&#xff…

oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问

ODM FINDING:FROM http://www.os2ora.com/how-to-analyze-awr-report-1/ 推荐 kaya 的这篇文章引用如下:如果关注数据库的性能,那么当拿到一份AWR报告的时候,最想知道的第一件事情可能就是系统资源的利用情况了,而首当其冲的&am…

【OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV) 主成分分析(Principal Components Analysis,PCA)是一种基于统计的数据降维方法,又称主…

swoole 捕捉php错误,swoole怎么处理错误

在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获,不得跨协程捕获异常。不仅是应用层throw的Exception,底层的一些错误也是可以被捕获的,如function、class、method不存在下面的代码中,try/catch和throw在不同的协程…

【OpenCV 例程200篇】235. 特征提取之主成分分析(sklearn)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】235. 特征提取之主成分分析(sklearn) 特征提取是指从原始特征中通过数学变换得到一组新的特征,以降低特征维数,消除相关性,减少无用信息…

Linux 进程资源分配,linux 进程管理和内存分配

1、进程相关概念进程:正在运行中的程序内核功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等Process:运行中的程序的一个副本,是被载入内存的一个指令集合进程 ID(Process ID,PID)号码被用来标记各…

【OpenCV 例程300篇】234. 特征提取之主成分分析(PCA)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】234. 特征提取之主成分分析(PCA) 5.1 特征提取的方法 初步获取的图像特征维数通常很大,而且往往包含一定的无关或冗余特征。特征提取是指从原始特征中通过数学变…

Java并发编程基础

线程的简介 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 为什么要使用多线…

【OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV) 文章目录【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)5.2 主成分分析的数学方法5.4 OpenC…

linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...

环境:Vmware Workstation;CentOS-6.4-x86_64说明:1、将共享内存挂载至进程:void *shmat(int shmid, const void *shmaddr,int shmflg);参数shmid是要附加的共享内存区标示符。总是把参数shmaddr设为0。参数shmflg可以为SHM_RDON…

Java中锁的使用和实现

首先,我们要了解一个概念,JAVA中的锁到底是什么呢? 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 Lock接口 在Java SE 5之后,并发包中新增了Lock接口&am…

【OpenCV 例程200篇】225. 特征提取之傅里叶描述子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】225. 特征提取之傅里叶描述子 目标特征的基本概念 通过图像分割获得多个区域,得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标,目标所处的区域就是目…

【OpenCV 例程300篇】238. OpenCV 中的 Harris 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】238. OpenCV 中的 Harris 角点检测 角是直线方向的快速变化。角点通常被定义为两条边的交点,或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测&…

基础线性规划实现(matlab,lingo)

目录 一、本次所需解的问题 二、matlab解题 1)语法 2)数学思维 3)matlab解题 运行结果: 三、lingo解题 lingo解题如下: 运行结果: 最后: 一、本次所需解的问题 需解出下面该线性规划问…

cwntos linux kde桌面,Centos如何安装KDE的桌面

其实KDE其实在初次安装系统的时候就可以选择,我下面是进入系统后的安装方法:第一步:检查KDE首先查看自己是否安装了KDE# yum grouplist在grouplist的输出结果中的“Installed Groups:”部分中,如果你能找到“X Window System”和“…

【OpenCV 例程 300篇】239. Harris 角点检测之精确定位(cornerSubPix)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】239. Harris 角点检测之精确定位(cornerSubPix) 角是直线方向的快速变化。角点通常被定义为两条边的交点,或者说角点的邻域应该具有两个不同区域的不同方向的边界…

基础线性规划实现---python

目录 一、问题 何为线性规划问题: 二、python进行求解 1.通过观察matlab解线性规划步骤进行求解 2.python求解步骤 1)求解用到的模块(scipy 和 numpy): 2)对 max z2x13x2-5x3 该问题确定c如下&…

【OpenCV 例程 300篇】240. OpenCV 中的 Shi-Tomas 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】240. OpenCV 中的 Shi-Tomas 角点检测 角是直线方向的快速变化。角点通常被定义为两条边的交点,或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测…