import cv2 from PIL import Image, ImageEnhance,ImageColor import gradio as gr import numpy as np with gr.Blocks() as interface: with gr.Accordion("请选择一张图片"): # gr.Markdown("Look at me...") img_input = gr.Image(label='请选择一张待加工图片') with gr.Accordion("每次调整参数后,点击【加工图片】按钮,得到图片的勾边"): with gr.Row(): enhance = gr.Slider(0, 1, 0.8, step=0.1, label="图片彩色度") blend = gr.Slider(0, 1, 0.4, step=0.1, label="颜色填充度") color = gr.ColorPicker(label="勾边颜色") section_btn = gr.Button("加工图片") with gr.Accordion("提供4种勾边效果,均可下载本地"): with gr.Row(): closed_output0 = gr.Image(label='自选颜色勾边') img_param_output0 = gr.Image(label='极简勾边') with gr.Row(): closed_output1 = gr.Image(label='自选颜色勾边') img_param_output1 = gr.Image(label='简单勾边') with gr.Row(): closed_output2 = gr.Image(label='自选颜色勾边') img_param_output2 = gr.Image(label='细致勾边') with gr.Row(): closed_output3 = gr.Image(label='彩色勾边') img_param_output3 = gr.Image(label='图片+勾边合成图') # 调整模型结果参数 def turn_arguments(img,enhance,blend,color): imageX = Image.fromarray(img) contrast = ImageEnhance.Contrast(imageX) imageX = contrast.enhance(1.5) sharpness = ImageEnhance.Sharpness(imageX) imageX = sharpness.enhance(1.5) img = np.asarray(imageX) ##################################### # 极简勾边-自选颜色 # ##################################### gaussian_blur_0 = 13 structuring_element_0 = 3 canny_start_0 = 65 canny_end_0 = 100 thresh_val_0 = 205 maxval_0 = 330 gray0 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像进行高斯滤波,以去除噪声 gray0 = cv2.GaussianBlur(gray0, (gaussian_blur_0,gaussian_blur_0), 0) # 使用Canny算子进行边缘检测 edges0 = cv2.Canny(gray0, canny_start_0, canny_end_0) # 将边缘图像转换为二值图像 _, thresh0 = cv2.threshold(edges0, thresh_val_0, maxval_0, cv2.THRESH_BINARY) # 对二值图像进行形态学操作,以去除小的噪点 kernel0 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (structuring_element_0, structuring_element_0)) closed0 = cv2.morphologyEx(thresh0, cv2.MORPH_CLOSE, kernel0) closed0 = closed0.astype(img.dtype) result0 = cv2.bitwise_and(img, img, mask=closed0) result0[closed0==0] = (255,255,255) line_color0 = ImageColor.getcolor(color, "RGB") result0[closed0!=0] = (line_color0) close00 = Image.fromarray(result0).convert('RGB') # 颜色空间转换 image0 = Image.fromarray(img) enhancer0 = ImageEnhance.Color(image=image0) # 增强颜色 img0 = enhancer0.enhance(enhance).convert('RGB') union_img0 = np.asarray(Image.blend(close00, img0, blend)) ##################################### # 简单勾边-自选颜色 # ##################################### gaussian_blur_1 = 13 structuring_element_1 = 3 canny_start_1 = 25 canny_end_1 = 45 thresh_val_1 = 205 maxval_1 = 330 gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像进行高斯滤波,以去除噪声 gray1 = cv2.GaussianBlur(gray1, (gaussian_blur_1,gaussian_blur_1), 0) # 使用Canny算子进行边缘检测 edges1 = cv2.Canny(gray1, canny_start_1, canny_end_1) # 将边缘图像转换为二值图像 _, thresh1 = cv2.threshold(edges1, thresh_val_1, maxval_1, cv2.THRESH_BINARY) # 对二值图像进行形态学操作,以去除小的噪点 kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (structuring_element_1, structuring_element_1)) closed1 = cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel1) closed1 = closed1.astype(img.dtype) result1 = cv2.bitwise_and(img, img, mask=closed1) result1[closed1==0] = (255,255,255) line_color1 = ImageColor.getcolor(color, "RGB") result1[closed1!=0] = (line_color1) close01 = Image.fromarray(result1).convert('RGB') # 颜色空间转换 image1 = Image.fromarray(img) enhancer1 = ImageEnhance.Color(image=image1) # 增强颜色 img1 = enhancer1.enhance(enhance).convert('RGB') union_img1 = np.asarray(Image.blend(close01, img1, blend)) ##################################### # 复杂勾边-自选颜色 # ##################################### gaussian_blur_2 = 13 structuring_element_2 = 3 canny_start_2 = 10 canny_end_2 = 40 thresh_val_2 = 205 maxval_2 = 330 gray2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像进行高斯滤波,以去除噪声 gray2 = cv2.GaussianBlur(gray2, (gaussian_blur_2,gaussian_blur_2), 0) # 使用Canny算子进行边缘检测 edges2 = cv2.Canny(gray2, canny_start_2, canny_end_2) # 将边缘图像转换为二值图像 _, thresh2 = cv2.threshold(edges2, thresh_val_2, maxval_2, cv2.THRESH_BINARY) # 对二值图像进行形态学操作,以去除小的噪点 kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (structuring_element_2, structuring_element_2)) closed2 = cv2.morphologyEx(thresh2, cv2.MORPH_CLOSE, kernel2) closed2 = closed2.astype(img.dtype) result2 = cv2.bitwise_and(img, img, mask=closed2) result2[closed2==0] = (255,255,255) line_color2 = ImageColor.getcolor(color, "RGB") result2[closed2!=0] = (line_color2) close02 = Image.fromarray(result2).convert('RGB') # 颜色空间转换 image2 = Image.fromarray(img) enhancer2 = ImageEnhance.Color(image=image2) # 增强颜色 img2 = enhancer2.enhance(enhance).convert('RGB') union_img2 = np.asarray(Image.blend(close02, img2, blend)) ##################################### # 简单勾边-彩色勾边 # ##################################### closed3 = closed1.astype(img.dtype) result3 = cv2.bitwise_and(img, img, mask=closed3) result3[closed3==0] = (255,255,255) close03 = Image.fromarray(result3).convert('RGB') # 颜色空间转换 image3 = Image.fromarray(img) enhancer3 = ImageEnhance.Color(image=image3) # 增强颜色 img3 = enhancer3.enhance(enhance).convert('RGB') union_img3 = np.asarray(Image.blend(close03, img3, blend)) return result0,union_img0,result1,union_img1,result2,union_img2,result3,union_img3 section_btn.click(turn_arguments,inputs=[img_input,enhance,blend,color], outputs = [closed_output0,img_param_output0,closed_output1,img_param_output1,closed_output2,img_param_output2,closed_output3,img_param_output3]) interface.launch(show_api=False)