Spaces:
Runtime error
Runtime error
| import io | |
| import cv2 | |
| import numpy as np | |
| import requests | |
| from PIL import Image | |
| """ | |
| 1、测试lama-cleaner的inpaint api | |
| """ | |
| def test_inpaint_api(): | |
| """ | |
| 参数为image、mask | |
| :return: | |
| """ | |
| # 加载原始图像并将其转换为灰度图像 | |
| img_path = '/resources/jeyoo-img/img.png' | |
| mask_img_path = '/resources/jeyoo-img/img_mask.png' | |
| clean_img_path = "/resources/jeyoo-img/img_clean.png" | |
| img = cv2.imread(img_path) | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| cv2.imshow('gray', gray) | |
| cv2.imwrite(mask_img_path,gray) | |
| # image_file_object = cv2.imread(img_path) | |
| # mask_file_object = cv2.imread(mask_img_path) | |
| r = requests.post('http://127.0.0.1:7860/inpaint', | |
| files={ | |
| 'image': open(img_path, 'rb'), | |
| 'mask': open(mask_img_path, 'rb')}, | |
| data={ | |
| 'ldmSteps': 25, | |
| 'ldmSampler': "plms", | |
| 'zitsWireframe': bool(True), | |
| 'hdStrategy': "Crop", | |
| 'hdStrategyCropMargin': 196, | |
| 'hdStrategyCropTrigerSize': 800, | |
| 'hdStrategyResizeLimit': 2048, | |
| 'prompt': "", | |
| 'negativePrompt': "", | |
| 'croperX': 58, | |
| 'croperY': -26, | |
| 'croperHeight': 512, | |
| 'croperWidth': 512, | |
| 'useCroper': bool(False), | |
| 'sdMaskBlur': 5, | |
| 'sdStrength': 0.75, | |
| 'sdSteps': 50, | |
| 'sdGuidanceScale': 7.5, | |
| 'sdSampler': "pndm", | |
| 'sdSeed': -1, | |
| 'sdMatchHistograms': bool(False), | |
| 'sdScale': 1, | |
| 'cv2Radius': 5, | |
| 'cv2Flag': "INPAINT_NS", | |
| 'paintByExampleSteps': 50, | |
| 'paintByExampleGuidanceScale': 7.5, | |
| 'paintByExampleSeed': -1, | |
| 'paintByExampleMaskBlur': 5, | |
| 'paintByExampleMatchHistograms': bool(False), | |
| 'p2pSteps': 50, | |
| 'p2pImageGuidanceScale': 1.5, | |
| 'p2pGuidanceScale': 7.5, | |
| 'sizeLimit': 628 | |
| }, | |
| headers={'x-api-key': 'xxxx'} | |
| ) | |
| if (r.ok): | |
| # r.content contains the bytes of the returned image | |
| print(r) | |
| image_data = r.content | |
| # 将图片数据转换为图像对象 | |
| image = Image.open(io.BytesIO(image_data)) | |
| # 将图像对象保存到本地文件 | |
| image.save(clean_img_path) | |
| else: | |
| r.raise_for_status() | |
| """ | |
| 2、测试从从image根据 watermark 获取 mask img | |
| """ | |
| def test_get_mask_by_gradient(): | |
| """ | |
| 在这个示例代码中,我们首先读取一张图片,并将其转换为灰度图像。 | |
| 然后,我们使用Sobel算子计算图像的梯度,并计算像素变化的平均值。 | |
| 接着,我们将像素变化小于平均值一半的像素设置为0,得到一个二值掩码。 | |
| 最后,我们使用findContours函数找到掩码中的轮廓,并使用boundingRect函数获取每个轮廓的矩形框。 | |
| 最后,我们在原图上绘制矩形框,并显示结果。 | |
| """ | |
| # 读取图片 | |
| img = cv2.imread('../lama_cleaner_source_code/resources/jeyoo-img/image31.png') | |
| # 转换为灰度图像 | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| # 计算梯度 | |
| # src:gray图像 | |
| # ddepth:int类型的ddepth,输出图像的深度,若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F | |
| # dx、dy:X、y方向的差分阶数 | |
| grad_x = cv2.Sobel(gray, cv2.CV_32F, 1, 0) | |
| grad_y = cv2.Sobel(gray, cv2.CV_32F, 0, 1) | |
| # print("grad_x:{},grad_y:{}".format(grad_x,grad_y)) | |
| # gray_x、gray_y是矩阵,第二个参数是权重 | |
| grad = cv2.addWeighted(grad_x, 0.5, grad_y, 0.5, 0) | |
| # 计算像素变化小的区域 | |
| # 对数组中的每一个元素求其绝对值。 | |
| grad_abs = np.absolute(grad) | |
| # 相似变化的平均值 | |
| grad_mean = np.mean(grad_abs) | |
| # 0.7是最大 | |
| grad_threshold = grad_mean * 0.5 | |
| grad_mask = grad_abs < grad_threshold | |
| # for i, element in enumerate(grad_abs): | |
| # print("第 {} 行 ".format(i)) | |
| # for j in enumerate(element): | |
| # print("{}".format(j)) | |
| print("grad_mean:{},grad_threshold:{}".format(grad_mean,grad_threshold)) # grad_mean:93.4161148071289,grad_threshold:46.70805740356445 | |
| # 获取像素变化小的区域的矩形框 | |
| contours, hierarchy = cv2.findContours(grad_mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) | |
| # print(contours) | |
| rects = [cv2.boundingRect(cnt) for cnt in contours] | |
| # 在原图上绘制矩形框 | |
| for rect in rects: | |
| cv2.rectangle(img, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 0, 255), 2) | |
| # 显示结果 | |
| cv2.imshow('image', img) | |
| cv2.waitKey(0) | |
| cv2.destroyAllWindows() | |
| cv2.imwrite('../lama_cleaner_source_code/resources/jeyoo-img/out/imgage31.png',img) | |
| def test_get_mask_by_watermark(): | |
| """ | |
| 从image根据 watermark_img 获取mask img | |
| 要从图像中获取水印位置的掩码图像,您可以使用OpenCV中的模板匹配技术。模板匹配是一种在图像中查找给定模板的技术,它可以用于检测图像中的水印位置。 | |
| 以下是使用OpenCV从图像中获取水印位置的掩码图像的步骤: | |
| 加载原始图像和水印图像。 | |
| 将水印图像转换为灰度图像。 | |
| 使用OpenCV中的模板匹配函数(cv2.matchTemplate)在原始图像中查找水印图像的位置。 | |
| 根据匹配结果创建掩码图像。在掩码图像中,将匹配位置设置为白色,其他位置设置为黑色。 | |
| :return: | |
| """ | |
| # 加载原始图像和水印图像 | |
| img = cv2.imread('original_image.jpg') | |
| watermark = cv2.imread('watermark_image.jpg') | |
| # 将水印图像转换为灰度图像 | |
| watermark_gray = cv2.cvtColor(watermark, cv2.COLOR_BGR2GRAY) | |
| # 使用模板匹配在原始图像中查找水印图像的位置 | |
| result = cv2.matchTemplate(img, watermark_gray, cv2.TM_CCOEFF_NORMED) | |
| # 根据匹配结果创建掩码图像 | |
| threshold = 0.8 | |
| mask = np.zeros_like(result) | |
| mask[result >= threshold] = 255 | |
| # 显示掩码图像 | |
| cv2.imshow('Mask', mask) | |
| # 等待用户按下任意键 | |
| cv2.waitKey(0) | |
| # 释放窗口 | |
| cv2.destroyAllWindows() | |
| def test_get_mask_by_watermark2(): | |
| """ | |
| 在上面的代码中,我们使用Canny算子对灰度图像进行边缘检测,并使用cv2.findContours函数对边缘图像进行轮廓检测。 | |
| 然后,我们对每个轮廓进行形状分析,并根据筛选出的轮廓创建掩码图像。 | |
| 在筛选轮廓时,我们使用了cv2.isContourConvex函数来排除非凸形状的轮廓。您可以根据需要调整形状分析的参数来获得更好的结果。 | |
| :return: | |
| """ | |
| # 加载原始图像并将其转换为灰度图像 | |
| img = cv2.imread('../lama_cleaner_source_code/resources/jeyoo-img/img.png') | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| cv2.imshow('gray', gray) | |
| cv2.waitKey(0) | |
| # 对灰度图像进行边缘检测 | |
| edges = cv2.Canny(gray, 50, 150) | |
| cv2.imshow('edges', edges) | |
| cv2.waitKey(0) | |
| # 对边缘图像进行轮廓检测 | |
| contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) | |
| # 对每个轮廓进行形状分析,筛选出可能是水印的轮廓 | |
| watermark_contours = [] | |
| for contour in contours: | |
| perimeter = cv2.arcLength(contour, True) | |
| approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True) | |
| print(len(approx)) | |
| if len(approx) == 6 and cv2.isContourConvex(approx): | |
| watermark_contours.append(approx) | |
| # 根据筛选出的轮廓,创建掩码图像 | |
| mask = np.zeros_like(gray) | |
| for contour in watermark_contours: | |
| cv2.drawContours(mask, [contour], 0, 255, -1) | |
| # 显示掩码图像 | |
| cv2.imshow('Mask', mask) | |
| # 等待用户按下任意键 | |
| cv2.waitKey(0) | |
| # 释放窗口 | |
| cv2.destroyAllWindows() | |
| def test_get_mask_img_watermark3(): | |
| """ | |
| 要为水印区域生成掩码图像,您可以使用OpenCV中的矩形掩码。以下是生成掩码图像的步骤: | |
| 创建一个与原始图像大小相同的黑色图像,作为掩码图像。 | |
| 使用OpenCV中的 cv2.rectangle() 函数在掩码图像上绘制一个矩形,该矩形覆盖水印区域。 | |
| 将掩码图像转换为灰度图像,并使用OpenCV中的 cv2.threshold() 函数将其二值化,以便将水印区域设置为白色,其余区域设置为黑色。 | |
| :return: | |
| """ | |
| img = cv2.imread('../lama_cleaner_source_code/resources/jeyoo-img/img.png') | |
| # 创建掩码图像 | |
| mask = np.zeros_like(img) | |
| # 定义水印区域 | |
| x, y, w, h = 3, 18, 29, 29 | |
| # 在掩码图像上绘制矩形 | |
| cv2.rectangle(mask, (x, y), (x + w, y + h), (255, 255, 255), -1) | |
| # 将掩码图像转换为灰度图像 | |
| mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY) | |
| # 将掩码图像二值化 | |
| _, mask_binary = cv2.threshold(mask_gray, 1, 255, cv2.THRESH_BINARY) | |
| # 显示掩码图像 | |
| cv2.imshow('Mask', mask_binary) | |
| cv2.waitKey(0) | |
| cv2.destroyAllWindows() | |
| """ | |
| 3、测试从image根据 watermark 获取 mask img | |
| """ | |
| def test_get_mask_by_inrange(): | |
| """ | |
| 方式1 | |
| :return: | |
| """ | |
| img_path = '../lama_cleaner_docker/resources/jeyoo2-shuiyin.png' | |
| img = cv2.imread(img_path) | |
| # 转换为灰度图像 | |
| gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| # 计算掩码,删除像素位于该区间的 | |
| mask = cv2.inRange(gray, 240, 255) | |
| cv2.imshow('mask1', mask) | |
| cv2.waitKey(0) | |
| """ | |
| 方式2 | |
| """ | |
| # 读取图片 | |
| img = cv2.imread(img_path) | |
| cv2.imshow("img" ,img) | |
| cv2.waitKey(0) | |
| # 将图片转换为HSV颜色空间 | |
| hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) | |
| cv2.imshow("hsv", hsv) | |
| cv2.waitKey(0) | |
| means, dev = cv2.meanStdDev(img) | |
| print("means:{}".format(means)) | |
| # means: [[227.75111119] | |
| # [228.73636804] | |
| # [225.89541678]] | |
| # 定义颜色范围 | |
| lower_color = np.array([100, 100, 100]) | |
| upper_color = np.array([255, 255, 255]) | |
| # 创建掩码 | |
| mask2 = cv2.inRange(hsv, lower_color, upper_color) | |
| cv2.imshow("mask2", mask2) | |
| cv2.waitKey(0) | |
| # 获取选定区域 | |
| result = cv2.bitwise_and(img, img, mask=mask) | |
| # 显示结果 | |
| cv2.imshow('image', result) | |
| cv2.waitKey(0) | |
| cv2.destroyAllWindows() | |
| """ | |
| 测试opencv的inpaint修复方法 | |
| """ | |
| def test_repire_old_img_by_cv(): | |
| img = cv2.imread('../lama_cleaner_source_code/resources/jeyoo-shuiyin.png') | |
| mask = cv2.imread('../lama_cleaner_source_code/resources/jeyoo2-shuiyin_mask.jpg', cv2.IMREAD_GRAYSCALE) | |
| dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA) | |
| cv2.imshow('dst', dst) | |
| cv2.waitKey(0) | |
| cv2.destroyAllWindows() | |