fetch sketches

作者: 狼无雨雪 | 来源:发表于2019-07-15 14:08 被阅读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)

相关文章

网友评论

    本文标题:fetch sketches

    本文链接:https://www.haomeiwen.com/subject/sdzrhctx.html