import cv2 import numpy as np import random from threading import Thread import platform system_type = 'Linux' if 'Windows' in platform.platform(): system_type = 'Windows' def imread(file_path,mod = 'normal',loadsize = 0, rgb=False): ''' mod: 'normal' | 'gray' | 'all' loadsize: 0->original ''' if system_type == 'Linux': if mod == 'normal': img = cv2.imread(file_path,1) elif mod == 'gray': img = cv2.imread(file_path,0) elif mod == 'all': img = cv2.imread(file_path,-1) #In windows, for chinese path, use cv2.imdecode insteaded. #It will loss EXIF, I can't fix it else: if mod == 'normal': img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),1) elif mod == 'gray': img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),0) elif mod == 'all': img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1) if loadsize != 0: img = resize(img, loadsize, interpolation=cv2.INTER_CUBIC) if rgb and img.ndim==3: img = img[:,:,::-1] return img def imwrite(file_path,img,use_thread=False): ''' in other to save chinese path images in windows, this fun just for save final output images ''' def subfun(file_path,img): if system_type == 'Linux': cv2.imwrite(file_path, img) else: cv2.imencode('.jpg', img)[1].tofile(file_path) if use_thread: t = Thread(target=subfun,args=(file_path, img,)) t.daemon() t.start else: subfun(file_path,img) def resize(img,size,interpolation=cv2.INTER_LINEAR): ''' cv2.INTER_NEAREST      最邻近插值点法 cv2.INTER_LINEAR        双线性插值法 cv2.INTER_AREA         邻域像素再取样插补 cv2.INTER_CUBIC        双立方插补,4*4大小的补点 cv2.INTER_LANCZOS4 8x8像素邻域的Lanczos插值 ''' h, w = img.shape[:2] if np.min((w,h)) ==size: return img if w >= h: res = cv2.resize(img,(int(size*w/h), size),interpolation=interpolation) else: res = cv2.resize(img,(size, int(size*h/w)),interpolation=interpolation) return res def resize_like(img,img_like): h, w = img_like.shape[:2] img = cv2.resize(img, (w,h)) return img def ch_one2three(img): res = cv2.merge([img, img, img]) return res def color_adjust(img,alpha=0,beta=0,b=0,g=0,r=0,ran = False): ''' g(x) = (1+α)g(x)+255*β, g(x) = g(x[:+b*255,:+g*255,:+r*255]) Args: img : input image alpha : contrast beta : brightness b : blue hue g : green hue r : red hue ran : if True, randomly generated color correction parameters Retuens: img : output image ''' img = img.astype('float') if ran: alpha = random.uniform(-0.1,0.1) beta = random.uniform(-0.1,0.1) b = random.uniform(-0.05,0.05) g = random.uniform(-0.05,0.05) r = random.uniform(-0.05,0.05) img = (1+alpha)*img+255.0*beta bgr = [b*255.0,g*255.0,r*255.0] for i in range(3): img[:,:,i]=img[:,:,i]+bgr[i] return (np.clip(img,0,255)).astype('uint8') def CAdaIN(src,dst): ''' make src has dst's style ''' return np.std(dst)*((src-np.mean(src))/np.std(src))+np.mean(dst) def makedataset(target_image,orgin_image): target_image = resize(target_image,256) orgin_image = resize(orgin_image,256) img = np.zeros((256,512,3), dtype = "uint8") w = orgin_image.shape[1] img[0:256,0:256] = target_image[0:256,int(w/2-256/2):int(w/2+256/2)] img[0:256,256:512] = orgin_image[0:256,int(w/2-256/2):int(w/2+256/2)] return img def find_mostlikely_ROI(mask): contours,hierarchy=cv2.findContours(mask, cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) if len(contours)>0: areas = [] for contour in contours: areas.append(cv2.contourArea(contour)) index = areas.index(max(areas)) mask = np.zeros_like(mask) mask = cv2.fillPoly(mask,[contours[index]],(255)) return mask def boundingSquare(mask,Ex_mul): # thresh = mask_threshold(mask,10,threshold) area = mask_area(mask) if area == 0 : return 0,0,0,0 x,y,w,h = cv2.boundingRect(mask) center = np.array([int(x+w/2),int(y+h/2)]) size = max(w,h) point0=np.array([x,y]) point1=np.array([x+size,y+size]) h, w = mask.shape[:2] if size*Ex_mul > min(h, w): size = min(h, w) halfsize = int(min(h, w)/2) else: size = Ex_mul*size halfsize = int(size/2) size = halfsize*2 point0 = center - halfsize point1 = center + halfsize if point0[0]<0: point0[0]=0 point1[0]=size if point0[1]<0: point0[1]=0 point1[1]=size if point1[0]>w: point1[0]=w point0[0]=w-size if point1[1]>h: point1[1]=h point0[1]=h-size center = ((point0+point1)/2).astype('int') return center[0],center[1],halfsize,area def mask_threshold(mask,ex_mun,threshold): mask = cv2.threshold(mask,threshold,255,cv2.THRESH_BINARY)[1] mask = cv2.blur(mask, (ex_mun, ex_mun)) mask = cv2.threshold(mask,threshold/5,255,cv2.THRESH_BINARY)[1] return mask def mask_area(mask): mask = cv2.threshold(mask,127,255,0)[1] # contours= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[1] #for opencv 3.4 contours= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[0]#updata to opencv 4.0 try: area = cv2.contourArea(contours[0]) except: area = 0 return area def replace_mosaic(img_origin,img_fake,mask,x,y,size,no_feather): img_fake = cv2.resize(img_fake,(size*2,size*2),interpolation=cv2.INTER_CUBIC) if no_feather: img_origin[y-size:y+size,x-size:x+size]=img_fake return img_origin else: # #color correction # RGB_origin = img_origin[y-size:y+size,x-size:x+size].mean(0).mean(0) # RGB_fake = img_fake.mean(0).mean(0) # for i in range(3):img_fake[:,:,i] = np.clip(img_fake[:,:,i]+RGB_origin[i]-RGB_fake[i],0,255) #eclosion eclosion_num = int(size/10)+2 mask_crop = cv2.resize(mask,(img_origin.shape[1],img_origin.shape[0]))[y-size:y+size,x-size:x+size] mask_crop = ch_one2three(mask_crop) mask_crop = (cv2.blur(mask_crop, (eclosion_num, eclosion_num))) mask_crop = mask_crop/255.0 img_crop = img_origin[y-size:y+size,x-size:x+size] img_origin[y-size:y+size,x-size:x+size] = np.clip((img_crop*(1-mask_crop)+img_fake*mask_crop),0,255).astype('uint8') return img_origin def Q_lapulase(resImg): ''' Evaluate image quality score > 20 normal score > 50 clear ''' img2gray = cv2.cvtColor(resImg, cv2.COLOR_BGR2GRAY) img2gray = resize(img2gray,512) res = cv2.Laplacian(img2gray, cv2.CV_64F) score = res.var() return score def psnr(img1,img2): mse = np.mean((img1/255.0-img2/255.0)**2) if mse < 1e-10: return 100 psnr_v = 20*np.log10(1/np.sqrt(mse)) return psnr_v def splice(imgs,splice_shape): '''Stitching multiple images, all imgs must have the same size imgs : [img1,img2,img3,img4] splice_shape: (2,2) ''' h,w,ch = imgs[0].shape output = np.zeros((h*splice_shape[0],w*splice_shape[1],ch),np.uint8) cnt = 0 for i in range(splice_shape[0]): for j in range(splice_shape[1]): if cnt < len(imgs): output[h*i:h*(i+1),w*j:w*(j+1)] = imgs[cnt] cnt += 1 return output