From 5b3640a05085f3e34ac229c04dd2ad0166ed69cd Mon Sep 17 00:00:00 2001 From: charlie <1753524606@qq.com> Date: Fri, 22 Jul 2022 08:50:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A2=91=E5=9F=9F=E7=9A=84?= =?UTF-8?q?=E9=94=90=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic/urls.py | 1 + basic/views.py | 98 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 91 insertions(+), 8 deletions(-) diff --git a/basic/urls.py b/basic/urls.py index d758af5..d35c699 100644 --- a/basic/urls.py +++ b/basic/urls.py @@ -19,4 +19,5 @@ urlpatterns = [ path('ed', views.edge_detection), path('lcd', views.line_change_detection), path('smooth', views.smooth), + path('sharpen', views.sharpen), ] diff --git a/basic/views.py b/basic/views.py index d5df9d1..5f8793b 100644 --- a/basic/views.py +++ b/basic/views.py @@ -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