fetch sketches
2019-07-15 本文已影响0人
狼无雨雪
import numpy as np
import cv2
import time
import os
import random
import threading
import multiprocessing
import urllib
import warnings
from multiprocessing import Lock
warnings.filterwarnings("ignore")
def convert2Sketch( img, white_threshold ):
scope = 255 / (255-white_threshold)
b = -scope * white_threshold
[m,n,c] = img.shape
# Remove colors
if c > 1:
temp_img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# img_gray[:,:,1] = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
# img_gray[:,:,2] = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
# img_gray[:,:,3] = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
else:
temp_img_gray = img
# img_gray[:,:,1] = img;
# img_gray[:,:,2] = img;
# img_gray[:,:,3] = img;
img_gray = [temp_img_gray,temp_img_gray,temp_img_gray]
img_gray = np.array(img_gray).swapaxes(0,1)
img_gray = np.array(img_gray).swapaxes(1,2)
# print(np.array(img_gray).shape)
# figure('Name', 'Remove colors'); imshow(img_gray);
# cv2.imwrite("test1.jpg",img_gray)
# Adjust curve
for i in range(m):
for j in range(n):
# print(img_gray[i, j, 1])
if img_gray[i, j, 0] <= white_threshold:
img_gray[i, j, :] = np.zeros(3);
else:
img_gray[i, j, :] = scope * img_gray[i, j, :] + b;
# figure('Name','Adjust curve'); imshow(uint8(img_gray));
# Copy layer 1 to layer 2 and reverse colors.
img_gray2 = np.zeros([m, n, 3]);
img_mix = np.zeros([m, n, 3]);
for i in range(m):
for j in range(n):
img_gray2[i, j, 0] = 255 - img_gray[i, j, 0];
img_gray2[i, j, 1] = 255 - img_gray[i, j, 1];
img_gray2[i, j, 2] = 255 - img_gray[i, j, 2];
# Min filter
radius = 1;
# cv2.imwrite("test2.jpg",img_gray2)
img_gray2 = min_filter(img_gray2, radius);
# cv2.imwrite("test3.jpg",img_gray2)
# figure('Name', 'Min filter'); imshow(uint8(img_gray2));
# Mix layers
img_mix = color_dodge(img_gray2, img_gray);
# cv2.imwrite("test4.jpg",img_mix)
img_mix = np.array(img_mix).astype(np.uint8)
# cv2.imwrite("test5.jpg",img_mix)
res = np.array(img_mix).astype(np.uint8);
return res
# figure('Name', 'Mix layers'); imshow(res);
# Function for layer mixture
def color_dodge(layer1, layer2):
#((uint8)((B == 255) ? B:min(255, ((A << 8 ) / (255 - B)))))
[m, n, c] = layer2.shape;
if c == 1:
res = np.zeros([m, n]);
for i in range(m):
for j in range(n):
if layer2[i, j] == 255:
res[i, j] = 255;
else:
res[i, j] = min(255, (layer1[i, j]*256 / (255 - layer2[i, j])));
else:
res = np.zeros([m, n, c]);
for i in range(m):
for j in range(n):
for k in range(c):
if layer2[i, j, k] == 255:
res[i, j, k] = 255;
else:
res[i, j, k] = min(255, (layer1[i, j, k]*256 / (255 - layer2[i, j, k])));
return res
# Function for min filter
def min_filter(img, radius):
[m, n, c] = img.shape;
filter_width = 1 + 2 * radius;
if c == 1:
res = np.zeros([m, n]);
for i in range( m-2*radius ):
for j in range(n-2*radius ):
current_min = np.min(np.min(img[i:i+2*radius, j:j+2*radius]));
res[i:i+2*radius, j:j+2*radius] = np.ones([filter_width, filter_width]) * float(current_min);
else:
res = np.zeros([m, n, c]);
for i in range(m-2*radius):
for j in range(n-2*radius):
for k in range(c):
current_min = np.min(np.min(img[i:i+2*radius, j:j+2*radius, k]));
res[i:i+2*radius+1, j:j+2*radius+1, k] = np.ones([filter_width, filter_width]) * float(current_min);
return res
# Function for max filter
def max_filter(img, radius):
[m, n, c] = img.shape;
filter_width = 1 + 2 * radius;
if c == 1:
res = np.zeros([m, n]);
for i in range(m-2*radius):
for j in range(n-2*radius):
current_max = np.max(np.max(img[i:i+2*radius+1, j:j+2*radius+1]));
res[i:i+2*radius+1, j:j+2*radius+1]= np.ones([filter_width, filter_width]) * float(current_max);
else:
res = np.zeros([m, n, c]);
for i in range(m-2*radius):
for j in range(n-2*radius):
for k in range(c):
current_max = np.max(np.max(img[i:i+2*radius+1, j:j+2*radius+1, k]));
res[i:i+2*radius+1, j:j+2*radius+1, k] = np.ones([filter_width, filter_width]) * float(current_max);
return res
def get_image_url(index, index2, index3, line, input_filename,output_filename ):
try:
try:
lock = Lock()
lock.acquire()
img = cv2.imread(input_filename)
img = np.array(np.array(img).astype(np.float64) * 1.5).astype(np.uint8);
white_threshold = 40;
img_res = convert2Sketch(img, white_threshold);
cv2.imwrite(output_filename,img_res)
except Exception as e:
print(e, index, index2, index3, line)
finally:
lock.release()
except Exception as e:
pass
finally:
pass
def running_processing(index, index2, lines, input_filename,output_filename):
threads = []
for index3, line in enumerate(lines) :
print("--------------------------line------------------------------",index, index2, index3, line)
t = threading.Thread(target= get_image_url, args=(index, index2, index3, line, input_filename[index3], output_filename[index3]))
threads.append(t)
for index_i, thread in enumerate(threads):
# thread.setDaemon(True)
thread.start()
for index_j, thread in enumerate(threads):
thread.join()
if __name__ == "__main__":
Threads_number = 10
Processes_number = 4
input_path = "input"
output_path = "output"
if not os.path.exists(output_path):
os.makedirs(output_path)
index = 0
temp_lines = []
file_name_list = []
output_file_name_list = []
all_temp_lines = []
all_file_name_list = []
all_output_file_name_list = []
all_lines = os.listdir(input_path)
len_all_lines = len(all_lines)
for index,line in enumerate(all_lines):
try:
file_name = input_path + "/" + line
output_file_name = output_path + "/" + line
temp_lines.append(line)
file_name_list.append(file_name)
output_file_name_list.append(output_file_name)
if len(temp_lines) % Threads_number == 0 or len_all_lines == (index + 1):
all_temp_lines.append(temp_lines)
all_file_name_list.append(file_name_list)
all_output_file_name_list.append(output_file_name_list)
if len(all_temp_lines) % Processes_number == 0 or len_all_lines == (index + 1):
# print("len(temp_lines)", len(temp_lines))
# print("len(all_temp_lines)", len(all_temp_lines))
multiThreads = []
for index2, value in enumerate(all_temp_lines):
mt = multiprocessing.Process(target=running_processing,args=(index, index2, all_temp_lines[index2], all_file_name_list[index2], all_output_file_name_list[index2]))
mt.start()
multiThreads.append(mt)
for mthread in multiThreads:
mthread.join()
all_temp_lines = []
all_file_name_list = []
all_output_file_name_list = []
temp_lines = []
file_name_list = []
output_file_name_list = []
except Exception as e:
print(e,line)