|
|
from django.shortcuts import render,HttpResponse
|
|
|
import numpy as np
|
|
|
from io import BytesIO
|
|
|
import cv2
|
|
|
import sys
|
|
|
import matplotlib.pyplot as plt
|
|
|
import numpy
|
|
|
# Create your views here.
|
|
|
def home(request):
|
|
|
|
|
|
return render(request,'home.html') #render用来打开html
|
|
|
def login(request):
|
|
|
if request.method=='GET':
|
|
|
return render(request,'login.html')
|
|
|
else:
|
|
|
uname=request.POST.get('username')
|
|
|
pwd = request.POST.get('password')
|
|
|
if uname=='user' and pwd=='password':
|
|
|
return render(request, 'home.html')
|
|
|
else:
|
|
|
return HttpResponse('用户名或密码错误!')
|
|
|
|
|
|
'''def login2(request):
|
|
|
|
|
|
return render(request,'home.html')'''
|
|
|
def photo(request):
|
|
|
file_object=request.FILES.get("pic")
|
|
|
print(file_object.name)
|
|
|
f=open('a1.jpg',mode='wb')
|
|
|
for chunk in file_object.chunks():
|
|
|
f.write(chunk)
|
|
|
f.close()
|
|
|
return render(request,'function.html')
|
|
|
def index(request):
|
|
|
|
|
|
return render(request,'index.html')
|
|
|
def f1_b(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
b = img[:, :, 0]
|
|
|
g = img[:, :, 1]
|
|
|
r = img[:, :, 2]
|
|
|
cv2.imwrite('./static/abc.jpg', b)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f1_g(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
b = img[:, :, 0]
|
|
|
g = img[:, :, 1]
|
|
|
r = img[:, :, 2]
|
|
|
cv2.imwrite('./static/abc.jpg', g)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f1_r(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
b = img[:, :, 0]
|
|
|
g = img[:, :, 1]
|
|
|
r = img[:, :, 2]
|
|
|
cv2.imwrite('./static/abc.jpg', r)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f2_h(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
|
|
|
h = hsv[:, :, 0]
|
|
|
s = hsv[:, :, 1]
|
|
|
v = hsv[:, :, 2]
|
|
|
cv2.imwrite('./static/abc.jpg', h)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f2_s(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
|
|
|
h = hsv[:, :, 0]
|
|
|
s = hsv[:, :, 1]
|
|
|
v = hsv[:, :, 2]
|
|
|
cv2.imwrite('./static/abc.jpg', s)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f2_v(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
|
|
|
h = hsv[:, :, 0]
|
|
|
s = hsv[:, :, 1]
|
|
|
v = hsv[:, :, 2]
|
|
|
cv2.imwrite('./static/abc.jpg', v)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f3(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
# l, w, h = img.shape
|
|
|
# 放大图像至原来的两倍,使用双线性插值法
|
|
|
img = cv2.resize(img, (0, 0), fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
|
|
|
height, width, channel = img.shape
|
|
|
|
|
|
# 构建移动矩阵,x轴左移 30 个像素,y轴下移 60 个像素
|
|
|
M = np.float32([[1, 0, 30], [0, 1, 60]])
|
|
|
|
|
|
img = cv2.warpAffine(img, M, (width, height))
|
|
|
|
|
|
# 构建矩阵,旋转中心坐标为处理后图片长宽的一半,旋转角度为45度,缩放因子为1
|
|
|
|
|
|
M = cv2.getRotationMatrix2D((width / 2, height / 2), 45, 1)
|
|
|
|
|
|
dst = cv2.warpAffine(img, M, (width, height))
|
|
|
cv2.imwrite('./static/abc.jpg', dst)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f4_1(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
src = cv2.resize(img, (256, 256))
|
|
|
# 水平镜像
|
|
|
horizontal = cv2.flip(src, 1, dst=None)
|
|
|
# 垂直镜像
|
|
|
vertical = cv2.flip(src, 0, dst=None)
|
|
|
# 对角镜像 ,并保存
|
|
|
cross = cv2.flip(src, -1, dst=None)
|
|
|
cv2.imwrite('./static/abc.jpg', horizontal)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f4_2(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
src = cv2.resize(img, (256, 256))
|
|
|
# 水平镜像
|
|
|
horizontal = cv2.flip(src, 1, dst=None)
|
|
|
# 垂直镜像
|
|
|
vertical = cv2.flip(src, 0, dst=None)
|
|
|
# 对角镜像 ,并保存
|
|
|
cross = cv2.flip(src, -1, dst=None)
|
|
|
cv2.imwrite('./static/abc.jpg', vertical)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f4_3(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
src = cv2.resize(img, (256, 256))
|
|
|
# 水平镜像
|
|
|
horizontal = cv2.flip(src, 1, dst=None)
|
|
|
# 垂直镜像
|
|
|
vertical = cv2.flip(src, 0, dst=None)
|
|
|
# 对角镜像 ,并保存
|
|
|
cross = cv2.flip(src, -1, dst=None)
|
|
|
cv2.imwrite('./static/abc.jpg', cross)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f5(request):
|
|
|
img = cv2.imread('./a1.jpg')
|
|
|
src = cv2.resize(img, (256, 256))
|
|
|
# 获取图像shape
|
|
|
rows, cols = src.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(src, M, (rows, cols))
|
|
|
cv2.imwrite('./static/abc.jpg', result)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
|
|
|
def f6(request):
|
|
|
def histCover(img, fileName):
|
|
|
plt.figure(fileName, figsize=(16, 8))
|
|
|
# 展示输入图像
|
|
|
plt.subplot(121)
|
|
|
plt.imshow(img, "gray")
|
|
|
# 展示直方图
|
|
|
plt.subplot(122)
|
|
|
"""
|
|
|
利用cv.calcHist()内置函数进行画灰度图像直方图,该函数的返回值是hist
|
|
|
"""
|
|
|
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
|
|
|
plt.plot(hist)
|
|
|
plt.xlim([0, 255])
|
|
|
plt.savefig(fileName)
|
|
|
plt.show()
|
|
|
|
|
|
# 主函数的定义,定义图片路径
|
|
|
def main_func(argv):
|
|
|
img_plt = './static/abc.jpg'
|
|
|
"""
|
|
|
读入图像,并转化为灰度值,数据路径为img_path
|
|
|
"""
|
|
|
img_gray = cv2.imread('./a1.jpg', cv2.IMREAD_GRAYSCALE)
|
|
|
# img= cv.imread(img_path)
|
|
|
# img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
|
|
|
"""
|
|
|
调用histCover函数绘制直方图,看清楚该函数是无返回值的哦
|
|
|
"""
|
|
|
|
|
|
histCover(img_gray, img_plt)
|
|
|
|
|
|
main_func(sys.argv)
|
|
|
return render(request,'index.html',{'image':'/static/abc.jpg'})
|
|
|
def f7(request):
|
|
|
def histCover(img, fileName):
|
|
|
color = ["r", "g", "b"]
|
|
|
# 展示原始图像
|
|
|
"""
|
|
|
展示原始图像,因为用到cv2函数读取,要用matplotlib库函数,所以应该转BGR格式为RGB格式
|
|
|
"""
|
|
|
b, g, r = cv2.split(img)
|
|
|
img = cv2.merge([r, g, b])
|
|
|
|
|
|
plt.subplot(121)
|
|
|
plt.imshow(img)
|
|
|
plt.subplot(122)
|
|
|
# 绘制彩色直方图,需要对每个通道进行遍历,并且找到最大值和最小值
|
|
|
for index, c in enumerate(color):
|
|
|
|
|
|
"""
|
|
|
对每个通道进行直方图的计算和绘制,需要调用cv2的计算直方图函数,返回值为hist
|
|
|
"""
|
|
|
hist = cv2.calcHist([img], [index], None, [256], [0, 255])
|
|
|
|
|
|
|
|
|
plt.plot(hist, color=c)
|
|
|
plt.xlim([0, 255])
|
|
|
plt.savefig(fileName)
|
|
|
plt.show()
|
|
|
|
|
|
# 主函数的定义,定义图片路径
|
|
|
def main_func(argv):
|
|
|
img_path = './a1.jpg'
|
|
|
img_plt = './static/abc.jpg'
|
|
|
|
|
|
|
|
|
"""
|
|
|
根据给出的图像路径,加载图像,图像数据路径为img_path,返回值为imgOri1
|
|
|
"""
|
|
|
imgOri1 = cv2.imread(img_path)
|
|
|
|
|
|
|
|
|
histCover(imgOri1, img_plt)
|
|
|
|
|
|
main_func(sys.argv)
|
|
|
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f8(request):
|
|
|
img = cv2.imread('./a1.jpg') # 根据路径读取一张图片
|
|
|
color = ('b', 'g', 'r')
|
|
|
for i, col in enumerate(color):
|
|
|
histr = cv2.calcHist([img], [i], None, [256], [0, 256])
|
|
|
plt.plot(histr, color=col)
|
|
|
plt.xlim([0, 256])
|
|
|
|
|
|
plt.savefig('./static/abc.jpg')
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f9(request):
|
|
|
def grayHist(img, filename):
|
|
|
plt.figure(filename, figsize=(16, 8))
|
|
|
# 展示输入图像
|
|
|
plt.subplot(121)
|
|
|
plt.imshow(img, 'gray')
|
|
|
# 展示直方图
|
|
|
plt.subplot(122)
|
|
|
h, w = img.shape[:2]
|
|
|
|
|
|
|
|
|
"""
|
|
|
任务1.将二维图像矩阵reshape()为一维数组,返回值为pixelSequence
|
|
|
"""
|
|
|
pixelSequence = img.reshape(h * w, 1)
|
|
|
|
|
|
|
|
|
# 将二维图像矩阵reshape()为一维数组
|
|
|
numberBins = 256
|
|
|
|
|
|
"""
|
|
|
调用hist()的方法进行直方图的绘制,返回值有histogram, bins, patch
|
|
|
"""
|
|
|
histogram, bins, patch = plt.hist(pixelSequence, numberBins)
|
|
|
|
|
|
|
|
|
print(max(histogram))
|
|
|
plt.xlabel("gray label")
|
|
|
plt.ylabel("number of pixels")
|
|
|
plt.axis([0, 255, 0, np.max(histogram)])
|
|
|
# 打印输出峰值
|
|
|
plt.savefig(filename)
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
# 定义图像数据的路径
|
|
|
img_path = './a1.jpg'
|
|
|
#out_path = 'D:/Mike/PycharmProjects/pythonProject/venv/abc.jpg'
|
|
|
out2_path = './static/abc.jpg'
|
|
|
|
|
|
img = cv2.imread(img_path, 0)
|
|
|
h, w = img.shape[:2]
|
|
|
out = np.zeros(img.shape, np.uint8)
|
|
|
|
|
|
"""
|
|
|
通过遍历对不同像素范围内进行分段线性变化,在这里分三段函数进行分段线性变化,主要还是考察for循环的应用
|
|
|
#y=0.5*x(x<50)
|
|
|
#y=3.6*x-310(50<=x<150)
|
|
|
#y=0.238*x+194(x>=150)
|
|
|
"""
|
|
|
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)
|
|
|
#grayHist(img, out_path)
|
|
|
grayHist(out, out2_path)
|
|
|
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f10(request):
|
|
|
img = cv2.imread('./a1.jpg') # 根据路径读取一张图片
|
|
|
|
|
|
img = cv2.GaussianBlur(img, (3, 3), 0)
|
|
|
edges = cv2.Canny(img, 50, 150, apertureSize=3)
|
|
|
|
|
|
# 使用HoughLines算法
|
|
|
# rho为1
|
|
|
# theta为np.pi/2
|
|
|
# threshold为 118
|
|
|
# 其他的默认
|
|
|
|
|
|
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
|
|
|
|
|
|
# 使用HoughLinesP算法
|
|
|
# rho为1
|
|
|
# theta为np.pi/2
|
|
|
# threshold为 118
|
|
|
# 并设置上面提供的minLineLength和maxLineGap
|
|
|
# 其他的默认
|
|
|
|
|
|
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.imwrite('./static/abc.jpg', result)
|
|
|
#cv2.imwrite('D:/Mike/PycharmProjects/pythonProject/venv/def.jpg', result_P)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f11(request):
|
|
|
img = cv2.imread('./a1.jpg') # 根据路径读取一张图片
|
|
|
|
|
|
img = cv2.GaussianBlur(img, (3, 3), 0)
|
|
|
edges = cv2.Canny(img, 50, 150, apertureSize=3)
|
|
|
|
|
|
# 使用HoughLines算法
|
|
|
# rho为1
|
|
|
# theta为np.pi/2
|
|
|
# threshold为 118
|
|
|
# 其他的默认
|
|
|
|
|
|
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
|
|
|
|
|
|
# 使用HoughLinesP算法
|
|
|
# rho为1
|
|
|
# theta为np.pi/2
|
|
|
# threshold为 118
|
|
|
# 并设置上面提供的minLineLength和maxLineGap
|
|
|
# 其他的默认
|
|
|
|
|
|
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.imwrite('D:/Mike/PycharmProjects/djangoProject/static/abc.jpg', result)
|
|
|
cv2.imwrite('./static/abc.jpg', result_P)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f12(request):
|
|
|
filename = './a1.jpg'
|
|
|
|
|
|
# 1. 灰度模式读取图像,图像名为CRH
|
|
|
CRH = cv2.imread(filename, 0)
|
|
|
# 2. 计算图像梯度。首先要对读取的图像进行数据变换,因为使用了
|
|
|
# numpy对梯度进行数值计算,所以要使用
|
|
|
# CRH.astype('float')进行数据格式变换。
|
|
|
row, column = CRH.shape
|
|
|
CRH_f = np.copy(CRH)
|
|
|
gradient = np.zeros((row, column))
|
|
|
CRH = CRH.astype('float')
|
|
|
for x in range(row - 1):
|
|
|
for y in range(column - 1):
|
|
|
gx = abs(CRH[x + 1, y] - CRH[x, y])
|
|
|
gy = abs(CRH[x, y + 1] - CRH[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')
|
|
|
|
|
|
# 保存图像
|
|
|
filepath = './static/abc.jpg'
|
|
|
cv2.imwrite(filepath, gradient)
|
|
|
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f13_op(request):
|
|
|
img = cv2.imread('./a1.jpg', cv2.IMREAD_UNCHANGED)
|
|
|
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
|
|
|
# 2. 定义十字形结构元素
|
|
|
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10))
|
|
|
# 3. 对二值图进行开运算和闭运算操作
|
|
|
im_op = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
|
|
|
#im_cl = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
|
|
|
cv2.imwrite('./static/abc.jpg', im_op)
|
|
|
#cv2.imwrite('D:/Mike/PycharmProjects/pythonProject/venv/def.jpg', im_cl)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f13_cl(request):
|
|
|
img = cv2.imread('./a1.jpg', cv2.IMREAD_UNCHANGED)
|
|
|
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
|
|
|
# 2. 定义十字形结构元素
|
|
|
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (10, 10))
|
|
|
# 3. 对二值图进行开运算和闭运算操作
|
|
|
#im_op = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
|
|
|
im_cl = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
|
|
|
cv2.imwrite('./static/abc.jpg', im_cl)
|
|
|
#cv2.imwrite('D:/Mike/PycharmProjects/pythonProject/venv/def.jpg', im_cl)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f14(request):
|
|
|
filename = './a1.jpg'
|
|
|
# 读取图像
|
|
|
image = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
|
|
|
# 待输出的图片
|
|
|
output = np.zeros(image.shape, np.uint8)
|
|
|
# 遍历图像,获取叠加噪声后的图像
|
|
|
for i in range(image.shape[0]):
|
|
|
for j in range(image.shape[1]):
|
|
|
if image[i][j] < 100:
|
|
|
|
|
|
# 添加食盐噪声
|
|
|
output[i][j] = 255
|
|
|
|
|
|
# 添加胡椒噪声
|
|
|
elif image[i][j] > 200:
|
|
|
output[i][j] = 0
|
|
|
# 不添加噪声
|
|
|
else:
|
|
|
output[i][j] = image[i][j]
|
|
|
cv2.imwrite('./static/abc.jpg', output)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f15(request):
|
|
|
filename = './a1.jpg'
|
|
|
# 读取图像
|
|
|
image = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
|
|
|
# 待输出的图片
|
|
|
output = np.zeros(image.shape, np.uint8)
|
|
|
# 遍历图像,进行均值滤波
|
|
|
for i in range(image.shape[0]):
|
|
|
for j in range(image.shape[1]):
|
|
|
# 计算均值,完成对图片src的几何均值滤波
|
|
|
ji = 1.0
|
|
|
# 遍历滤波器内的像素值
|
|
|
for m in range(-1, 2):
|
|
|
# for n in range(-1, 2):
|
|
|
# 防止越界
|
|
|
if 0 <= j + m < image.shape[1]:
|
|
|
ji *= image[i][j + m]
|
|
|
|
|
|
# 滤波器的大小为1*3
|
|
|
output[i][j] = pow(ji, 1 / 3)
|
|
|
cv2.imwrite('./static/abc.jpg', output)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|
|
|
def f16(request):
|
|
|
|
|
|
return render(request,'home1.html')
|
|
|
def f17(request):
|
|
|
file_object = request.FILES.get("load")
|
|
|
print(file_object.name)
|
|
|
f = open('a2.png', mode='wb')
|
|
|
for chunk in file_object.chunks():
|
|
|
f.write(chunk)
|
|
|
f.close()
|
|
|
def color_transfer(source, target):
|
|
|
source = cv2.cvtColor(source, cv2.COLOR_BGR2LAB).astype("float32")
|
|
|
target = cv2.cvtColor(target, cv2.COLOR_BGR2LAB).astype("float32")
|
|
|
(lMeanSrc, lStdSrc, aMeanSrc, aStdSrc, bMeanSrc, bStdSrc) = image_stats(source)
|
|
|
(lMeanTar, lStdTar, aMeanTar, aStdTar, bMeanTar, bStdTar) = image_stats(target)
|
|
|
(l, a, b) = cv2.split(target)
|
|
|
l -= lMeanTar
|
|
|
a -= aMeanTar
|
|
|
b -= bMeanTar
|
|
|
l = (lStdTar / lStdSrc) * l
|
|
|
a = (aStdTar / aStdSrc) * a
|
|
|
b = (bStdTar / bStdSrc) * b
|
|
|
l += lMeanSrc
|
|
|
a += aMeanSrc
|
|
|
b += bMeanSrc
|
|
|
l = np.clip(l, 0, 255)
|
|
|
a = np.clip(a, 0, 255)
|
|
|
b = np.clip(b, 0, 255)
|
|
|
transfer = cv2.merge([l, a, b])
|
|
|
transfer = cv2.cvtColor(transfer.astype("uint8"), cv2.COLOR_LAB2BGR)
|
|
|
return transfer
|
|
|
|
|
|
def image_stats(image):
|
|
|
(l, a, b) = cv2.split(image)
|
|
|
(lMean, lStd) = (l.mean(), l.std())
|
|
|
(aMean, aStd) = (a.mean(), a.std())
|
|
|
(bMean, bStd) = (b.mean(), b.std())
|
|
|
return (lMean, lStd, aMean, aStd, bMean, bStd)
|
|
|
|
|
|
source = cv2.imread('./a2.png')
|
|
|
target = cv2.imread('./a1.jpg')
|
|
|
taransform = color_transfer(source, target)
|
|
|
source1 = cv2.resize(source, target.shape[0:2])
|
|
|
target1 = cv2.resize(target, target.shape[0:2])
|
|
|
taransform1 = cv2.resize(taransform, target.shape[0:2])
|
|
|
#result = np.hstack([source1, target1, taransform1])
|
|
|
result = np.hstack([taransform1])
|
|
|
cv2.imwrite('./static/abc.jpg', result)
|
|
|
return render(request, 'index.html', {'image': '/static/abc.jpg'})
|