在Captcha图像中分割字母

时间:2015-10-23 03:52:03

标签: python image-processing captcha image-segmentation scikit-image

我已经用Python编写了这个算法,用于使用scikit-image读取CAPTCHAs:

from skimage.color import rgb2gray
from skimage import io

def process(self, image):
    """
    Processes a CAPTCHA by removing noise

    Args:
        image (str): The file path of the image to process
    """

    input = io.imread(image)
    histogram = {}

    for x in range(input.shape[0]):
        for y in range(input.shape[1]):
            pixel = input[x, y]
            hex = '%02x%02x%02x' % (pixel[0], pixel[1], pixel[2])

            if hex in histogram:
                histogram[hex] += 1
            else:
                histogram[hex] = 1

    histogram = sorted(histogram, key = histogram.get, reverse=True)
    threshold = len(histogram) * 0.015

    for x in range(input.shape[0]):
        for y in range(input.shape[1]):
            pixel = input[x, y]
            hex = '%02x%02x%02x' % (pixel[0], pixel[1], pixel[2])
            index = histogram.index(hex)

            if index < 3 or index > threshold:
                input[x, y] = [255, 255, 255, 255]

    input = rgb2gray(~input)
    io.imsave(image, input)

之前:

Before

后:

After

它运作得相当好,我通过谷歌的Tesseract OCR运行得到了不错的结果,但我想让它变得更好。我认为矫正字母会产生更好的结果。我的问题是我该怎么做?

我知道我需要以某种方式包装这些字母,如下:

Boxed

然后,对于每个角色,根据垂直或水平线旋转几度。

我最初的想法是识别角色的中心(可能通过在直方图中找到最常用颜色的群集),然后展开一个框直到它发现黑色,但同样,我不太确定如何去做那件事。

图像分割中使用哪些常见做法来实现此结果?

修改

最后,进一步细化滤色片并将Tesseract限制为只有字符,产生了近100%的准确结果,没有任何偏斜。

1 个答案:

答案 0 :(得分:1)

你想要做的操作在技术上是计算机视觉,称为对象的纠偏,为此你必须在对象上应用几何变换,我有一段代码要对对象应用偏斜(二进制)。这是代码(使用opencv库):

def deskew(image, width):
    (h, w) = image.shape[:2]
    moments = cv2.moments(image)
    skew = moments["mu11"] / moments["mu02"]
    M = np.float32([[1, skew, -0.5 * w * skew],[0, 1, 0]])
    image = cv2.warpAffine(image, M, (w, h), flags = cv2.WARP_INVERSE_MAP | cv2.INTER_LINEAR) 
    return image