频域的拉普拉斯算子

news/2024/7/21 5:27:56 标签: 图像处理

频域的拉普拉斯算子

一、定义:

拉普拉斯算子可以使用如下滤波器在频率域实现:
H ( u , v ) = − 4 ∗ π 2 ( u 2 + v 2 ) H(u,v) = -4*\pi^2 (u^{2} + v^{2}) H(u,v)=4π2(u2+v2)
或者,关于频率矩阵的中心,使用如下滤波器:
H ( u , v ) = − 4 ∗ π 2 ( ( u − P 2 ) 2 + ( v − Q 2 ) 2 ) H(u,v) = -4*\pi^2 ((u - \frac{P}{2})^{2} +( v - \frac{Q}{2})^{2}) H(u,v)=4π2((u2P)2+(v2Q)2)
其中,D(u,v)是上式给出的距离函数。然后,拉普拉斯图像由下式得到:
▽ 2 f ( x , y ) = ∋ − 1 H ( u , v ) ∗ F ( u , v ) \bigtriangledown^{2} f(x,y) = \owns^{-1}{H(u,v)*F(u,v)} 2f(x,y)=1H(u,v)F(u,v)
其中,F(u,v) 是 f(x,y) 的傅里叶变换。可以使用下式进行增强:
g ( x , y ) = f ( x , y ) + c ▽ 2 f ( x , y ) g(x,y) = f(x,y) + c\bigtriangledown^{2} f(x,y) g(x,y)=f(x,y)+c2f(x,y)

二、代码实现:

原始图片:原始图片

代码1:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件        :频率域的拉普拉斯算子.py
@说明        :
@时间        :2021/05/14 20:31:55
@作者        :zt
@版本        :1.0
'''
import cv2
import math
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import rcParams

rcParams['font.family'] = 'simhei'

path = r"图片位置"

#读取图片,以灰度级的形式
img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)

plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.title("原始图像")
plt.xticks([]), plt.yticks([])
plt.show()

# '''
# 归一化到[0,1]
# '''
# img_max = max(max(row) for row in img)
# img_gui = img/img_max



rows, cols = img.shape

img_k = np.zeros((2*rows,2*cols)) #用来制作傅里叶变换

"""标定"""

img_min = np.min(img)
fm = img - img_min
img_max = np.max(fm)
fs = (fm/img_max)



img_k[:rows,:cols] = fs
print("扩充后:")
print(img_k.shape)
print(img_k)


plt.imshow(img_k, cmap = 'gray', interpolation = 'bicubic')
plt.title("扩充图像")
plt.xticks([]), plt.yticks([])
plt.show()


'''
(-1)(x+y)乘以img_k移到其中心
'''
# for i in range(img_k.shape[0]):
#     for j in range(img_k.shape[1]):
#         if (i+j)%2!=0:
#             img_k[i][j] = (-1)*img_k[i][j]

crows, ccols =int(rows), int(cols) #得到频率域的中心点坐标

print(crows,ccols)

'''
构建h(u,v),并求出来
'''
h = np.zeros((2*rows,2*cols))

for i in range(rows):
    for j in range(cols):
        h[i][j] = 1+4*math.pow(math.pi,2)*(math.pow(i-crows,2)+math.pow(j-ccols,2))

print("h(u,v):")
print(h[crows,ccols])


ff = np.fft.fft2(img_k) #图片扩充移其中心后的傅里叶变换

fshift = np.fft.fftshift(ff)    #将零频率分量移到频谱中心
h_f = np.zeros_like(h)
for i in range(len(h)):
    for j in range(len(h[0])):
        h_f[i,j] = h[i,j] * fshift[i,j]

ishift = np.fft.ifftshift(h_f) #ishift是一个复数数组
i_img = np.fft.ifft2(ishift) #逆傅里叶变换,得到仍然是一个复数数组
i_img = np.abs(i_img) #取模,与取实部差不多

plt.imshow(i_img, cmap = 'gray', interpolation = 'bicubic')
plt.title("nibianhua")
plt.xticks([]), plt.yticks([])
plt.show()

c = 1
g = img + c*i_img[:rows,:cols] #总计算公式

plt.imshow(g, cmap = 'gray', interpolation = 'bicubic') #绘图
plt.title("频率域拉普拉斯处理后")
plt.xticks([]), plt.yticks([])
plt.show()

