import cv2 from PIL import Image, ImageEnhance,ImageColor import gradio as gr import numpy as np import datetime with gr.Blocks() as interface: with gr.Row(): with gr.Accordion("1.请选择一张待加工图片"): img_input = gr.Image(label='图片',interactive=True) with gr.Row(): with gr.Accordion("2.可更换勾边颜色,点加工图片"): color = gr.ColorPicker(label="勾边颜色") section_btn = gr.Button("加工图片") with gr.Accordion("【结果】4种勾边效果"): gr.Markdown("#### 手机下载图片,需长按图片2秒后松开,会出现保存方式") with gr.Row(): closed_output0 = gr.Image(label='简单勾边') closed_output1 = gr.Image(label='常规勾边') with gr.Row(): closed_output2 = gr.Image(label='细致勾边') closed_output3 = gr.Image(label='彩色勾边') # 调整模型结果参数 def turn_arguments(img,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 blend = 0.4 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 return result0,result1,result2,result3 section_btn.click(turn_arguments,inputs=[img_input,color], outputs = [closed_output0,closed_output1,closed_output2,closed_output3]) # outputs = [closed_output0,img_param_output0,closed_output1,img_param_output1,closed_output2,img_param_output2,closed_output3,img_param_output3]) def feed_back(fb_info): f = open('feedback.txt', mode='a',encoding='utf-8-sig') dt = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') result = f.writelines(dt+' , '+fb_info+'\n') print('result->',result) f.close() return '我们已收到,谢谢反馈!' ##################################### # 意见反馈 # ##################################### with gr.Accordion("点击我,反馈意见 or 提出需求",open=False): gr.Markdown("功能免费,服务无价,欢迎给我们提出任何意见和建议,我们会尽快改进") with gr.Row(): fb_info = gr.TextArea(label='反馈内容',lines=7,value='hi,') with gr.Row(): rInfo = gr.Markdown() with gr.Row(): fb_btn = gr.Button("反馈",elem_classes=".gradio-button {}") l = fb_btn.click(feed_back,inputs=[fb_info],outputs = [rInfo]) interface.launch(show_api=False)