Python 打造微信小程序-加减大师辅助程序

写在前面:

      主要运用python进行简单的图像处理,不得不说python用起来是真的爽,各种库的学习使得开发变得越来越简单...


     其实玩过这个小程序的应该知道实现起来也不是很难,很适合新手练手。第一次到了500多题不知道是因为被检测了还是网掉了分数没提交。。。结果以后到200分就手动停了,发现提交是正常的......

   话不多说先上效果:(gif太麻烦了将就着看吧......)



首先说一下思路:

       1.运用投屏软件将手机屏幕投屏到电脑。(实际上也可以运用adb截图再处理,但是adb太慢到200题后速度会变得相对很快,所以运用投屏,我这里用的是:vysor,自行下载安装就好了)

       2.图片处理。截图+识别(图像处理这里用的是PIL库,运用感知哈希算法、汉明距离进行图片匹配)

       3.得到结果并点击。


**-***---**-**-*-**-*-*乱而华丽的分割线*--*--**-*--*--*****--*-

那就开始我们的代码吧:

       1. 首先安装PIL库:https://www.cnblogs.com/mrgavin/p/8177841.html

        ok很快!我们安装好了PIL。

        我这这里主要用了其中的Image:

from PIL import Image

       官方文档:http://effbot.org/imagingbook/image.htm

       这里有个中文的自己写的:https://blog.csdn.net/icamera0/article/details/50706615(感谢大佬)

        2.图片处理,我们需要得到图片的哈希值(dHash值),并运用汉明距离在我们自己做的列表中匹配最接近的。

截图:
from PIL import ImageGrab
img = ImageGrab.grab((left,top, right, bottom))#截屏幕

        介绍一下我们这里用的感知哈希算法

                一张图片有很多个像素点构成,每个像素点都是一个rgb,例如:


                是一个440*300的图片,其中的像素点达到了13万...都计算的话显然有点吃力,所以我们缩小他的大小,把它缩小到15*20(当然你可以缩到其他的数字...主要是让他足够小并能比较准确的被识别)。然后的得到他的rgb,当然这里我们可以先对其进行二值化,然后在得到他的黑白图片,这样我们可以直接得到它的一个有 1,0组成的数组。那这个数组对于这个图片来说就是他的dHash。

                 这里又有一个问题就是每个图片都是不同的,不过这似乎很简单就可以解决,我们可以裁剪出其中每个数字并将其dHash然后对我们预先处理(首先得到一遍1-9以及'-','+',='的dHash存储数组)的dHash值进行比较就可以了。

         再来介绍一下我们的汉明距离

                实际上很简单,对象a变成对象b需要改变几个元素,例如:字符串"1235"变成"1257"需要改变的是2,2就是它们的汉明距离。我们可以运用其匹配两个dHash,一般两个相同数字图片的汉明距离在5以内。


        开始我们的主要函数:

 
 
img = Image.open(path)  # 打开一张图片
img = img.convert('L')  # 灰度转化
re_img = img.point(table, mode)  # table可以为数组 在将灰度图像转换为位图图像(模式”1“)时,所有非零值都设置为255(白色)
newimg = img.crop(left, up, right, bottom)  # 裁剪
small_img = re_img.resize((width, height), mode)  # 缩小图片这里用 mode=Image.LANCZOS
        我们可以运用上面的某些函数将普通的img,转换为黑白图片。当然这里point中的table可能有点问题,我们直接上代码:

table = []
for i in range(256):
    if i > threshold:
        table.append(0)
    else:
        table.append(1)
bin_img = img.point(table, '1')

        

        然后我们要对其进行裁剪,分为两部分:横向,纵向。我们不难看出上面图片中每个数字之间是背景色的,转为黑白图片后就是白色的。

        我们调用:

import numpy
num_img = numpy.array(re_img)#将其转换为二维数组形式,其黑为1,白为0。

当然这还不足以让方便我们识别我们该剪切那一部分,我们需要将其每一列每一行求和分别得到两个一维数组。

list(numpy.sum(numpy.array(img) == 0, axis=1)) #axis为0为列求和,1为行求和 返回一维数组。(我也不太确定到底是0,1对应的是谁)

得到了他们求和的数组之后我们判断一下那一块是大于零的并用crop裁减出来就可以了。


别忘记将其缩小!别忘记将其缩小!别忘记将其缩小!


横竖裁剪完成后我们的到了每一个数字的缩小版,下面我们就要对其进汉明距离的匹配了。这里也很简单我们只要判断一下两个的dHash有哪些不同就好了,这里的dHash很明显就是我们转换每个缩小版数字的数组。找出最小的汉明距离然后返回它对应的值(这个应该是你已经初始化完成的,我们先找几个样例然后得到其dHash,手动输入他对应的数字是多少并储存)。

#如果有问题可以去下面代码借鉴一下。

运算:

       上面我们终于就完成了,下面的是运算,这个其实对于学过算法的其实不难,但是python好就好在给你提供了你意想不到的库。比如说得到字符串中运算结果,例如

eval("2+5")==7

我们可以直接调用eval运算出结果并于结果对比。


3.点击:

        点击还是比较容易实现的,python库如此强大!

import win32api, win32gui, win32con
win32gui.GetCursorPos()#得到鼠标位置
win32api.SetCursorPos(x, y)#改变鼠标位置到x,y
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP, 0, 0)#点击。0,0为偏移量具体百度


------------------------------------------不乱但是不华丽的分割线-------------------------------------------------

注意点:我们还需要初始化获取'44'这两个数字的dHash,因为44之间是连着的所以不会被我们程序分开然后就会得到错误结果。算是个坑点吧。

这一只有图像处理与匹配的函数,具体的其他的还是蛮简单的。

项目自取:https://github.com/goodtimep/python

猜你喜欢

转载自blog.csdn.net/SuanLiao/article/details/80484405