52hypocrite 发表于 2024-3-21 22:38

某验4文字点选代图片处理33333

本帖最后由 52hypocrite 于 2024-3-22 00:04 编辑

站点:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
我们可以看到三代的图片,他自带点选的顺序文字--燕禾金
https://attach.52pojie.cn//forum/202403/21/224015ubmoa88cz8ffc1id.png?l
再看看4代文字点选,可以看到是没有自带文字点选顺序的,逆向的朋友都知道他是站点自己会返回顺序字体的
https://attach.52pojie.cn//forum/202403/21/233733eh3g2a8ni9fi9fp8.png?l
这里就可以看到站点返回的顺序图片,像看详细点的可以去原站点看看
https://attach.52pojie.cn//forum/202403/21/234024i57fhhshwcfppsz7.png?l
实现的最终结果看下面这张图
image.png
看着和三代的差不多对吧,那么我们在识别的时候或者打码平台识别的时候,会不会通过率会比没有处理过的高一点呢
下面是我的思路
1,我们可以按照顺序得到他需要点选的文字,但是得到了之后我们会发现他是一个透明的图片,
将图片放到桌面上之后就可以看到是透明的,就很神奇对吧,使用ddddocr识别不了
https://attach.52pojie.cn//forum/202403/21/234612na4yeyxim8y88a3m.png?l
这是我放在pycharm里面的效果,当然了他看着不是透明的,需要看看是怎么个事,可以去原站点瞧瞧:Dweeqw
那么不难发现他是透明的,字体颜色是黑色的,那么我们需要怎么处理给他可以弄到可识别呢?直接给他一个反转处理
将图片背景改为不透明,他字体不是黑色的嘛,将背景改为白色,神奇地方就来了,可识别。(为啥就变得可识别我就不知道了)
https://attach.52pojie.cn//forum/202403/21/235021qvr8tdvlm8873mzl.png?l
2,我们不是可以拿到顺序文字的几张图片嘛,都这么处理之后图片以他识别出来的文字命名,或者直接按照123顺序拼接,之后再识别
https://attach.52pojie.cn//forum/202403/21/235351g77upv9vp7h29hhz.png?l
3,新建一张图片,宽不变,比原来的底图高20像素
4,之后将底图copy到新建的图片里面,再将拼接或者识别的文字添加到高出底图的位置就行
https://attach.52pojie.cn//forum/202403/21/235613fo1y80yxuym36yx9.png?l
最后补充:
对于第二步:这里将拼接的图片放到底部之后会出现超出来,那么就修改新建图片的大小,那么就修改新建拖得大小就行了,只不过不美观
第一次发帖排版望理解,最后就是为啥我保存了之后会变为空白啊,编辑了好几次{:1_889:}
有啥简便的方法可以讨论,我这并不是唯一方法。当然了最后就是代码
import pytesseract
from PIL import Image
import ddddocr


def demo(img_path: str):
    """
    OCR库识别图片
    :param img_path:
    :return:
    """
    image = Image.open(img_path)
    # 使用pytesseract调用image_to_string方法进行识别,传入要识别的图片,lang='chi_sim'是设置为中文识别,
    text = pytesseract.image_to_string(image, lang='chi_sim')
    name = ''
    for i in text.split(' '):
      if '\n\x0c' in i:
            i.replace('\n\x0c', '')
            name += i
            continue
      name += i
    return name


def xxx(tt: list, new_path: str):
    """
    需要去修改新图片大小,和小图片大小 (未完善)
    将图片copy 到另一个图片里面,按照坐标来copy:
    tt = [, , ]
    tt = [, , ]
    img_path = 'text_2.png'
    :param tt:
    :parame new_path: 新图片名字
    :return:
    """
    # 把所有小图片加载进列表
    images = []
    x = 0
    y = 0
    for i in tt:
      x = i
      y = i
      x_x = x * 64
      x_y = y * 65
      # img_name = './img/' + i[-1] + '.png'
      # img_name = i[-1] + '.png'
      img_name = i[-1]
      img = Image.open(img_name)
      images.append()
    print(tt)
    # 创建一个空的大图像
    large_image_width = 192
    large_image_height = 65

    large_image = Image.new('RGBA', (large_image_width, large_image_height), (255, 255, 255, 255))
    # large_image = Image.open('image.png')

    # 定义小图像素大小和数量
    small_image_width = 64
    small_image_height = 65

    # 定义每张小图的坐标,并粘贴到大图上
    for coordinates in images:
      x1, y1 = coordinates, coordinates
      img = coordinates
      x2, y2 = x1 + small_image_width, y1 + small_image_height
      large_image.paste(img, (x1, y1, x2,y2))
      # 把生成的大图保存到磁盘
      large_image.save(new_path)
    print('将图片copy到一个图片中,完成')


