You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

963 lines
31 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import random
from tkinter import Image
import random
from tkinter import Image
import dlib
import cv2
import cv2 as cv
import numpy as np
import cmake
from PIL import Image
from django.http import JsonResponse
from django.shortcuts import render
from imutils import face_utils
from matplotlib import pyplot as plt
from djangoProject import settings
# 主页面
def to_img_load(request):
return render(request, 'upload.html')
# 人脸识别
def faceDetect(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
print(name)
path = settings.MEDIA_ROOT + '/' + image.name
with open(path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
im = np.float32(gray)
gx = cv2.Sobel(im, cv2.CV_32F, 1, 0, ksize=1)
gy = cv2.Sobel(im, cv2.CV_32F, 0, 1, ksize=1)
mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)
face_detect = dlib.get_frontal_face_detector()
rects = face_detect(gray, 1)
for (i, rect) in enumerate(rects):
(x, y, w, h) = face_utils.rect_to_bb(rect)
cv2.rectangle(gray, (x, y), (x + w, y + h), (255, 255, 255), 3)
cv2.imwrite(path, gray)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 绘制直方图
def histogram(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
print(name)
path = settings.MEDIA_ROOT + '/' + image.name
with open(path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(path)
color = ('b', 'g', 'r')
for i, col in enumerate(color):
hist = cv2.calcHist([img], [i], None, [256], [0, 256])
plt.plot(hist, color=col)
plt.xlim([0, 256])
plt.savefig(path)
try:
data = {'state': 'static/media/'+name}
except:
data = {'state': 0}
return JsonResponse(data)
# 灰度直方图
def greyHistogram(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + image.name
print(img_path)
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img_PIL = Image.open(img_path)
img = np.array(img_PIL)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
hist = cv.calcHist([img_gray], [0], None, [256], [0, 255])
plt.plot(hist)
plt.xlim([0, 255])
plt.savefig(img_path)
try:
data = {'state': 'static/media/'+name}
except:
data = {'state': 0}
return JsonResponse(data)
# 彩色直方图
def colorHistogram(request):
if request.method == 'POST':
color = ["r", "g", "b"]
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + image.name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])
# 绘制彩色直方图,需要对每个通道进行遍历,并且找到最大值和最小值
for index, c in enumerate(color):
hist = cv2.calcHist([img], [index], None, [256], [0, 255])
plt.plot(hist, color=c)
plt.xlim([0, 255])
plt.savefig(img_path)
try:
data = {'state': 'static/media/'+name}
except:
data = {'state': 0}
return JsonResponse(data)
# 分段线性处理
def piecewiseLinearProcessing(request):
# 定义图像数据的路径
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path, 0)
h, w = img.shape[:2]
out = np.zeros(img.shape, np.uint8)
for i in range(h):
for j in range(w):
pix = img[i][j]
if pix < 50:
out[i][j] = 0.5 * pix
elif pix < 150:
out[i][j] = 3.6 * pix - 310
else:
out[i][j] = 0.238 * pix + 194
out = np.around(out)
out = out.astype(np.uint8)
cv2.imwrite(img_path, out)
try:
data = {'state': 'static/media/'+name}
except:
data = {'state': 0}
return JsonResponse(data)
# 放大图像至原来的两倍,使用双线性插值法????
def enlarge(request):
# 定义图像数据的路径
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
l, w, h = img.shape
img = cv2.resize(img, (0, 0), fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
cv2.imwrite(img_path, img)
try:
data = {'state': 'static/media/'+name}
except:
data = {'state': 0}
return JsonResponse(data)
# 图片平移 构建移动矩阵,x轴左移 10 个像素y轴下移 30 个
def move(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
height, width, channel = img.shape
M = np.float32([[1, 0, 30], [0, 1, 60]])
img = cv2.warpAffine(img, M, (width, height))
cv2.imwrite(img_path, img)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 构建矩阵旋转中心坐标为处理后图片长宽的一半旋转角度为45度缩放因子为1
def spin(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
height, width, channel = img.shape
rows, cols, depth = img.shape
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
dst = cv2.warpAffine(img, M, (width, height))
cv2.imwrite(img_path, dst)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 水平翻转
def horizontalFlip(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
horizontal = cv2.flip(img, 1, dst=None)
cv2.imwrite(img_path, horizontal)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 垂直翻转
def verticalFlip(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
vertical = cv2.flip(img, 0, dst=None)
cv2.imwrite(img_path, vertical)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 对角线翻转
def crossFlip(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
cross = cv2.flip(img, -1, dst=None)
cv2.imwrite(img_path, cross)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 仿射变换
def affineTransformation(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
img = cv2.resize(img, (256, 256))
rows, cols = img.shape[: 2]
# 设置图像仿射变化矩阵
post1 = np.float32([[50, 50], [200, 50], [50, 200]])
post2 = np.float32([[10, 100], [200, 50], [100, 250]])
M = cv2.getAffineTransform(post1, post2)
# 图像仿射变换,及保存
result = cv2.warpAffine(img, M, (rows, cols))
cv2.imwrite(img_path, result)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 图片增强
def enhance(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
# 1. 灰度模式读取图像图像名为CRH
CRH = cv2.imread(img_path, 0)
# 2. 计算图像梯度。首先要对读取的图像进行数据变换,因为使用了
# numpy对梯度进行数值计算所以要使用
# CRH.astype('float')进行数据格式变换。
row, col = CRH.shape
CRH_f = np.copy(CRH)
CRH_f = CRH_f.astype('float')
gradient = np.zeros((row, col))
for x in range(row - 1):
for y in range(col - 1):
gx = abs(CRH_f[x + 1, y] - CRH_f[x, y])
gy = abs(CRH_f[x, y + 1] - CRH_f[x, y])
gradient[x, y] = gx + gy
# 3. 对图像进行增强增强后的图像变量名为sharp
sharp = CRH_f + gradient
sharp = np.where(sharp > 255, 255, sharp)
sharp = np.where(sharp < 0, 0, sharp)
# 数据类型变换
gradient = gradient.astype('uint8')
sharp = sharp.astype('uint8')
cv2.imwrite(img_path, sharp)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# robs算子图片增强
def robs(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
# 1. 灰度化处理图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. Roberts算子
kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
kernely = np.array([[0, -1], [1, 0]], dtype=int)
# 3. 卷积操作
x = cv2.filter2D(gray, cv2.CV_16S, kernelx)
y = cv2.filter2D(gray, cv2.CV_16S, kernely)
# 4. 数据格式转换
absx = cv2.convertScaleAbs(x)
absy = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absx, 0.5, absy, 0.5, 0)
cv2.imwrite(img_path, Roberts)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 使用 Sobel 算子提取边缘
def sob(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
# 1. 灰度化处理图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. 求Sobel 算子
sx = cv2.Sobel(gray, cv2.CV_16S, 1, 0)
sy = cv2.Sobel(gray, cv2.CV_16S, 0, 1)
# 3. 数据格式转换
absx = cv2.convertScaleAbs(sx)
absy = cv2.convertScaleAbs(sy)
# 4. 组合图像
Sobel = cv2.addWeighted(absx, 0.5, absy, 0.5, 0)
cv2.imwrite(img_path, Sobel)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 使用 Laplacian 算子提取边缘
def lap(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
# 1. 灰度化处理图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. 高斯滤波
grayG = cv2.GaussianBlur(gray, (5, 5), 0)
fltI = cv2.Laplacian(grayG, cv2.CV_16S, ksize=3)
# 3. 拉普拉斯算法
Laplacian = cv2.convertScaleAbs(fltI)
cv2.imwrite(img_path, Laplacian)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 使用 LoG 算子提取边缘
def log(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray = cv2.copyMakeBorder(gray, 2, 2, 2, 2, borderType=cv2.BORDER_REPLICATE)
image = cv2.GaussianBlur(gray, (3, 3), 0, 0)
m1 = np.array([[0, 0, -1, 0, 0],
[0, -1, -2, -1, 0],
[-1, -2, 16, -2, -1],
[0, -1, -2, -1, 0],
[0, 0, -1, 0, 0]])
row = image.shape[0]
col = image.shape[1]
image1 = np.zeros(image.shape)
for i in range(2, row - 2):
for j in range(2, col - 2):
image1[i, j] = np.sum(m1 * image[i - 2:i + 3, j - 2:j + 3, 1])
image1 = cv2.convertScaleAbs(image1)
cv2.imwrite(img_path, image1)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# Canny 边缘检测过程
def cny(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
src = cv2.imread(img_path)
blur = cv2.GaussianBlur(src, (3, 3), 0)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
gradx = cv2.Sobel(gray, cv2.CV_16SC1, 1, 0)
grady = cv2.Sobel(gray, cv2.CV_16SC1, 0, 1)
edge_output = cv2.Canny(gradx, grady, 50, 150)
cv2.imwrite(img_path, edge_output)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 均值滤波器
def MeanFilter(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
w = gray.shape[1]
h = gray.shape[0]
newing = np.array(gray)
lbing = np.zeros((h + 2, w + 2), np.float32)
tmping = np.zeros((h + 2, w + 2))
myh = h + 2
myw = w + 2
tmping[1:myh - 1, 1:myw - 1] = newing[0:h, 0:w]
a = 1 / 8.0
kernel = a * np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
for y in range(1, myh - 1):
for x in range(1, myw - 1):
lbing[y, x] = np.sum(kernel * tmping[y - 1:y + 2, x - 1:x + 2])
result = np.array(lbing[1:myh - 1, 1:myw - 1], np.uint8)
cv2.imwrite(img_path, result)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 中值滤波器
def MedFilter(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
w = img.shape[1]
h = img.shape[0]
median = np.array(img)
for y in range(1, w):
for x in range(1, h):
median[x, y] = np.median(img[x - 1:x + 2, y - 1:y + 2])
cv2.imwrite(img_path, median)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# Hough线段变化
def HoughLineChange(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
img = cv2.GaussianBlur(img, (3, 3), 0)
edges = cv2.Canny(img, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/2, 118)
result = img.copy()
for i_line in lines:
for line in i_line:
rho = line[0]
theta = line[1]
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直线
pt1 = (int(rho / np.cos(theta)), 0)
pt2 = (int((rho - result.shape[0] * np.sin(theta)) / np.cos(theta)), result.shape[0])
cv2.line(result, pt1, pt2, (0, 0, 255))
else:
pt1 = (0, int(rho / np.sin(theta)))
pt2 = (result.shape[1], int((rho - result.shape[1] * np.cos(theta)) / np.sin(theta)))
cv2.line(result, pt1, pt2, (0, 0, 255), 1)
minLineLength = 200
maxLineGap = 15
linesP = cv2.HoughLinesP(edges, 1, np.pi/180, 80, minLineLength, maxLineGap)
result_P = img.copy()
for i_P in linesP:
for x1, y1, x2, y2 in i_P:
cv2.line(result_P, (x1, y1), (x2, y2), (0, 255, 0), 3)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(img_path, result_P)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 腐蚀
def erode(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
src = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用一个5x5的交叉型结构元核心在几何中心对二值图片src进行腐蚀
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
erosion = cv2.erode(src, kernel)
cv2.imwrite(img_path, erosion)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 膨胀
def dialate(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
src = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用一个5x5的交叉型结构元核心在几何中心对二值图片src进行膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
dilation = cv2.dilate(src, kernel)
cv2.imwrite(img_path, dilation)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 开操作######
def openMorphing(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 定义十字形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(10,10))
im_op = cv2.morphologyEx(dst, cv2.MORPH_OPEN,kernel)
cv2.imwrite(img_path, im_op)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 闭操作
def closeMorphing(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
retval, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 定义十字形结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10))
im_cl = cv2.morphologyEx(dst, cv2.MORPH_CLOSE, kernel)
cv2.imwrite(img_path, im_cl)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 雪花噪声
def sp_noise(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
prob = 0.2
# 待输出的图片
output = np.zeros(img.shape, np.uint8)
# 遍历图像,获取叠加噪声后的图像
thres = 1 - prob
for i in range(img.shape[0]):
for j in range(img.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = img[i][j]
cv2.imwrite(img_path, output)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 添加高斯噪声,mean : 均值 , var : 方差
def gasuss_noise(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
image = np.array(img / 255, dtype=float)
var = 0.001
mean = 0
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out * 255)
cv2.imwrite(img_path, out)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# 高通滤波
def highPassFilter(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
output = np.zeros(image.shape, np.uint8)
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if 200 < image[i][j]:
output[i][j] = image[i][j]
else:
output[i][j] = 0
cv2.imwrite(img_path, output)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
##########
##########
# 空域锐化
##########
#########
def sharpen(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 锐化
dst = cv2.filter2D(img, -1, kernel=kernel)
cv2.imwrite(img_path, dst)
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
##########
##########
# 频域锐化
##########
#########
# 理想低通滤波
def IdealLowPassFiltering(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
f_shift = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 设置滤波半径
D0 = 80
# 初始化
m = f_shift.shape[0]
n = f_shift.shape[1]
h1 = np.zeros((m, n))
x0 = np.floor(m / 2)
y0 = np.floor(n / 2)
for i in range(m):
for j in range(n):
D = np.sqrt((i - x0) ** 2 + (j - y0) ** 2)
if D <= D0:
h1[i][j] = 1
cv2.imwrite(img_path, frequency_filter(f_shift, h1))
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# Butterworth低通滤波器
def butterworth_low_filter(request):
"""
生成一个Butterworth低通滤波器并返回
"""
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
D0 = 20
rank = 2
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 + 0.414 * (d / D0) ** (2 * rank))
cv2.imwrite(img_path, frequency_filter(img, filter_img))
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
##########
##########
# 频域平滑
##########
#########
# 理想高通滤波
def IdealHighPassFiltering(request):
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
f_shift = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 设置滤波半径
D0 = 80
# 初始化
m = f_shift.shape[0]
n = f_shift.shape[1]
h1 = np.zeros((m, n))
x0 = np.floor(m / 2)
y0 = np.floor(n / 2)
for i in range(m):
for j in range(n):
D = np.sqrt((i - x0) ** 2 + (j - y0) ** 2)
if D >= D0:
h1[i][j] = 1
cv2.imwrite(img_path, frequency_filter(f_shift, h1))
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
# Butterworth高通滤波器
def butterworth_high_filter(request):
"""
生成一个Butterworth高通滤波器并返回
"""
if request.method == 'POST':
image = request.FILES.get('picture')
name = image.name
img_path = settings.MEDIA_ROOT + '/' + name
with open(img_path, 'wb') as pic:
for c in image.chunks():
pic.write(c)
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
D0 = 40
rank = 2
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))
cv2.imwrite(img_path, frequency_filter(img, filter_img))
try:
data = {'state': 'static/media/' + name}
except:
data = {'state': 0}
return JsonResponse(data)
def frequency_filter(image, filter):
"""
:param image:
:param filter: 频域变换函数
:return:
"""
fftImg = np.fft.fft2(image) #对图像进行傅里叶变换
fftImgShift = np.fft.fftshift(fftImg)#傅里叶变换后坐标移动到图像中心
handle_fftImgShift1 = fftImgShift*filter # 对傅里叶变换后的图像进行频域变换
handle_fftImgShift2 = np.fft.ifftshift(handle_fftImgShift1)
handle_fftImgShift3 = np.fft.ifft2(handle_fftImgShift2)
handle_fftImgShift4 = np.real(handle_fftImgShift3)#傅里叶反变换后取频域
return np.uint8(handle_fftImgShift4)