python 实现多点找色 并进行偏色匹配
时间: 2023-08-05 09:12:14 浏览: 891
实现多点找色和偏色匹配可以使用Python的PIL库。
首先,需要导入PIL库和一些其他的模块:
```python
from PIL import ImageGrab
import numpy as np
import cv2
```
接下来,可以定义一个函数来进行多点找色。这个函数会接受一个颜色列表和一个截图区域作为参数,然后在这个区域内寻找颜色列表中的所有颜色,并返回它们的坐标。
```python
def multi_point_find_color(color_list, region):
img = ImageGrab.grab(region)
img_np = np.array(img)
img_hsv = cv2.cvtColor(img_np, cv2.COLOR_RGB2HSV)
coords = []
for color in color_list:
lower = np.array([color[0]-10, 50, 50])
upper = np.array([color[0]+10, 255, 255])
mask = cv2.inRange(img_hsv, lower, upper)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
c = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)
coords.append((x + w//2 + region[0], y + h//2 + region[1]))
return coords
```
这个函数首先使用ImageGrab库来截取指定区域的屏幕截图,并将其转换为NumPy数组。然后,将图像从RGB颜色空间转换为HSV颜色空间,以便更容易地进行颜色匹配。
接下来,函数会循环遍历颜色列表中的每个颜色,并使用cv2.inRange函数来创建一个掩膜,只包含与该颜色匹配的像素。然后,它使用cv2.findContours函数查找掩膜中的所有轮廓,并选择面积最大的轮廓作为匹配结果。最后,它计算该轮廓的中心坐标,并将其添加到坐标列表中。
有了这个函数,现在可以使用它来进行偏色匹配。可以定义一个新的函数来接受一个颜色列表和一个截图区域作为参数,然后使用multi_point_find_color函数来查找所有匹配的颜色,并将它们与指定的参考颜色进行比较。如果匹配的颜色与参考颜色的偏差小于指定的阈值,则将其添加到匹配列表中。
```python
def color_match(color_list, ref_color, region, threshold=30):
matches = []
coords = multi_point_find_color(color_list, region)
for coord in coords:
img = ImageGrab.grab((coord[0]-1, coord[1]-1, coord[0]+1, coord[1]+1))
img_np = np.array(img)
img_hsv = cv2.cvtColor(img_np, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(img_hsv)
diff = np.abs(h - ref_color[0])
if diff <= threshold:
matches.append(coord)
return matches
```
这个函数首先使用multi_point_find_color函数来查找颜色列表中的所有匹配颜色,并将它们存储在一个坐标列表中。然后,它循环遍历该列表中的每个坐标,并使用ImageGrab库来截取该坐标周围的一个非常小的区域(仅包含1个像素)。然后,它将该像素从RGB颜色空间转换为HSV颜色空间,并计算该颜色与参考颜色之间的差异。如果差异小于指定的阈值,则将该坐标添加到匹配列表中。
现在,可以调用color_match函数来查找所有匹配的偏色,并将它们存储在一个列表中:
```python
color_list = [(60, 255, 255), (120, 255, 255), (180, 255, 255)]
ref_color = (0, 255, 255)
region = (0, 0, 800, 600)
matches = color_match(color_list, ref_color, region, threshold=30)
print(matches)
```
在这个示例中,color_list是要查找的颜色列表,ref_color是参考颜色,region是截图区域,threshold是偏差阈值。该函数将返回所有匹配的颜色的坐标,将它们打印到控制台中。
阅读全文