图片处理-opencv-12.图像傅里叶变换

图片处理-opencv-12.图像傅里叶变换,第1张

傅里叶变换(Fourier Transform,简称FT)常用于数字信号处理,它的目的是将时间域上的信号转变为频率域上的信号。随着域的不同,对同一个事物的了解角度也随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。同时,可以从频域里发现一些原先不易察觉的特征。傅里叶定理指出“任何连续周期信号都可以表示成(或者无限逼近)一系列正弦信号的叠加。”

傅里叶变换可以应用于图像处理中,经过对图像进行变换得到其频谱图。从谱频图里频率高低来表征图像中灰度变化剧烈程度。图像中的边缘信号和噪声信号往往是高频信号,而图像变化频繁的图像轮廓及背景等信号往往是低频信号。这时可以有针对性的对图像进行相关 *** 作,例如图像除噪、图像增强和锐化等。

Numpy中的fft模块,相关函数如下:

Numpy中的 FFT包提供了函数 npfftfft2()可以对信号进行快速傅里叶变换,其函数原型如下所示,该输出结果是一个复数数组(Complex Ndarry)。

fft2(a, s=None, axes=(-2, -1), norm=None)

频率分布图谱,其中越靠近中心位置频率越低,越亮(灰度值越高)的位置代表该频率的信号振幅越大

傅里叶逆变换,是傅里叶变换的逆 *** 作,将频谱图像转换为原始图像的过程。通过傅里叶变换将转换为频谱图,并对高频(边界)和低频(细节)部分进行处理,接着需要通过傅里叶逆变换恢复为原始效果图。频域上对图像的处理会反映在逆变换图像上,从而更好地进行图像处理。

图像逆傅里叶变换主要使用的函数如下所示:

OpenCV 中相应的函数是cv2dft()和用Numpy输出的结果一样,但是是双通道的。第一个通道是结果的实数部分,第二个通道是结果的虚数部分,并且输入图像要首先转换成 npfloat32 格式。其函数原型如下所示:

dst = cv2dft(src, dst=None, flags=None, nonzeroRows=None)

由于输出的频谱结果是一个复数,需要调用cv2magnitude()函数将傅里叶变换的双通道结果转换为0到255的范围。其函数原型如下:

cv2magnitude(x, y)

OpenCV 中,通过函数cv2idft()实现傅里叶逆变换,其返回结果取决于原始图像的类型和大小,原始图像可以为实数或复数。其函数原型如下所示:

dst = cv2idft(src[, dst[, flags[, nonzeroRows]]])

傅里叶变换的目的并不是为了观察图像的频率分布(至少不是最终目的),更多情况下是为了对频率进行过滤,通过修改频率以达到图像增强、图像去噪、边缘检测、特征提取、压缩加密等目的。

过滤的方法一般有三种:低通(Low-pass)、高通(High-pass)、带通(Band-pass)。

高通滤波器是指通过高频的滤波器,衰减低频而通过高频,常用于增强尖锐的细节,但会导致图像的对比度会降低。该滤波器将检测图像的某个区域,根据像素与周围像素的差值来提升像素的亮度。

低通滤波器是指通过低频的滤波器,衰减高频而通过低频,常用于模糊图像。低通滤波器与高通滤波器相反,当一个像素与周围像素的插值小于一个特定值时,平滑该像素的亮度,常用于去燥和模糊化处理。

回答你的问题费老大劲了,opencv用的不熟

我运行输出:

row=14,col=5

14 5 248 242 234 237

gray2 crop: 220 232 219 5

中心点坐标(109,108),宽高(w=218, h=217)

[95, 134] [83, 173]

斜率k= 325

#解题思路:因为我下载的你的,黑色周围还有白色,所以先去除了周围的白色,保证只有黑色部分

#对转灰度图,这样方便计算,每个像素点的值就是一个0-255的值,0为黑色,255为白色

#然后获得灰度图的row和col,与正常思维的width和height相反,row对应height,col对应width

#遍历row和col,先获得第一个白点,再获得最后一个白点,然后根据这两个坐标执行tan计算斜率k值

#读取图像

img2 = cv2imread("/img/blackWhitepng")

#转成单通道黑白图

