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()