import numpy as npfrom PIL import Imageimport cv2# __all__ = []def ver_code_rect_split(rect, max_width=50):"""验证码中的矩形框切分:param rect: 矩形框(left, upper, width, height):param max_width: 当矩形框超过此值,则会被切分:return: list(rect)"""rect_num = rect[2] // max_widthif rect_num <= 1:return [rect]rect_lst = []rect_width = rect[2] // rect_numfor i in range(rect_num):rect_temp = list(rect)rect_temp[0] = rect_temp[0] + i * rect_widthrect_temp[2] = rect_widthrect_lst.append(tuple(rect_temp))return rect_lstdef ver_code_split(img, out_size=(32, 32), channel_first: bool = True, mode=None):if isinstance(img, str):img = Image.open(img)img_height = 132img_width = int(img.size[0] * (img_height / img.size[1]))# 先将图像数据放大,再做高斯滤波和中值滤波,最后二值化处理img = img.resize((img_width, img_height), resample=Image.BICUBIC).convert('RGB')img_pro = cv2.GaussianBlur(np.array(img.convert('L')), (3, 3), 0)img_pro = cv2.medianBlur(img_pro, 11)ret, img_pro = cv2.threshold(img_pro, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 先做边缘检测,再做轮廓检测(只需要外轮廓)img_pro = cv2.Canny(img_pro, 80, 200, L2gradient=True)cnts = cv2.findContours(img_pro.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]# 可过滤一些非常小的轮廓,轮廓小于50的过滤,!注意:这个参数应当随图像尺寸大小变化面变化cnts = [c for c in cnts if len(c) >= 50]rects = [cv2.boundingRect(cf) for cf in cnts] # 找出轮廓的外接矩形# 有的字母连接在一起,矩形会很宽,将其分割开来filter_rects = []for rt in rects:if rt[2] * rt[3] <= 1500: # 矩形面积小于1500的过滤掉continuefilter_rects.extend(ver_code_rect_split(rt)) # 将大的矩形框分割开# 将所有矩形内的字母提取出来letter_lst = []for x, y, w, h in sorted(filter_rects, key=lambda px: px[0]):img_temp = img.crop((x, y, x + w, y + h))if out_size is not None: # 更改尺寸img_temp = img_temp.resize(out_size)if mode == "L":img_array = np.array(img_temp.convert(mode))else:img_array = np.array(img_temp)if channel_first:img_array = img_array.transpose((2, 0, 1))letter_lst.append(img_array)return letter_lst
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。