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.

913 lines
30 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 numpy as np
import imutils
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QIcon, QColor
from PyQt5.QtWidgets import QListWidgetItem, QPushButton
from flags import *
import cv2
import random
from PIL import Image
class MyItem(QListWidgetItem):
def __init__(self, name=None, parent=None):
super(MyItem, self).__init__(name, parent=parent)
self.setIcon(QIcon('icons/color.png'))
self.setSizeHint(QSize(60, 60)) # size
def get_params(self):
protected = [v for v in dir(self) if v.startswith('_') and not v.startswith('__')]
param = {}
for v in protected:
param[v.replace('_', '', 1)] = self.__getattribute__(v)
return param
def update_params(self, param):
for k, v in param.items():
if '_' + k in dir(self):
self.__setattr__('_' + k, v)
class GrayingItem(MyItem):
def __init__(self, parent=None):
super(GrayingItem, self).__init__(' 灰度化 ', parent=parent)
self._mode = BGR2GRAY_COLOR
def __call__(self, img):
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
return img
class FilterItem(MyItem):
def __init__(self, parent=None):
super().__init__('平滑处理', parent=parent)
self._ksize = 3
self._kind = MEAN_FILTER
self._sigmax = 0
def __call__(self, img):
if self._kind == MEAN_FILTER:
img = cv2.blur(img, (self._ksize, self._ksize))
elif self._kind == GAUSSIAN_FILTER:
img = cv2.GaussianBlur(img, (self._ksize, self._ksize), self._sigmax)
elif self._kind == MEDIAN_FILTER:
img = cv2.medianBlur(img, self._ksize)
return img
class MorphItem(MyItem):
def __init__(self, parent=None):
super().__init__(' 形态学 ', parent=parent)
self._ksize = 3
self._op = ERODE_MORPH_OP
self._kshape = RECT_MORPH_SHAPE
def __call__(self, img):
op = MORPH_OP[self._op]
kshape = MORPH_SHAPE[self._kshape]
kernal = cv2.getStructuringElement(kshape, (self._ksize, self._ksize))
img = cv2.morphologyEx(img, self._op, kernal)
return img
class GradItem(MyItem):
def __init__(self, parent=None):
super().__init__('图像梯度', parent=parent)
self._kind = SOBEL_GRAD
self._ksize = 3
self._dx = 1
self._dy = 0
def __call__(self, img):
if self._dx == 0 and self._dy == 0 and self._kind != LAPLACIAN_GRAD:
self.setBackground(QColor(255, 0, 0))
self.setText('图像梯度 (无效: dx与dy不同时为0')
else:
self.setBackground(QColor(200, 200, 200))
self.setText('图像梯度')
if self._kind == SOBEL_GRAD:
img = cv2.Sobel(img, -1, self._dx, self._dy, self._ksize)
elif self._kind == SCHARR_GRAD:
img = cv2.Scharr(img, -1, self._dx, self._dy)
elif self._kind == LAPLACIAN_GRAD:
img = cv2.Laplacian(img, -1)
return img
class ThresholdItem(MyItem):
def __init__(self, parent=None):
super().__init__('阈值处理', parent=parent)
self._thresh = 127
self._maxval = 255
self._method = BINARY_THRESH_METHOD
def __call__(self, img):
method = THRESH_METHOD[self._method]
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img = cv2.threshold(img, self._thresh, self._thresh, method)[1]
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
return img
class EdgeItem(MyItem):
def __init__(self, parent=None):
super(EdgeItem, self).__init__('边缘检测', parent=parent)
self._thresh1 = 20
self._thresh2 = 100
def __call__(self, img):
img = cv2.Canny(img, threshold1=self._thresh1, threshold2=self._thresh2)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
return img
class ContourItem(MyItem):
def __init__(self, parent=None):
super(ContourItem, self).__init__('轮廓检测', parent=parent)
self._mode = TREE_CONTOUR_MODE
self._method = SIMPLE_CONTOUR_METHOD
self._bbox = NORMAL_CONTOUR
def __call__(self, img):
mode = CONTOUR_MODE[self._mode]
method = CONTOUR_METHOD[self._method]
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cnts, _ = cv2.findContours(img, mode, method)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
if self._bbox == RECT_CONTOUR:
bboxs = [cv2.boundingRect(cnt) for cnt in cnts]
print(bboxs)
for x, y, w, h in bboxs:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), thickness=2)
elif self._bbox == MINRECT_CONTOUR:
bboxs = [np.int0(cv2.boxPoints(cv2.minAreaRect(cnt))) for cnt in cnts]
img = cv2.drawContours(img, bboxs, -1, (255, 0, 0), thickness=2)
elif self._bbox == MINCIRCLE_CONTOUR:
circles = [cv2.minEnclosingCircle(cnt) for cnt in cnts]
print(circles)
for (x, y), r in circles:
img = cv2.circle(img, (int(x), int(y)), int(r), (255, 0, 0), thickness=2)
elif self._bbox == NORMAL_CONTOUR:
img = cv2.drawContours(img, cnts, -1, (255, 0, 0), thickness=2)
return img
class EqualizeItem(MyItem):
def __init__(self, parent=None):
super().__init__(' 均衡化 ', parent=parent)
self._blue = True
self._green = True
self._red = True
def __call__(self, img):
b, g, r = cv2.split(img)
if self._blue:
b = cv2.equalizeHist(b)
if self._green:
g = cv2.equalizeHist(g)
if self._red:
r = cv2.equalizeHist(r)
return cv2.merge((b, g, r))
class HoughLineItem(MyItem):
def __init__(self, parent=None):
super(HoughLineItem, self).__init__('直线检测', parent=parent)
self._rho = 1
self._theta = np.pi / 180
self._thresh = 10
self._min_length = 20
self._max_gap = 5
def __call__(self, img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
lines = cv2.HoughLinesP(img, self._rho, self._theta, self._thresh, minLineLength=self._min_length,
maxLineGap=self._max_gap)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
if lines is None:
return img
for line in lines:
for x1, y1, x2, y2 in line:
img = cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), thickness=2)
return img
class GammaItem(MyItem):
def __init__(self, parent=None):
super(GammaItem, self).__init__('伽马校正', parent=parent)
self._gamma = 1
def __call__(self, img):
gamma_table = [np.power(x / 255.0, self._gamma) * 255.0 for x in range(256)]
gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
return cv2.LUT(img, gamma_table)
# 重构:
# 裁剪:
class RotateAnyItem(MyItem): # 任意旋转
def __init__(self, parent=None):
super(RotateAnyItem, self).__init__('任意旋转', parent=parent)
self._angle = 0
def __call__(self, img):
img = imutils.rotate_bound(img, self._angle)
return img
class RotateLeftItem(MyItem): # 90度旋转
def __init__(self, parent=None):
super(RotateLeftItem, self).__init__('向左旋转', parent=parent)
def __call__(self, img):
img = imutils.rotate_bound(img, -90)
return img
class RotateRightItem(MyItem): # 90度旋转
def __init__(self, parent=None):
super(RotateRightItem, self).__init__('向右旋转', parent=parent)
def __call__(self, img):
img = imutils.rotate_bound(img, 90)
return img
class UpDownItem(MyItem):
def __init__(self, parent=None):
super(UpDownItem, self).__init__('上下翻折', parent=parent)
def __call__(self, img):
img = cv2.flip(img, 0)
return img
# 光效
class ExposureItem(MyItem):
def __init__(self, parent=None):
super(ExposureItem, self).__init__('曝光', parent=parent)
self._alpha = 1
def __call__(self, img):
blank = np.zeros(img.shape, img.dtype)
img = cv2.addWeighted(img, self._alpha, blank, 1 - self._alpha, 0)
return img
class LightItem(MyItem):
def __init__(self, parent=None):
super(LightItem, self).__init__('亮度调节', parent=parent)
self._beta = 0
def __call__(self, img):
blank = np.zeros(img.shape, img.dtype)
img = cv2.addWeighted(img, 1, blank, 0, self._beta)
return img
class ContrastItem(MyItem):
def __init__(self, parent=None):
super(ContrastItem, self).__init__('对比度调节', parent=parent)
self._alpha = 1
def __call__(self, img):
dst = np.ones(img.shape)
img = np.uint8(np.clip(self._alpha * (img - 127 * dst) + 127 * dst, 0, 255))
return img
# 色彩:
class ColorTemperatureItem(MyItem):
def __init__(self, parent=None):
super(ColorTemperatureItem, self).__init__('色温调节', parent=parent)
self._n = 50
def __call__(self, img):
level = self._n / 2
# src = img.clone()
info = img.shape
row = info[0]
col = info[1]
for i in range(0, row):
for j in range(0, col):
(r, b, g) = img[i, j]
rr = r - level
bb = b - level
gg = g + level
if rr > 255:
rr = 255
elif rr < 0:
rr = 0
if bb > 255:
bb = 255
elif bb < 0:
bb = 0
if gg > 255:
gg = 255
elif gg < 0:
gg = 0
img[i, j] = (rr, bb, gg)
return img
class HueItem(MyItem):
def __init__(self, parent=None):
super(HueItem, self).__init__('色调调节', parent=parent)
self._n = 50
def __call__(self, img):
level = self._n / 2
# src = img.clone()
info = img.shape
row = info[0]
col = info[1]
for i in range(0, row):
for j in range(0, col):
(r, b, g) = img[i, j]
rr = r + level
bb = b - level
gg = g + level
if rr > 255:
rr = 255
elif rr < 0:
rr = 0
if bb > 255:
bb = 255
elif bb < 0:
bb = 0
if gg > 255:
gg = 255
elif gg < 0:
gg = 0
img[i, j] = (rr, bb, gg)
return img
class SaturationItem(MyItem):
def __init__(self, parent=None):
super(SaturationItem, self).__init__('饱和度调节', parent=parent)
self._x = 0
def __call__(self, img):
img_t = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 获取hsv
h, s, v = cv2.split(img_t)
# 增加饱和度 饱和度越低,越接近灰度图像
s1 = np.clip(cv2.add(s, self._x), 0, 255)
img = np.uint8(cv2.merge((h, s1, v)))
img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR)
return img
# HSL:
class HSLRedItem(MyItem):
def __init__(self, parent=None):
super(HSLRedItem, self).__init__('红色', parent=parent)
self._red_param_s = 1.0
self._red_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._red_param_v - 1.0
value2 = self._red_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 0 < h < 10 or 156 < h < 180:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class HSLOrangeItem(MyItem):
def __init__(self, parent=None):
super(HSLOrangeItem, self).__init__('橙色', parent=parent)
self._orange_param_s = 1.0
self._orange_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._orange_param_v - 1.0
value2 = self._orange_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 11 < h < 25:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class HSLYellowItem(MyItem):
def __init__(self, parent=None):
super(HSLYellowItem, self).__init__('黄色', parent=parent)
self._yellow_param_s = 1.0
self._yellow_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._yellow_param_v - 1.0
value2 = self._yellow_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 26 < h < 34:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class HSLGreenItem(MyItem):
def __init__(self, parent=None):
super(HSLGreenItem, self).__init__('绿色', parent=parent)
self._green_param_s = 1.0
self._green_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._green_param_v - 1.0
value2 = self._green_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 35 < h < 77:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class HSLCyanItem(MyItem):
def __init__(self, parent=None):
super(HSLCyanItem, self).__init__('青色', parent=parent)
self._cyan_param_s = 1.0
self._cyan_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._cyan_param_v - 1.0
value2 = self._cyan_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 78 < h < 99:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class HSLBlueItem(MyItem):
def __init__(self, parent=None):
super(HSLBlueItem, self).__init__('蓝色', parent=parent)
self._blue_param_s = 1.0
self._blue_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._blue_param_v - 1.0
value2 = self._blue_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 100 < h < 124:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class HSLPurpleItem(MyItem):
def __init__(self, parent=None):
super(HSLPurpleItem, self).__init__('紫色', parent=parent)
self._purple_param_s = 1.0
self._purple_param_v = 1.0
def __call__(self, img):
img_hsl = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
info = img.shape
height = info[0]
width = info[1]
value1 = self._purple_param_v - 1.0
value2 = self._purple_param_s - 1.0
for m in range(height):
for w in range(width):
h, s, v = img_hsl[m, w]
b, g, r = img[m, w]
tag = abs((int(b) - int(g)) * (int(g) - int(r)))
if 43 < s < 255 and 46 < v < 255 and tag > 1600:
if 125 < h < 155:
b = (b + (b - v) * value2)
g = (g + (g - v) * value2)
r = (r + (r - v) * value2)
b = b + value1 * (255 - b)
g = g + value1 * (255 - g)
r = r + value1 * (255 - r)
img[m, w] = [b, g, r]
return img
class PixelateItem(MyItem):
def __init__(self, parent=None):
super(PixelateItem, self).__init__('像素化', parent=parent)
self._size = 100
def __call__(self, img):
height, width = img.shape[:2]
# Desired "pixelated" size
w, h = (self._size, self._size)
# Resize input to "pixelated" size
temp = cv2.resize(img, (w, h), interpolation=cv2.INTER_LINEAR)
# Initialize output image
img = cv2.resize(temp, (width, height), interpolation=cv2.INTER_NEAREST)
return img
class BlurItem(MyItem):
def __init__(self, parent=None):
super(BlurItem, self).__init__('模糊', parent=parent)
self._size = 5
def __call__(self, img):
img = cv2.blur(img, (self._size, self._size))
return img
class CandyStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(CandyStyleTransformItem, self).__init__('candy', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/candy.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class CompositionStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(CompositionStyleTransformItem, self).__init__('composition', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/composition_vii.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class FeathersStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(FeathersStyleTransformItem, self).__init__('feathers', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/feathers.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class MuseStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(MuseStyleTransformItem, self).__init__('la_muse', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/la_muse.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class MosaicStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(MosaicStyleTransformItem, self).__init__('mosaic', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/mosaic.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class StarryNightStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(StarryNightStyleTransformItem, self).__init__('starry_night', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/starry_night.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class ScreamStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(ScreamStyleTransformItem, self).__init__('the_scream', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/the_scream.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class WaveStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(WaveStyleTransformItem, self).__init__('the_wave', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/the_wave.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class UdnieStyleTransformItem(MyItem):
def __init__(self, parent=None):
super(UdnieStyleTransformItem, self).__init__('udnie', parent=parent)
def __call__(self, img):
net = cv2.dnn.readNetFromTorch("./style/udnie.t7")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
# img = cv2.imread("D:\\t\\1.jpg")
# res = cv2.resize(img, (500, 300))
row, column, _ = img.shape
blob = cv2.dnn.blobFromImage(img, 1.0, (column, row), (103.939, 116.779, 123.680), swapRB=False, crop=False)
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.680
# output = out/255
out = out.transpose(1, 2, 0)
# output = output.transpose(1, 2, 0)
# cv2.imshow("out", output)
cv2.imwrite("tmp.jpg", out)
out2 = cv2.imread("tmp.jpg")
# out_res = cv2.resize(out, (500, 300))
return out2
class ClarityItem(MyItem):
def __init__(self, parent=None):
super(ClarityItem, self).__init__('锐化', parent=parent)
def __call__(self, img):
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst = cv2.filter2D(img, -1, kernel=kernel)
return dst
class NoiseItem(MyItem):
def __init__(self, parent=None):
super(NoiseItem, self).__init__('噪点', parent=parent)
def __call__(self, img):
num = int(0.02 * img.shape[0] * img.shape[1]) # 椒盐噪声点数量
random.randint(0, img.shape[0])
img2 = img.copy()
for i in range(num):
X = random.randint(0, img2.shape[0] - 1) # 从0到图像长度之间的一个随机整数,因为是闭区间所以-1
Y = random.randint(0, img2.shape[1] - 1)
if random.randint(0, 1) == 0: # 黑白色概率55开
img2[X, Y] = (255, 255, 255) # 白色
else:
img2[X, Y] = (0, 0, 0) # 黑色
return img2
class ImageCutItem(MyItem):
def __init__(self, parent=None):
super(ImageCutItem, self).__init__('裁剪', parent=parent)
self._x1 = 0
self._x2 = 300
self._y1 = 200
self._y2 = 600
def __call__(self, img):
dst = img[self._y1:self._y2, self._x1:self._x2]
return dst