Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
频域同态滤波(Python和OpenCV)_Python_Python 3.x_Opencv_Image Processing_Opencv Python - Fatal编程技术网

频域同态滤波(Python和OpenCV)

频域同态滤波(Python和OpenCV),python,python-3.x,opencv,image-processing,opencv-python,Python,Python 3.x,Opencv,Image Processing,Opencv Python,所以,我需要构建一个同态过滤器,但我的代码似乎是错误的。我不知道这是执行还是python中的一些细节我不知道,但我知道这是错误的。我希望som能深入了解我能做些什么来改进它 我正在使用 图像作为输入参考,因为它在里卡多C.冈萨雷斯的DIP书上,我知道输出应该是什么样子。我甚至使用了书中在它的过滤器中使用的相同参数,但它不起作用 冈萨雷斯的输入和输出分别为: 我的输出: 我的代码如下: #编码:utf-8 进口cv2 将numpy作为np导入 从matplotlib导入pyplot作为plt

所以,我需要构建一个同态过滤器,但我的代码似乎是错误的。我不知道这是执行还是python中的一些细节我不知道,但我知道这是错误的。我希望som能深入了解我能做些什么来改进它

我正在使用

图像作为输入参考,因为它在里卡多C.冈萨雷斯的DIP书上,我知道输出应该是什么样子。我甚至使用了书中在它的过滤器中使用的相同参数,但它不起作用

冈萨雷斯的输入和输出分别为:

我的输出:

我的代码如下:

