完成频域的锐化

master
charlie 4 years ago
parent 956e7af7de
commit 5b3640a050

@ -19,4 +19,5 @@ urlpatterns = [
path('ed', views.edge_detection),
path('lcd', views.line_change_detection),
path('smooth', views.smooth),
path('sharpen', views.sharpen),
]

@ -609,6 +609,18 @@ def ideal_low_filter(img, D0):
return filter_img
def ideal_high_pass_filter(img, D0):
h, w = img.shape[:2]
filter_img = np.zeros((h, w))
u = np.fix(h / 2)
v = np.fix(w / 2)
for i in range(h):
for j in range(w):
d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
filter_img[i, j] = 0 if d < D0 else 1
return filter_img
def butterworth_low_filter(img, D0, rank):
"""
生成一个Butterworth低通滤波器并返回
@ -624,6 +636,21 @@ def butterworth_low_filter(img, D0, rank):
return filter_img
def butterworth_high_pass_filter(img, D0, rank):
"""
生成一个Butterworth低通滤波器并返回
"""
h, w = img.shape[:2]
filter_img = np.zeros((h, w))
u = np.fix(h / 2)
v = np.fix(w / 2)
for i in range(h):
for j in range(w):
d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
filter_img[i, j] = 1 / (1 + ((D0 / d) ** (2 * rank)))
return filter_img
def gauss_low_pass_filter(img, d0):
"""
生成一个指数低通滤波器并返回
@ -639,7 +666,22 @@ def gauss_low_pass_filter(img, d0):
return filter_img
def filter_use(img, filter):
def gauss_high_pass_filter(img, d0):
"""
生成一个指数低通滤波器并返回
"""
h, w = img.shape[:2]
filter_img = np.zeros((h, w))
u = np.fix(h / 2)
v = np.fix(w / 2)
for i in range(h):
for j in range(w):
d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
filter_img[i, j] = 1 - np.exp(-0.5 * (d ** 2) / (d0 ** 2))
return filter_img
def filter_use_smooth(img, filter):
"""
将图像img与滤波器filter结合生成对应的滤波图像
"""
@ -654,6 +696,18 @@ def filter_use(img, filter):
return f_origin
def filter_use_sharpen(img, filter):
f = np.fft.fft2(img)
f_center = np.fft.fftshift(f)
# 应用滤波器进行反变换
S = np.multiply(f_center, filter) # 频率相乘——l(u,v)*H(u,v)
f_origin = np.fft.ifftshift(S) # 将低频移动到原来的位置
f_origin = np.fft.ifft2(f_origin) # 使用ifft2进行傅里叶的逆变换
f_origin = np.abs(f_origin) # 设置区间
f_origin = f_origin / np.max(f_origin.all())
return f_origin
@csrf_exempt
def smooth(request):
if request.method == 'POST':
@ -662,18 +716,46 @@ def smooth(request):
img = cv2.imread(PREFIX + image, 0)
# frequency domain
fd = para['fd']
smooth_type = para['type']
filter = para['filter']
if fd:
if smooth_type == 'ideal_low_pass_filter':
if filter == 'ideal_low_pass_filter':
d0 = para.get('d0', 20)
img = filter_use_smooth(img, ideal_low_filter(img, d0))
elif filter == 'butterworth_low_pass_filter':
d0 = para.get('d0', 20)
rank = para.get('rank', 2)
img = filter_use_smooth(img, butterworth_low_filter(img, d0, rank))
elif filter == 'gauss_low_pass_filter':
d0 = para.get('d0', 20)
img = filter_use(img, ideal_low_filter(img, d0))
elif smooth_type == 'butterworth_low_pass_filter':
img = filter_use_smooth(img, gauss_low_pass_filter(img, d0))
else:
return 0
filename = getImageName() + DEFAULT_FORMAT
cv2.imwrite(PREFIX + filename, img)
return HttpResponse(filename)
return HttpResponse('请使用POST方法')
@csrf_exempt
def sharpen(request):
if request.method == 'POST':
para = json.loads(request.body)
image = para['img']
img = cv2.imread(PREFIX + image, 0)
# frequency domain
fd = para['fd']
filter = para['filter']
if fd:
if filter == 'ideal_high_pass_filter':
d0 = para.get('d0', 40)
img = filter_use_sharpen(img, ideal_high_pass_filter(img, d0))
elif filter == 'butterworth_high_pass_filter':
d0 = para.get('d0', 20)
rank = para.get('rank', 2)
img = filter_use(img, butterworth_low_filter(img, d0, rank))
elif smooth_type == 'gauss_low_pass_filter':
img = filter_use_sharpen(img, butterworth_high_pass_filter(img, d0, rank))
elif filter == 'gauss_high_pass_filter':
d0 = para.get('d0', 20)
img = filter_use(img, gauss_low_pass_filter(img, d0))
img = filter_use_sharpen(img, gauss_high_pass_filter(img, d0))
else:
return 0
filename = getImageName() + DEFAULT_FORMAT

Loading…
Cancel
Save