import cv2
import numpy as np
import torch
import torchvision.models as models
from torchvision import transforms
# 导入其他可能需要的库
# 1. 加载模型
model = models.resnet18(pretrained=False)
# 假设模型已经训练好并保存,这里加载模型
model.load_state_dict(torch.load('your_trained_model.pth'))
model.eval()
# 2. 图像预处理
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 3. 读取图像
image_path = 'your_image.jpg'
image = cv2.imread(image_path)
image_original = image.copy()
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = transform(image).unsqueeze(0)
# 4. 模型预测
with torch.no_grad():
outputs = model(image)
_, predicted = torch.max(outputs.data, 1)
confidence = torch.softmax(outputs, dim=1)[0][predicted.item()].item()
# 5. 计算物体面积占比(简单假设物体是通过轮廓检测得到,这里是一个简化示例)
gray = cv2.cvtColor(image_original, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
if contours:
max_contour = max(contours, key=cv2.contourArea)
object_area = cv2.contourArea(max_contour)
image_area = image_original.shape[0] * image_original.shape[1]
area_ratio = object_area / image_area
else:
area_ratio = 0
# 6. 条件判断及处理
if predicted.item() == 5 and area_ratio > 0.3 and confidence > 0.8:
# 将图像灰度化
gray_image = cv2.cvtColor(image_original, cv2.COLOR_BGR2GRAY)
# 保存新图像
cv2.imwrite('processed_image.jpg', gray_image)