65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
# @Time : 2024/4/15 9:23
|
|||
|
# @Author : len
|
|||
|
# @File : 感兴趣区域提取.py
|
|||
|
# @Software: PyCharm
|
|||
|
# @Comment :
|
|||
|
import os
|
|||
|
|
|||
|
import cv2
|
|||
|
import numpy as np
|
|||
|
from matplotlib import pyplot as plt
|
|||
|
|
|||
|
plt.rcParams['font.sans-serif'] = ['SimHei']
|
|||
|
|
|||
|
# 函数:加载图片,找到屏幕轮廓并显示
|
|||
|
def process_image(image_path):
|
|||
|
# 加载图片
|
|||
|
image = cv2.imread(image_path)
|
|||
|
|
|||
|
# 转换图片为灰度图
|
|||
|
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|||
|
|
|||
|
# 应用边缘检测
|
|||
|
edges = cv2.Canny(gray, 50, 150)
|
|||
|
|
|||
|
# 寻找轮廓
|
|||
|
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
|||
|
|
|||
|
# 按面积大小排序轮廓,并取最大的10个
|
|||
|
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
|
|||
|
|
|||
|
screen_contour = None
|
|||
|
for contour in contours:
|
|||
|
# 近似轮廓
|
|||
|
perimeter = cv2.arcLength(contour, True)
|
|||
|
approximation = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
|
|||
|
|
|||
|
# 屏幕轮廓应该有4个点(矩形)
|
|||
|
if len(approximation) == 4:
|
|||
|
screen_contour = approximation
|
|||
|
break
|
|||
|
|
|||
|
if screen_contour is not None:
|
|||
|
# 在原图上绘制轮廓
|
|||
|
cv2.drawContours(image, [screen_contour], -1, (0, 255, 0), 3)
|
|||
|
screen_image = cv2.polylines(image, [screen_contour], True, (0,255,0), 3)
|
|||
|
else:
|
|||
|
screen_image = image
|
|||
|
|
|||
|
# 展示结果
|
|||
|
plt.imshow(cv2.cvtColor(screen_image, cv2.COLOR_BGR2RGB))
|
|||
|
plt.title('屏幕检测')
|
|||
|
plt.show()
|
|||
|
|
|||
|
return screen_image
|
|||
|
|
|||
|
# 设置文件夹路径
|
|||
|
folder_path = './data/pingmu' # 将此路径替换为你的图片文件夹路径
|
|||
|
|
|||
|
# 遍历文件夹中的所有文件
|
|||
|
for filename in os.listdir(folder_path):
|
|||
|
if filename.lower().endswith(('.png', '.jpg', '.jpeg')): # 检查文件扩展名
|
|||
|
file_path = os.path.join(folder_path, filename) # 获取文件完整路径
|
|||
|
process_image(file_path) # 处理图片
|