• 【python】python制作 连连看 游戏脚本(四)


    【python】python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客

    【python】python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSDN博客

    【python】python制作 连连看 游戏脚本(三)_sunriver2000的博客-CSDN博客

    ​​​​​【python】python制作 连连看 游戏脚本(四)_sunriver2000的博客-CSDN博客

    代码下载:GitHub - sunriver2000/LinkGameAss

    问题

    1、如何提高图标对比识别率?

    思路

    1、截取图标时不保留外围的正方形黑框,上下左右都少截取2个像素,如下图。

    2、增加数值分析函数。

    关键步骤

    1、调整图标截取区域。

    1. # 分割图标
    2. def screenshot(self):
    3. image = ImageGrab.grab((self.x0, self.y0, self.x1, self.y1))
    4. save_im(image, 'image')
    5. image_list = {}
    6. offset = self.im_width
    7. for x in range(8):
    8. image_list[x] = {}
    9. for y in range(12):
    10. top = round(x * offset) + 2
    11. left = round(y * offset) + 2
    12. bottom = round((x + 1) * offset) - 2
    13. right = round((y + 1) * offset) - 2
    14. im = image.crop((left, top, right, bottom))
    15. image_list[x][y] = im
    16. return image_list

    2、增加分析函数,用于分析二值化后图像对比效果。

    1. # 分析图像识别算法
    2. def analysis(self, image_list):
    3. f = open('log.txt','w')
    4. for z in range(len(self.im_type_list)):
    5. for i in range(len(image_list)):
    6. for j in range(len(image_list[0])):
    7. if self.im2num_arr[i+1][j+1] == z + 1:
    8. self.isMatch(self.im_type_list[z], image_list[i][j])
    9. f.write(str(self.result).zfill(3) + ' ' + str(self.hash2) + '\n')
    10. f.write('\n')
    11. f.close()

     图标识别函数做了稍许改动,主要是把变量改为全局的,方便后续保存数据。

    1. # 汉明距离判断两个图标是否一样
    2. def isMatch(self, im1, im2):
    3. # 缩小图标,转成灰度
    4. image1 = im1.resize((20, 20), Image.ANTIALIAS).convert("L")
    5. image2 = im2.resize((20, 20), Image.ANTIALIAS).convert("L")
    6. # 降灰度图标转成01串,即二进制数据
    7. pixels1 = list(image1.getdata())
    8. pixels2 = list(image2.getdata())
    9. avg1 = sum(pixels1) / len(pixels1)
    10. avg2 = sum(pixels2) / len(pixels2)
    11. self.hash1 = "".join(map(lambda p: "1" if p > avg1 else "0", pixels1))
    12. self.hash2 = "".join(map(lambda p: "1" if p > avg2 else "0", pixels2))
    13. # 统计两个01串不同数据的个数
    14. match = sum(map(operator.ne, self.hash1, self.hash2))
    15. self.result = match
    16. # 阀值设为10
    17. return match < 40

    分析结果,保存至log.txt中。下面是同一种图标的6个二值化样本。

    1. 000 0111111111111111111101111111001111111111011111000000111111110111000000000111111101100000000000111111010000010000100011110111001000110100111101110101110010001111011101111000000001110111011110100010011101110111100000000111011100111000000011110111100110000000111101111001110001001111011110000100111011110111110000000000011101111110000000111111011111111111111111110111111111111111111100000000000000000000
    2. 022 0111111111111111111001111110001111111111011111000000111111110111000000000111111101000000000000011111010000010000100111110111001101110100111101110101110110001111011101111000000011110111011110010010111101110111100100001111011100111001000011110111100110000001111101111001100001001111011110001100011011110111110000000000111101111111000001111111011111111111111111110111111111111111111100000000000000000000
    3. 021 0111111111111111111101111110001111111111011111000000111111110111000000000011111101000000000000011111010000010000100111110111001001110100111101110101110110001111011101111000000011110111011110010010111101110111100100001111011100111001000011110111100110000001111101111001110001001111011111000100001011110111110000000000111101111111000001111111011111111111111111110111111111111111111100000000000000000000
    4. 011 0111111111111111111101111111001111111111011110000000111111110111000000000111111101100000000000111111010000010000100011110111001000100100111101110101110110001111011101111000000011110111011110100010111101110111100100001111011100111001000011110111100110000000111101111001100001001111011110000100011011110111110000000000111101111110000000111111011111111111111111110111111111111111111100000000000000000000
    5. 035 0000000011000000000001111111111111111111011111000000111111110111000000000111111101000000000000111111010000010000100011110111001100100000111101110101110110001111011101111000100011110111011110100010111101110111100100001111011100111001000011110111100110000000111101111001100001001111011110000100001011110111110000000000111101111111000000111111011111111111111111110111111111111111111100000000000000000000
    6. 023 0111111111111111111101111110001111111111011110000000111111110111000000000111111101000000000000011111010000110000100111110111001001100100111101110101110110001111011001111000000011110110011110100000111101110111100100001111011100111001000011110111100110000001111101111001100001011111011110000100011011110111110000000000111101111111000000111111011111111111111111110111111111111111111100000000000000000000

  • 相关阅读:
    《HTML+CSS+JavaScript》之第1章 HTML简介
    .NET中使用BootstrapBlazor组件库Table实操篇
    JavaScript 56 JavaScript 调试
    csp202206
    力扣L9--- 12. 整数转罗马数字--2024年3月12日
    探讨C#、C++和Java这三门语言在嵌入式的地位
    五个元素的整形数组
    with 语句包含递归 sql 改写
    OpenHarmony实战开发-文件上传下载性能提升指导。
    顶礼膜拜!阿里内部出品,全网首发 Spring Security 项目实战搭建
  • 原文地址:https://blog.csdn.net/sunriver2000/article/details/126614538