68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
# @Time : 2024/4/15 9:39
|
|||
|
# @Author : len
|
|||
|
# @File : 感兴趣区域提取2.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_adjusted(image_path):
|
|||
|
# 加载图片
|
|||
|
image = cv2.imread(image_path)
|
|||
|
|
|||
|
# 将图片转换成灰度图
|
|||
|
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|||
|
|
|||
|
# 应用高斯模糊,减少噪点,提升边缘检测效果
|
|||
|
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
|
|||
|
|
|||
|
# 自适应阈值化创建二值图像
|
|||
|
threshold = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
|
|||
|
cv2.THRESH_BINARY_INV, 11, 2)
|
|||
|
|
|||
|
# 从阈值化的图像中找轮廓
|
|||
|
contours, _ = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
|||
|
|
|||
|
# 根据轮廓面积排序,并移除面积较小的轮廓
|
|||
|
contours = sorted(contours, key=cv2.contourArea, reverse=True)
|
|||
|
large_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 1000]
|
|||
|
|
|||
|
screen_contour = None
|
|||
|
for contour in large_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.axis('off') # 关闭坐标轴显示
|
|||
|
plt.show()
|
|||
|
|
|||
|
|
|||
|
# 设置文件夹路径
|
|||
|
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_adjusted(file_path)
|