python实现连连看辅助(图像识别)

本文介绍了一位作者出于兴趣使用Python编写连连看辅助程序的过程,包括总体思路、实现难点、完整代码及总结。关键步骤涉及游戏窗口获取、图标切图、图像识别与消除算法。在实现中,作者遇到图片切割、窗口获取、图片处理和相似度判断等问题,最终因图标识别困难和参数调整未达到理想效果。
摘要由CSDN通过智能技术生成

个人兴趣,用python实现连连看的辅助程序,总结实现过程及知识点。

总体思路

  1. 获取连连看程序的窗口并前置
  2. 游戏界面截图,将每个一小图标切图,并形成由小图标组成的二维列表
  3. 对图片的二维列表遍历,将二维列表转换成由数字组成的二维数组,图片相同的数值相同。
  4. 遍历二维数组,找到可消除的对象,实现算法:
    1. 两个图标相邻。(一条线连接)
    2. 两个图标同行,同列,且中间的图标全部为空(数值为0)(一条线连接)
    3. 两条线连接,转弯一次,路径上所有图标为空。(二条线连接)
    4. 三条线连接,转弯二次,路径上所有图标为空。(三条线连接)
    5. 分别点击两个图标,并将对应的二维数据值置为0

实现过程中遇到的问题

  • 图片切割
    im = image.crop((left,top,right,bottom))
    image.crop参数为一个列表或元组,顺序为(left,top,right,bottom)
  • 找到游戏运行窗口
hdwd = win32gui.FindWindow(0,wdname)
# 设置为最前显示
win32gui.SetForegroundWindow(hdwd)

窗口不要点击最小化,点击后无法弹出来。

  • 图片缩放并转为灰度
    img1 = im1.resize((20, 20), Image.ANTIALIAS).convert('L')
    Image.ANTIALIAS 为抗锯齿的选项,图片无毛边。

  • 获取图片每个点的RGB值
    pi1 = list(img1.getdata())
    列表每个元素为一个三位数的值,分别代表该点的RGB值。列表pi1共400个元素。(因为图片为20*20)

  • 鼠标点击消除
    PyMouse.click()该方法默认双击,改为PyMouse.press()PyMouse.release()

  • 判断图片相似

    • 汉明距离,平均哈希
    def compare_img(self,im1,im2):
      img1 = im1.resize((20, 20), Image.ANTIALIAS).convert('L')
      img2 = im2.resize((20, 20), Image.ANTIALIAS).convert('L')
      pi1 = list(img1.getdata())
      pi2 = list(img2.getdata())
      avg1 = sum(pi1) / len(pi1)
      avg2 = sum(pi2) / len(pi2)
      hash1 = "".join(map(lambda p: "1" if p > avg1 else "0", pi1))
      hash2 = "".join(map(lambda p: "1" if p > avg2 else "0", pi2))
      match = 0
      for i in range(len(hash1)):
          if hash1[i] != hash2[i]:
              match += 1
      # match = sum(map(operator.ne, hash1, hash2))
      # match 值越小,相似度越高
      return match
    
    • 计算直方图
from PIL import Image

# 将图片转化为RGB
def make_regalur_image(img, size=(8, 8)):
    gray_image = img.resize(size).convert('RGB')
    return gray_image


# 计算直方图
def hist_similar(lh, rh):
    assert len(lh) == len(rh)
    hist = sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) for l, r in zip(lh, rh)) / len(lh)
    return hist


# 计算相似度
def calc_similar(li, ri):
    calc_sim = hist_similar(li.histogram(), ri.histogram())
    return calc_sim


if __name__ == '__main__':
    image1 = Image.open('1-10.jpg')
    image1 = make_regalur_image(image1)
    image2 = Image.open('2-11.jpg')
    image2 = make_regalur_image(image2)
    print("图片间的相似度为", calc_similar(image1, image2))
    # 值在[0,1]之间,数值越大,相似度越高
  • 图片余弦相似度
from PIL import Image
from numpy import average, dot, linalg


# 对图片进行统一化处理
def get_thum(image, size=(64, 64), greyscale=False)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值