极验3底图还原

底图地址

https://static.geetest.com/pictures/gt/cd0bbb6fe/bg/a1152167f.webp

原始代码

function $_BEB(t, e) {
	var $_DAHHD = mwbxQ.$_DW()[3][13];
	for (; $_DAHHD !== mwbxQ.$_DW()[9][11]; ) {
		switch ($_DAHHD) {
		case mwbxQ.$_DW()[6][13]:
			t = t[$_CJFt(52)],
			e = e[$_CJES(52)];
			var n = t[$_CJES(18)]
			  , r = t[$_CJFt(77)]
			  , i = h[$_CJES(50)]($_CJFt(16));
			i[$_CJES(18)] = n,
			i[$_CJES(77)] = r;
			var o = i[$_CJFt(55)]($_CJES(68));
			$_DAHHD = mwbxQ.$_DW()[6][12];
			break;
		case mwbxQ.$_DW()[9][12]:
			o[$_CJFt(64)](t, 0, 0);
			var s = e[$_CJES(55)]($_CJFt(68));
			e[$_CJFt(77)] = r,
			e[$_CJFt(18)] = 260;
			for (var a = r / 2, _ = 0; _ < 52; _ += 1) {
				var c = Ut[_] % 26 * 12 + 1
				  , u = 25 < Ut[_] ? a : 0
				  , l = o[$_CJES(34)](c, u, 10, a);
				s[$_CJFt(49)](l, _ % 26 * 10, 25 < _ ? a : 0);
			}
			$_DAHHD = mwbxQ.$_DW()[0][11];
			break;
		}
	}
}
### 精简代码