效果:
在这里插入图片描述

代码2:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件        :频率域的拉普拉斯算子.py
@说明        :
@时间        :2021/05/14 21:31:50
@作者        :zt
@版本        :1.0
'''

import cv2
import math
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import rcParams

rcParams['font.family'] = 'simhei'

path = r"图片位置"

#读取图片,以灰度级的形式
img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
"""值域[0,1]"""
img_min = np.min(img)
fm = img - img_min
img_max = np.max(fm)
fs = (fm/img_max)
rows, cols = img.shape

img_k = np.zeros((2*rows,2*cols)) #用来制作傅里叶变换
img_k[:rows,:cols] = fs


ff = np.fft.fft2(img_k) #傅里叶变换

fshift = np.fft.fftshift(ff)    #将零频率分量移到频谱中心

m,n = fshift.shape

o_x,o_y = int(m/2),int(n/2)

a_max = np.max(fshift)

img_zero = np.zeros((m,n))  #滤波后的频谱

for i in range(m):
    for j in range(n):
        h = (-4)*math.pow(math.pi,2)*(math.pow(i-o_x,2)+math.pow(j-o_y,2))/a_max #拉普拉斯滤波器,除以img_f的最大值a_max是为了将H(i,j)标定到[-1,1]的范围内
        img_zero[i,j] = (1-h)*fshift[i,j]

ishift = np.fft.ifftshift(img_zero) #ishift是一个复数数组
i_img = np.fft.ifft2(ishift) #逆傅里叶变换,得到仍然是一个复数数组,不要以为直接得到图像的像素值.
i_img = np.abs(i_img)

plt.imshow(i_img[:rows,:cols], cmap = 'gray', interpolation = 'bicubic')
plt.title("频率域拉普拉斯处理后")
plt.xticks([]), plt.yticks([])
plt.show()

效果:
在这里插入图片描述


http://www.niftyadmin.cn/n/1269266.html

相关文章

空间域:均值滤波与阈值处理

空间域:均值滤波与阈值处理 代码实现: import cv2 import numpy as np from matplotlib import pyplot as plt from matplotlib import rcParamsrcParams[font.family] simheipath r"图片位置"#读取图片,以灰度级的形式 img c…

1854. 人口最多的年份

1854. 人口最多的年份 给你一个二维整数数组 logs ,其中每个 logs[i] [birthi, deathi] 表示第 i 个人的出生和死亡年份。 年份 x 的 人口 定义为这一年期间活着的人的数目。第 i 个人被计入年份 x 的人口需要满足:x 在闭区间 [birthi, deathi - 1] 内…

pandas与numpy的一些小问题

pandas与numpy的一些小问题: import pandas as pd import numpy as np # my_array np.array([1,2,3,4,5]) # print(my_array.shape) # print(my_array) #numpy#1 两种方法创建 print(1) s1 np.array([[1., 1., 1.],[1., 1., 1.]] ) my_2d np.ones((2,3)) print(…

减治法求解假硬币问题

减治法求解假硬币问题 减治法采取划分后选择计算的思想,利用一个问题和同样较小规模的问题之间的某种关系进行划分。我们先确立这种关系,然后既可以从顶至下,也可以从底至上地来运用该关系,将大问题分解成小问题来解决&#xff0…

excel转csv

excel转csv import pandas as pd import xlwt data pd.read_excel(读取的excel表地址,excel表中的哪一张,index_col0,engineopenpyxl) data.to_csv(保存的csv的位置名称,encodingutf-8)

csv 转 excel

csv 转 excel import pandas as pd import numpy as np import xlwt 新建excel文件myexcel xlwt.Workbook()mysheet myexcel.add_sheet("testdata") #先创建一个tablepath".csv"#您要读取的文件路径 csvdata np.loadtxt(path,dtypestr,delimiter"…

SAT问题

SAT问题 import math import random import time #SAT问题def main(n):sum []s []m int(math.pow(2,n))for i in range(0,m):for j in range(0,n):a random.randint(0,1)s.append(a)if s not in sum:sum.append(s)s []rel []for A1 in sum:for A2 in sum:if (1 in A1) an…

爬取小说斗破苍穹

从网上寻找小说斗破苍穹,爬取并保存。 import requests import time import re from lxml import etree from bs4 import BeautifulSoup headers {User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 S…