def xxx_list(img_path: list, new_path: list):
    """
    这里是把透明图片改为不透明 以列表方式传进来批量处理
    需要传入列表,保存的名字,也是列表
    :param img_path: 需要修改透明背景的图片 -- 列表方式
    :param new_path: 保存修改之后的图片-- 列表方式
    :return:
    """
    """ 这里只是处理完成,并没有返回图片名字"""
    # 打开RGBA图像
    # for img_name, new_name in zip(img_path, new_path):
    #   image = Image.open(img_name)
    #   # 创建一个新的PNG图像,背景为白色,大小与原始图像相同
    #   background = Image.new('RGB', image.size, (255, 255, 255))
    #   # 合并两个图像,将不透明度应用于原始图像
    #   background.paste(image, mask=image.split())
    #   background.save(new_name)
    #   print(f'{img_name} 图片处理之后为: {new_name}')

    """这里是处理完成之后返回图片名字"""
    new_img_name = []
    for i in range(len(img_path)):
      image = Image.open(img_path)
      # 创建一个新的PNG图像,背景为白色,大小与原始图像相同
      background = Image.new('RGB', image.size, (255, 255, 255))
      # 合并两个图像,将不透明度应用于原始图像
      background.paste(image, mask=image.split())
      background.save(new_path)
      new_img_name.append(])
      print(f'{img_path} 图片处理之后为: {new_path}')
    return new_img_name


def xxx_(img_path: str, new_path: str):
    """
    这里是把透明图片改为不透明 以列表方式传进来单个处理
    需要传入列表,保存的名字,也是列表
    :param img_path: 需要修改透明背景的图片
    :param new_path: 保存修改之后的图片
    :return:
    """
    image = Image.open(img_path)
    # 创建一个新的PNG图像,背景为白色,大小与原始图像相同
    background = Image.new('RGB', image.size, (255, 255, 255))
    # 合并两个图像,将不透明度应用于原始图像
    background.paste(image, mask=image.split())
    background.save(new_path)
    print(f'处理完成 - 处理的图片{img_path} - 新图片{new_path}')


def dddd_ocr(img_path: str):
    """
    用于识别图片文字
    :param img_path:
    :return:
    """
    ocr = ddddocr.DdddOcr()
    inage_content = Image.open(img_path)
    dc_zb = ocr.classification(inage_content)
    return dc_zb


if __name__ == '__main__':
    # 加载字体
    font_path = "C:\\Users\\user\\Desktop\\新建文件夹\\Noto_Sans_SC\\NotoSansSC-Thin.otf"
    # orc库识别汉字
    # text = demo(img_path='img_1.png')
    # print(text)

    """将小图片通过坐标方式copy 到大图片里面"""
    # tt = [, , ]
    tt = [, , ]
    xxx(tt=tt, new_path='text_2.png')
    xxx_(img_path='1.png', new_path='1_1.png')

    """ 通过图片识别重命名图片"""
    # name = 'shunxu_img/1685079490先选顺序.png'
    # dc_zb = dddd_ocr('shunxu_img/1685079490先选顺序.png')
    # im = Image.open(name)
    # im.save(f'shunxu_img/{dc_zb}.png')


这个是处理的图片代码,有啥缺的告诉我,我贴出来。
转发的话,添加一个文章来源就行。
文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

52hypocrite 发表于 2024-3-22 00:05

这个需要有一个文字库,因为使用到了,自己系统自带或者下载一个都可

watfe 发表于 2024-3-22 09:05

昨天刚好也用到了ddddocr,识别4位数字带直线干扰的验证码。目前的话(截至2024-03-22)ddddocr暂不支持python3.12,想要使用测试的请确保python≤3.11。
页: [1]
查看完整版本: 某验4文字点选代图片处理33333