```javascript
Ut=[39,38,48,49,41,40,46,47,35,34,50,51,33,32,28,29,27,26,36,37,31,30,44,45,43,42,12,13,23,22,14,15,21,20,8,9,25,24,6,7,3,2,0,1,11,10,4,5,19,18,16,17]
t = t[$_CJFt(52)], //原始图像
e = e[$_CJES(52)]; //放在画布中的缩放图像
var n = t["width"]//312
  , r = t["height"]//160
  , i = h["createElement"]("canvas");//创建 Canvas 对象
i["width"] = n,//312
i["height"] = r;//160
var o = i["getContext"]("2d");

o["drawImage"](t, 0, 0);//向画布上绘制图像   参数1:规定要使用的图像 参数2:开始剪切的 x 坐标位置。参数3:开始剪切的 y 坐标位置。
var s = e["getContext"]("2d");
e["height"] = r,
e["width"] = 260;
for (var a = r / 2, _ = 0; _ < 52; _ += 1) {
	var c = Ut[_] % 26 * 12 + 1 //%26可以判断上下,然后*12+1计算出x轴坐标
	  , u = 25 < Ut[_] ? a : 0 //如果比25要大,y轴坐标就80,下半部分,0就是上半部分
	  , l = o["getImageData"](c, u, 10, a); //返回ImageData对象,该对象为画布上指定的矩形复制像素数据。参数1:开始复制的左上角位置的x坐标 参数2:开始复制的左上角位置的 y 坐标 参数3:要复制的矩形区域的宽度。参数4:要复制的矩形区域的高度。
	s["putImageData"](l, _ % 26 * 10, 25 < _ ? a : 0);//把图像数据放回画布上 imgData	参数1:规定要放回画布的 ImageData 对象。参数2:ImageData 对象左上角的 x 坐标,以像素计。参数3:ImageData 对象左上角的 y 坐标,以像素计。
}

还原py代码

from PIL import  Image
import  cv2
import  numpy as np
from  pathlib import Path

def Bg_Reduction(bg_path):
    image=Image.open(bg_path)
    New_Image=Image.new('RGBA',(260,160))
    Ut=[39,38,48,49,41,40,46,47,35,34,50,51,33,32,28,29,27,26,36,37,31,30,44,45,43,42,12,13,23,22,14,15,21,20,8,9,25,24,6,7,3,2,0,1,11,10,4,5,19,18,16,17]
    for index in range(52):
        c = Ut[index] % 26 * 12 + 1
        u = 80 if Ut[index] > 25 else 0
        l=image.crop(box=(c, u, c+10, u+80))
        New_Image.paste(l,( index% 26 * 10, 80 if 25 < index else 0))
    with open('new_bg.png','wb') as f:
        New_Image.save(f,'png')
def bytes_to_cv2(img):
    """
    二进制图片转cv2
    :param img: 二进制图片数据, <type 'bytes'>
    :return: cv2图像, <type 'numpy.ndarray'>
    """
    # 将图片字节码bytes, 转换成一维的numpy数组到缓存中
    img_buffer_np = np.frombuffer(img, dtype=np.uint8)
    # 从指定的内存缓存中读取一维numpy数据, 并把数据转换(解码)成图像矩阵格式
    img_np = cv2.imdecode(img_buffer_np, 1)
    return img_np


def cv2_open(img, flag=None):
    """
    统一输出图片格式为cv2图像, <type 'numpy.ndarray'>
    :param img: <type 'bytes'/'numpy.ndarray'/'str'/'Path'/'PIL.JpegImagePlugin.JpegImageFile'>
    :param flag: 颜色空间转换类型, default: None
        eg: cv2.COLOR_BGR2GRAY(灰度图)
    :return: cv2图像, <numpy.ndarray>
    """
    if isinstance(img, bytes):
        img = bytes_to_cv2(img)
    elif isinstance(img, (str, Path)):
        img = cv2.imread(str(img))
    elif isinstance(img, np.ndarray):
        img = img
    elif isinstance(img, Image):
        img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
    else:
        raise ValueError(f'输入的图片类型无法解析: {type(img)}')
    if flag is not None:
        img = cv2.cvtColor(img, flag)
    return img


def get_distance(bg, tp):
    """
    :param bg: 背景图路径或Path对象或图片二进制
    :param tp: 缺口图路径或Path对象或图片二进制
    :return: 缺口位置
    """
    # 读取图片
    bg_gray = cv2_open(bg)
    tp_gray = cv2_open(tp, flag=cv2.COLOR_BGR2GRAY)
    # 转换图片大小,网页上面是的参数跟返回的参数是不一样的
    bg_gray = cv2.resize(bg_gray, dsize=(260, 160))
    tp_gray = cv2.resize(tp_gray, dsize=(55, 54))
    # 边缘检测
    tp_gray = cv2.Canny(tp_gray, 255, 255)
    bg_gray = cv2.Canny(bg_gray, 255, 255)
    # 目标匹配
    result = cv2.matchTemplate(bg_gray, tp_gray, cv2.TM_CCOEFF_NORMED)
    # 解析匹配结果
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    distance = max_loc[0]

    return distance

Bg_Reduction('bg.png')
print(get_distance('new_bg.png', 'tp.png'))
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python可以使用第三方库Pillow来还原片。Pillow是一个Python像处理库,它提供了许多函数和方法来处理像。要还原片,可以按照以下步骤进行操作: 1. 导入Pillow库:首先,我们需要在Python脚本中导入Pillow库。可以使用以下代码将其导入: ```python from PIL import Image ``` 2. 打开片:使用Pillow库中的open函数来打开要处理的片文件。例如,可以使用以下代码来打开一张片: ```python image = Image.open('image.jpg') ``` 3. 还原片:利用Pillow库的函数和方法,可以对打开的片进行还原处理。具体的还原方法取决于片的损坏情况和需要还原的内容。例如,可以使用Pillow库的修复函数来修复损坏的片: ```python repaired_image = image.repair() ``` 4. 片:还原后的片可以与原始片进行比较,以还原的效果。可以使用Pillow库的compare函数来比较两张片的差异。例如,可以使用以下代码来比较两张片的差别: ```python diff = ImageChops.difference(original_image, repaired_image) ``` 如果差异很小,说明还原的效果较好;如果差异较大,说明还原的效果不理想。 5. 保存片:最后,可以使用Pillow库的save函数将还原后的片保存到新的文件中。例如,可以使用以下代码将还原后的片保存为新的文件: ```python repaired_image.save('repaired_image.jpg') ``` 综上所述,可以使用Python和Pillow库来还原片。根据片的损坏情况和需要还原的内容,可以调用Pillow库中的函数和方法进行相应的处理,然后将还原后的片与原始片进行比较以还原效果的好坏。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值