python 基于计算机视觉的图像验证码处理

tv6aics1  于 2023-08-02  发布在  Python
关注(0)|答案(2)|浏览(91)

我想在“大图像”中定位“小图像”中对象的坐标。如果你有什么想法,请告诉我。
我试过feature matching,但成功率很低。


的数据






v1l68za4

v1l68za41#

看起来,对于您的情况,您可以简单地旋转小图片N次,并为每个旋转的小图片应用模板匹配。
同时对图像进行了中值滤波以降低噪声
范例:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img_small = cv.imread('small.png', cv.IMREAD_COLOR)
img_big = cv.imread('big.png', cv.IMREAD_COLOR)

img_small = cv.cvtColor(img_small, cv.COLOR_BGR2RGB)
img_big = cv.cvtColor(img_big, cv.COLOR_BGR2RGB)

img_big = cv.medianBlur(img_big, 3)

rows,cols = img_small.shape[:2]

img_small_rotated = list()

n = 20

for i in range(0,n):
    M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),360*(i/n),1)
    img_small_rot = cv.warpAffine(img_small,M,img_small.shape[:2],borderValue = (255,255,255))
    img_small_rot = cv.medianBlur(img_small_rot, 3)
    img_small_rotated.append(img_small_rot)

im_show_all_templates = np.concatenate(img_small_rotated, axis=1)

plt.imshow(im_show_all_templates)
plt.show()

max_loc_global = None
max_val_global = 0

for i in img_small_rotated:
    res = cv.matchTemplate(img_big,i,cv.TM_CCOEFF_NORMED)
    
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    if max_val > max_val_global:
        max_val_global = max_val
        max_loc_global = max_loc

print(max_val_global, max_loc_global)

top_left = max_loc_global
bottom_right = (top_left[0] + cols, top_left[1] + rows)

cv.rectangle(img_big,top_left, bottom_right, 0, 2)

plt.imshow(img_big)
plt.show()

字符串
结果:


的数据
您可以使用类似的技术以其他方式(缩放、过滤、旋转)扩展模板匹配空间,但对于您的应用程序来说,旋转似乎就足够了。

00jrzges

00jrzges2#

如果布局总是相同的,您可以尝试简单地将6个图标中的每个图标的颜色直方图与您正在寻找的图标进行比较。所以你裁剪出图标并计算每个图标的直方图。然后计算SMALL IMAGE和裁剪图标直方图之间的距离并取最小值。
这种方法的问题是,您需要能够确定图标的布局,但是如果您能够做到这一点,那么这种解决方案应该可以工作,因为没有太多的遮挡或颜色变化。其优点是直方图是旋转不变的,因此比使用模板匹配的处理更少。还要考虑在比较之前对直方图进行归一化和图像预处理。

相关问题