#编码:utf-8
进口cv2
将numpy作为np导入
从matplotlib导入pyplot作为plt
tss=cv2.imread(“第七章1.jpg”,0)
mc=cv2.imread(“贻贝洞穴”0.JPG)
sh=cv2.imread(“庇护_同态.bmp”,0)
pet=cv2.imread(“pet.png”,0)
def filtro_gaussiano_livro(德国政府、德国劳埃德船级社、gh公司、Dz):
im=np.复制(img)
P=im.形状[0]/2
Q=im.形状[1]/2
h=np.零(im.形状)
U、 V=np.meshgrid(范围(im.shape[0]),范围(im.shape[1]),稀疏=False,索引=ij')
d=((U-P)**2+(V-Q)**2).aType(浮点)
d0=Dz
c=公司
h=(gh-gl)*(1-(np.exp(-c*(d/(d0**2())))+gl
返回h
def filtro_gaussiano(img,Dz):
im=np.复制(img)
P=im.形状[0]/2
Q=im.形状[1]/2
h=np.零(im.形状)
U、 V=np.meshgrid(范围(im.shape[0]),范围(im.shape[1]),稀疏=False,索引=ij')
d=((U-P)**2)+((V-Q)**2)).aType(浮点)
h=1-np.exp(-(d/(2*(Dz**2)))
返回h
def uint8_conv(img):
材料=np.副本(img)
对于范围内的i(材料形状[0]):
对于范围内的j(材料形状[1]):
如果mat[i,j]<0:
mat[i,j]=0
elif mat[i,j]>255:
mat[i,j]=255
其他:
mat[i,j]=mat[i,j]
返回np.uint8(材料)
def reescalona(进气歧管、最小值、最大值):
材料=np.副本(img)
ph=cv2。添加(最小(
cv2.除法((cv2.乘法((cv2.减法(mat,np.min(mat)),(max-min)),(np.max(mat)-np.min(mat ')))
rtn=np.uint8(ph)
返回rtn
def HOMORMOFICA(进气歧管,左,右):
im=np.float64(np.copy(img))
cv2.imshow(“边界”,im)
如果s==0:
f=滤波高斯(im,l)
elif s==1:
f=filtro_gaussiano_livro(im,0.05,3.5,1,l)
cv2.imshow(“高斯”+str(s),f)
im_log=np.log1p(im)
Im_shift=np.fft.fft移位(np.fft.fft2(Im_log))
Im\u fft\u filt=np.乘法(f,Im\u移位)
cv2.imshow(“FFT移位”,uint8_conv(np.real(Im_移位)))
Im\u filt=np.real(np.fft.ifft2(np.fft.ifftshift(Im\u fft\u filt)))
Im=np.exp(Im\U过滤器)-1
Im=reescalona(Im,0255)
返回uint8_conv(Im)
#def槽口(img):
raio=2500
i=宠物
a=同态(i,raio,0)
b=同态(i,raio,1)
cv2.imshow(“原始图像”,i)
cv2.imshow(“Filtro homofobico comum”,a)
cv2.imshow(“Filtro homopobico do livro”,b)
k=0
而k!=27:
k=cv2.等待键(0)
cv2.destroyAllWindows()

这里有一种使用Python/Numpy/OpenCV在频域进行同态滤波的方法

我相信你的问题只是你的过滤。我将在下面展示两种不同的滤波器,它们在圆的半径和高斯滤波上有所不同

  • 将输入读取为灰度
  • 获取输入的自然日志
  • 对实部/虚部进行FFT
  • 移动FFT,使直流点位于中心
  • 在小半径的白色背景上创建黑色圆形遮罩
  • 对遮罩应用高斯模糊
  • 移动FFT,使直流点位于左上角
  • 进行IFFT并转换为简单的真实图像
  • 以IFFT的指数为例
  • 将其拉伸到0到255的范围
  • 保存结果


对于半径=3和模糊=7的高通滤波器遮罩和同态结果:

对于半径=13和模糊=47的高通滤波器掩模和同态结果:


是显示输入或输出的图像。请发布您的输入、输出和冈萨雷斯输出。另请参见和@fmw42更新的itI标记了一个用于分割车牌字符的复制贴子,该贴子提供了同态过滤的实现。看一看。我使用的是书中给出的参数,但我在发布时忘了编辑它们。GammaL=0.25,GammaH=2,D0=80。我正试图用相同的参数复制结果,看看我的结果是否正确对不起,我没有这本书来知道他们做了什么。np,谢谢你的回答!我遗漏了重要的信息,所以是关于我高通滤波器的方程是什么?等式8中的哪个等式是,sry,我昨天回答了,但由于某种原因,它没有注册
import numpy as np
import cv2

# read input and convert to grayscale
img = cv2.imread('person.png', cv2.IMREAD_GRAYSCALE)
hh, ww = img.shape[:2]

# take ln of image
img_log = np.log(np.float64(img), dtype=np.float64)

# do dft saving as complex output
dft = np.fft.fft2(img_log, axes=(0,1))

# apply shift of origin to center of image
dft_shift = np.fft.fftshift(dft)

# create black circle on white background for high pass filter
#radius = 3
radius = 13
mask = np.zeros_like(img, dtype=np.float64)
cy = mask.shape[0] // 2
cx = mask.shape[1] // 2
cv2.circle(mask, (cx,cy), radius, 1, -1)
mask = 1 - mask

# antialias mask via blurring
#mask = cv2.GaussianBlur(mask, (7,7), 0)
mask = cv2.GaussianBlur(mask, (47,47), 0)

# apply mask to dft_shift
dft_shift_filtered = np.multiply(dft_shift,mask)

# shift origin from center to upper left corner
back_ishift = np.fft.ifftshift(dft_shift_filtered)

# do idft saving as complex
img_back = np.fft.ifft2(back_ishift, axes=(0,1))

# combine complex real and imaginary components to form (the magnitude for) the original image again
img_back = np.abs(img_back)

# apply exp to reverse the earlier log
img_homomorphic = np.exp(img_back, dtype=np.float64)

# scale result
img_homomorphic = cv2.normalize(img_homomorphic, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

# write result to disk
cv2.imwrite("person_dft_numpy_mask.png", (255*mask).astype(np.uint8))
cv2.imwrite("person_dft_numpy_homomorphic.png", img_homomorphic)

cv2.imshow("ORIGINAL", img)
cv2.imshow("MASK", mask)
cv2.imshow("FILTERED DFT/IFT ROUND TRIP", img_back)
cv2.imshow("HOMOMORPHIC", img_homomorphic)
cv2.waitKey(0)
cv2.destroyAllWindows()