gray = cv2cvtColor(img2, cv2COLOR_BGR2GRAY)

cv2imshow('img2', img2)

cv2imshow('gray', gray)

sp = grayshape

rows = sp[0]

cols = sp[1]

cr = 0

cl = 0

#裁剪左边和上边空白

for row in range(rows):

    isBreak = False

    for col in range(cols):

        if gray[row, col]==0:

            cr = row

            cl = col

            print("\nrow=%d,col=%d"%(row, col))

            isBreak = True

            break

        #print(gray[row, col], end='')

        #if(col==cols-1):

            #print("\nrow=%d,col=%d-------------------------------"%(row, col))

    if isBreak==True:

        break

print (cr, cl, rows, cols, rows-cr, cols-cl)

gray2 = gray[cr:rows-cr, cl:cols-cl]

cv2imshow('gray2', gray2)

#裁剪右下角空白

sp = gray2shape

rows = sp[0]

cols = sp[1]

row = rows-1

print ("gray2 crop:", rows, cols, row, col)

while row!=0:

    isBreak = False

    col = cols - 1

    while col!=0:

        if gray2[row,col]==0:

            isBreak = True

            break

        col-=1

    if isBreak==True:

        break

    row-=1

gray3 = gray2[0:row+1, 0:col+1]

cv2imshow('gray3', gray3)

#对裁剪后的gray3求中心点坐标

sp = gray3shape

rows = sp[0]

cols = sp[1]

x = cols//2

y = rows//2

print("中心点坐标(%d,%d),宽高(w=%d, h=%d)"%(x,y,cols,rows))

#求斜率 (y2-y1)/(x2-x1)

#遍历出第一个白点和最后一个白点,做计算

x1y1=[]

x2y2=[]

#求第一个白点坐标

for row in range(rows):

    isBreak = False

    for col in range(cols):

        if gray3[row,col]==255:

            x1y1append(col)

            x1y1append(row)

            isBreak = True

            break

    if isBreak==True:

        break

#求最后一个白点坐标

row = rows-1

while row!=0:

    isBreak = False

    col = cols - 1

    while col!=0:

        if gray2[row,col]==255:

            x2y2append(col)

            x2y2append(row)

            isBreak = True

            break

        col-=1

    if isBreak==True:

        break

    row-=1

print(x1y1,x2y2)

#计算斜率tan值

k = abs(x2y2[1]-x1y1[1])/abs(x2y2[0]-x1y1[0])

print("斜率k=",k)

cv2waitKey(0)

cv2destroyAllWindows()

每一幅图像都包含某种程度的噪声,噪声可以理解为由一种或者多种原因造成的灰 度值的随机变化,如由光子通量的随机性造成的噪声等,在大多数情况下,通过平滑技术(也常称为滤波技术)进行抑制或者去除, 其中具备保持边缘(Edge Preserving)作用的平滑技术得到了更多的关注。常用的平滑处理算法包括基于二维离散卷积的高斯平滑、均值平滑,基于统计学方法的中值平滑,具备保持边缘作用的平滑算法的双边滤波、导向滤波等。

I与K的二维离散卷积的计算步骤如下。

显然,高为H1、宽为W1的矩阵I与高为H2、宽为W2的卷积核K 的full卷积结果是一 个高为 H1+H2-1 、宽为 W1+W2-1 的矩阵,一般H2 ≤H1,W2 ≤W1。

从full卷积的计算过程可知, 如果Kflip靠近I 的边界, 那么就会有部分延伸到I之外而导致访问到未定义的值, 忽略边界,只是考虑I能完全覆盖Kflip内的值的情况, 该过程称为valid卷积。

当然, 只有当H2≤H1且W2≤W1时才会存在 valid卷积 。

为了使得到的卷积结果和原图像的高、宽相等,所以通常在计算过程中给Kflip指定 一个“锚点”, 然后将“锚点”循环移至图像矩阵的(r, c) 处, 其中0≤r< H1, 0≤c<W1,接下来对应位置的元素逐个相乘,最后对所有的积进行求和作为输出图像矩阵在 (r, c) 处的输出值。这个卷积过程称为same卷积,

