JGWEV / data_web.py
HaisuGuan's picture
模型代码
7dfb05b
import numpy as np
import torchvision
import PIL
import cv2
def crop(image):
img_cv = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
height, width, _ = image.shape
# 指定要剪切的像素数量
pixels_to_remove = 5
# 剪切图像以去掉指定数量的像素
image = image[pixels_to_remove:height - pixels_to_remove, pixels_to_remove:width - pixels_to_remove]
# result = np.ones_like(image) * 255
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
threshold_value = 75
ret, binary_image = cv2.threshold(gray, threshold_value, 255, cv2.THRESH_BINARY)
image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2RGB)
# 进行边缘检测
edges = cv2.Canny(binary_image, 50, 150)
# 寻找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 设置面积阈值,根据实际情况调整
area_threshold = 200
# 遍历轮廓
for contour in contours:
# 计算轮廓的面积
area = cv2.contourArea(contour)
# 如果面积小于阈值,则涂成白色(255)
if area < area_threshold:
cv2.drawContours(image, [contour], 0, (255, 255, 255), thickness=cv2.FILLED)
# cv2.drawContours(result, [contour], 0, (0, 255, 0), thickness=2)
# for contour in contours:
# # 计算轮廓的面积
# area = cv2.contourArea(contour)
#
# # 如果面积小于阈值,则涂成白色(255)
# cv2.drawContours(result, [contour], 0, (0, 255, 0), thickness=1)
# 保存处理后的图像
# cv2.imwrite("2.png", result)
# image = result
# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 查找黑色像素的坐标
black_pixels = np.column_stack(np.where(gray_image == 0))
# 找到离上边框最近的黑色像素
top_pixel = black_pixels[np.argmin(black_pixels[:, 0])]
# 找到离下边框最近的黑色像素
bottom_pixel = black_pixels[np.argmax(black_pixels[:, 0])]
# 找到离左边框最近的黑色像素
left_pixel = black_pixels[np.argmin(black_pixels[:, 1])]
# 找到离右边框最近的黑色像素
right_pixel = black_pixels[np.argmax(black_pixels[:, 1])]
# 计算长方形的宽和高
width = right_pixel[1] - left_pixel[1]
height = bottom_pixel[0] - top_pixel[0]
# 计算长方形的左上角坐标
rectangle_top_left = (top_pixel[0], left_pixel[1])
# 创建包含长方形内容的新图像
rectangle_image = image[rectangle_top_left[0]:rectangle_top_left[0] + height,
rectangle_top_left[1]:rectangle_top_left[1] + width]
# 保存新图像
original_image = rectangle_image
height, width, _ = original_image.shape
# 计算正方形图片的边长,取较大的那个值
side_length = max(width, height) + 6 # 增加6像素的边缘间隔
# 创建一个白底的正方形图片
square_image = np.ones((side_length, side_length, 3), dtype=np.uint8) * 255
# 计算将原图放入正方形图片中的位置
x_offset = (side_length - width) // 2
y_offset = (side_length - height) // 2
# 将原图粘贴到正方形图片的中间
square_image[y_offset:y_offset + height, x_offset:x_offset + width] = original_image
return square_image
def web_input(image):
image_tmp = crop(image)
image_transforms = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])
input_img = PIL.Image.fromarray(image_tmp)
input_img = input_img.resize((100, 100), PIL.Image.LANCZOS)
wd_new, ht_new = input_img.size
wd_new = int(16 * np.ceil(wd_new / 16.0))
ht_new = int(16 * np.ceil(ht_new / 16.0))
input_img = input_img.resize((wd_new, ht_new), PIL.Image.LANCZOS)
return image_transforms(input_img).unsqueeze(0), image_tmp