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