大部分时候,为了更方便地指定卷积核的锚点,通常卷积核的宽、高为奇数,那么可以简单地令中心点为锚点的位置。same卷积是full卷积的一部分,而如果valid卷积存在,那么valid卷积是same卷积的一部分。

对于full卷积和same卷积,矩阵I 边界处的值由于缺乏完整的邻接值,因此卷积运算 在这些区域需要特殊处理,方法是进行边界扩充,有如下几种常用方式。

利用上述不同的边界扩充方式得到的same卷积只是在距离矩阵上、下、左、右四个边界小于卷积核半径的区域内值会不同,所以只要在用卷积运算进行图像处理时,图像的重要信息不要落在距离边界小于卷积核半径的区域内就行。

如果一个卷积核至少由两个尺寸比它小的卷积核full卷积而成,并且在计算过程中在所有边界处均进行扩充零的 *** 作,且满足

其中kerneli的尺寸均比Kernel小,1≤i≤n,则称该卷积核是可分离的。

在图像处理中经常使用这样的卷积核,它可以分离为一维水平方向和一维垂直方向上的卷积核。

(1)full卷积性质

如果卷积核Kernel是可分离的, 且Kernel=kernel1★kernel2, 则有:

(2)same卷积性质

其中

其中,根据可分离卷积的性质,有

理解了上述高斯平滑的过程, 就可以明白OpenCV实现的高斯平滑函数:

从参数的设置可以看出, GaussianBlur 也是通过分离的高斯卷积核实现的,也可以令水平方向和垂直方向上的标准差不相同,但是一般会取相同的标准差。 当平滑窗口比较小时, 对标准差的变化不是很敏感, 得到的高斯平滑效果差别不大; 相反,当平滑窗口 较大时,对标准差的变化很敏感, 得到的高斯平滑效果差别较大 。

利用卷积核 的分离性和卷积的结合律,虽然减少了运算量,但是随着卷积核窗口的增加,计算量仍会继续增大,可以利用图像的积分,实现时间复杂度为O(1)的快速均值平滑。

即任意一个位置的积分等于该位置左上角所有值的和。 利用矩阵的积分,可以计算出矩阵中任意矩形区域的和。

中值滤波最重要的能力是去除椒盐噪声。椒盐噪声是指在图像传输系统中由于解码误差等原因,导致图像中出现孤立的白点或者黑点。

一般来说,如果图像中出现较亮或者较暗的物体,若其大小小于中值平滑的窗口半径,那么它们基本上会被滤掉,而较大的目标则几乎会原封不动地保存下来。

中值平滑需要对邻域中的所有像素点按灰度值排序, 一般比卷积运算要慢。

在OpenCV中同样通过定义函数:

此外, 中值平滑只是排序统计平滑中的一种, 如果将取邻域的中值变为取邻域中的 最小值或者最大值, 显然会使图像变暗或者变亮。 这类方法就是后面要介绍的形态学 处理的基础。

高斯平滑、均值平滑在去除图像噪声时,会使图像的边缘信息变得模糊,接下来就 介绍在图像平滑处理过程中可以保持边缘的平滑算法: 双边滤波和导向滤波。

双边滤波是根据每个位置的邻域, 对该位置构建不同的权重模板。 详细过程如下:

其中0≤h<winH, 0≤w<winW, 且每个位置的空间距离权重模板是相同的。

其中0≤h<winH, 0≤w<winW, 显然每个位置的相似性权重模板是不一样的。

整个过程只在第二步计算相似性权重模板时和双边滤波不同, 但是对图像平滑的效果, 特别是对纹理图像来说, 却有很大的不同。

扩展

循环引导滤波 是一种 迭代 的方法, 本质上是一种多次迭代的联合双边滤波, 只是每次计算相似性权重 模板的依据不一样——利用本次计算的联合双边滤波结果作为下一次联合双边滤波计算 相似性权重模板的依据。

导向滤波在平滑图像的基础上,有良好的保边作用, 而且在细节增强等方面都有良好的表现,在执行时间上也比双边滤波快很多。

以上就是关于图片处理-opencv-12.图像傅里叶变换全部的内容,包括:图片处理-opencv-12.图像傅里叶变换、python怎么在一群点集中,提取中心坐标、OpenCV C++(五)----图像平滑等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9775595.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存