Python傅里叶变换与霍夫变换

目录

傅里叶变换概述

霍夫变换概述

代码实现及效果展示


傅里叶变换概述

傅里叶变换(简称FT),常用于数字信号处理,它的目的是将时间域上的信号转变为频率域上的信号。傅里叶定理指出“任何连续的周期信号都可以表示成(或无线逼近)一系列正弦信号的叠加”。

 基于傅里叶变换的高通滤波和低通滤波,详见python实现图像添加噪声、噪声处理、滤波器代码实现_L888666Q的博客-CSDN博客

霍夫变换概述

霍夫变换是一种特征提取(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。经典的霍夫变换是侦测图片中的直线,之后,霍夫变换不仅能识别直线,也能够识别任何形状,常见的有圆形、椭圆形。

参数介绍:

image:输入8bit(灰度)图像,其内容可被函数所改变

circle_storage:检测到的圆存储仓,可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回,每个圆由三个浮点数表示:圆心坐标(x,y)和半径.).

method:Hough 变换方式,只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].

dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。

min_dist:该参数是让算法能明显区分的两个不同圆之间的最小距离。

param1:用于Canny的边缘阀值上限,下限被置为上限的一半。

param2:累加器的阀值。

min_radius:最小圆半径。

max_radius:最大圆半径。max_radius=0,max_radius值为图像最大尺寸值;max_radius<0,函数只返回圆心值,不返回半径值。

代码实现及效果展示

 傅里叶变换

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib

#读取图像
img = cv2.imread('2.bmp', 0)

#傅里叶变换
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
res1= 20*np.log(cv2.magnitude(dftshift[:,:,0], dftshift[:,:,1]))

#傅里叶逆变换
ishift = np.fft.ifftshift(dftshift)
iimg = cv2.idft(ishift)
res2 = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])

#设置字体
matplotlib.rcParams['font.sans-serif']=['SimHei']

#显示图像
fig = plt.figure(figsize=(10, 10))#设置大小
plt.subplot(131), plt.imshow(img, 'gray'), plt.title(u'(a)原始图像')
plt.axis('off')
plt.subplot(132), plt.imshow(res1, 'gray'), plt.title(u'(b)傅里叶变换处理')
plt.axis('off')
plt.subplot(133), plt.imshow(res2, 'gray'), plt.title(u'(b)傅里叶变换逆处理')
plt.axis('off')
plt.show()
fig.savefig('fig-fft.jpg',bbox_inches='tight')

霍夫变换

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

#读取图像
img = cv2.imread('3.jpg')

#灰度转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#显示原始图像
plt.subplot(121), plt.imshow(gray, 'gray'), plt.title('Input Image')
plt.axis('off')

#霍夫变换检测圆
circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20,param1=100, param2=50,minRadius=200, maxRadius=500)
print(circles1)

#提取为二维
circles = circles1[0, :, :]

#四舍五入取整
circles = np.uint16(np.around(circles))

#绘制圆
fig = plt.figure()#设置大小
for i in circles[:]: 
    cv2.circle(img, (i[0],i[1]), i[2], (0,0,255), 5) #画圆  第3个参数代表线的粗细;最后一个参数2代表画圆 3代表画菱形;
    cv2.circle(img, (i[0],i[1]), 10, (0,0,255), -1) #画圆心

#显示处理图像
plt.subplot(122), plt.imshow(img), plt.title('Result Image')
plt.axis('off')
plt.show()
fig.savefig('fig-houghCir.jpg',bbox_inches='tight')

CSDN话题挑战赛第2期
参赛话题:学习笔记

猜你喜欢

转载自blog.csdn.net/L888666Q/article/details/127212694