一、代码
import pyautogui
import cv2
import numpy as np
import time
import os
# 获取屏幕尺寸
screen_width, screen_height = pyautogui.size()
screen_size = (1920, 1080)
# cv2.namedWindow("Screen Capture", cv2.WINDOW_NORMAL)
# cv2.resizeWindow("Screen Capture", screen_size // 2, screen_size // 2)
threshold1 = 24
threshold2 = 40
thickness = 1
image = cv2.imread('image.jpg')
# 将截图转换为OpenCV图像格式
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# 在这里进行OpenCV图像处理和分析
# ...
edges = cv2.Canny(gray, threshold1, threshold2,300)
contours, hierarchy = cv2.findContours(
edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
result = np.zeros_like(image)
cv2.drawContours(result, contours, -1, (255, 255, 255), thickness)
cv2.imshow('Result', result)
cv2.waitKey(0)
# cv2.rectangle(image, (x, y), (x + width, y + height), (0, 0, 255), 2)
# 显示图像
# cv2.imshow("Screen Capture", image)
cv2.destroyAllWindows()
二、介绍
1. 导入所需的库:
import pyautogui
import cv2
import numpy as np
import time
import os
2. 读取图像:
image = cv2.imread('image.jpg')
3. 将图像转换为灰度图像:
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
4. 对图像进行边缘检测:
threshold1 = 24
threshold2 = 40
thickness = 1
edges = cv2.Canny(gray, threshold1, threshold2,300)
cv2.Canny是OpenCV库中的一个函数,用于进行边缘检测。它采用Canny边缘检测算法,该算法是一种经典的边缘检测方法,能够有效地检测图像中的边缘。
该函数的语法如下:
edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)
参数说明:
- image:要进行边缘检测的输入图像,通常为灰度图像。
- threshold1:第一个阈值,用于边缘强度的低阈值。
- threshold2:第二个阈值,用于边缘强度的高阈值。
- apertureSize:Sobel算子的孔径大小,默认为3。
- L2gradient:一个布尔值,指定计算梯度幅值的方法。如果为True,则使用更精确但更慢的L2范数计算方法;如果为False,则使用默认的L1范数计算方法。
cv2.Canny函数会返回一个包含边缘像素的二值图像,其中边缘像素被设置为白色(255),非边缘像素被设置为黑色(0)。
5. 对边缘图像进行轮廓提取:
contours, hierarchy = cv2.findContours(
edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.findContours是OpenCV库中的一个函数,用于在二值图像中查找轮廓。
该函数的语法如下:
contours, hierarchy = cv2.findContours(image, mode, method)
参数说明:
参数image是输入的二值图像,mode是轮廓检索模式,method是轮廓近似方法。函数返回两个值,contours是一个包含所有轮廓的列表,每个轮廓都是一个点集的数组;hierarchy是轮廓的层级信息。
6. 创建一个空白图像作为结果:
result = np.zeros_like(image)
7. 绘制轮廓到结果图像上:
thickness = 1
cv2.drawContours(result, contours, -1, (255, 255, 255), thickness)
cv2.drawContours是OpenCV库中的一个函数,用于在图像上绘制轮廓。它可以用来可视化和分析图像中的对象边界。
该函数的语法如下:
cv2.drawContours(image, contours, contourIdx, color, thickness)
参数说明:
- image:要绘制轮廓的图像。
- contours:包含轮廓信息的列表。
- contourIdx:要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。
- color:绘制轮廓的颜色。
- thickness:轮廓线的粗细。
绘制轮廓的过程是通过连接轮廓上的点来实现的。轮廓是由一系列点组成的闭合曲线。
8. 显示结果图像:
cv2.imshow('Result', result)
cv2.waitKey(0)
# cv2.rectangle(image, (x, y), (x + width, y + height), (0, 0, 255), 2)
# 显示图像
# cv2.imshow("Screen Capture", image)
cv2.destroyAllWindows()
三、效果
四、总结
在提取图像边缘时,对阈值进行调参比较繁琐,提供如下几种方式:
1. 观察图像直方图:通过观察图像的直方图,可以了解到边缘和背景的灰度分布情况。根据直方图的形状,可以选择适当的阈值。
2. 使用自适应阈值:自适应阈值方法可以根据图像的局部特征来确定阈值。常见的自适应阈值方法有Otsu算法和局部自适应阈值算法。
3. 利用先验知识:根据对待检测对象的了解,可以根据其特征选择合适的阈值。例如,如果待检测对象的边缘明显且对比度高,可以选择较低的阈值。
4. 试错法:可以尝试不同的阈值参数,并观察结果。根据观察到的边缘检测效果,逐步调整阈值参数,直到达到满意的结果。
5. 使用评价指标:可以使用一些评价指标来评估边缘检测结果的好坏,例如精确度、召回率等。根据评价指标的结果,选择合适的阈值参数。