验证码识别-滑动验证码识别(一)滑块位置识别

滑块验证码原图




对图片预处理(二值化)




识别矩形黑块

以下是php代码实现方法

/**
 * 找到二值化后的,拖拽图形验证码矩形位置,返回滑块位置,右下角坐标
 * 
 *
 * @param $imagePath
 * @param $bWidth 滑块宽
 * @param $bHeight 滑块高
 * @return [x,y]
 */
function findRectCoordinate($imagePath,$bWidth = 85,$bHeight = 85){
    // 如果需要获取所有像素值,可以使用imagecreatefromjpeg创建图片资源,然后遍历像素
    $image = imagecreatefromjpeg($imagePath);
    // 这里假设是JPEG图片,对于其他格式图片,需要使用相应的imagecreatefrom*函数

    // 获取图片宽度和高度
    $width = imagesx($image);
    $height = imagesy($image);

    $rgbMap = [];
    for($y = 0; $y < $height; $y++){
        $rgbMap[$y] = array_fill(0,$width,0);
    }

    // 遍历图片的每个像素
    for ($y = 0; $y < $height; $y++) {
        for ($x = 0; $x < $width; $x++) {
            // 获取像素值
            $rgb = imagecolorat($image, $x, $y);
            // 每个像素点,黑色标记为1
            $rgbMap[$y][$x] = ($rgb > 0 ) ? 0 : 1;
        }
    }
    imagedestroy($image);

    // 查找图片内,矩形大小,最黑的区域。
    // 时间复杂度N
    for ($y = 0; $y < $height; $y++) {
        $rgbMap[$y][0] = $y >= $bHeight ? ($rgbMap[$y][0] + $rgbMap[$y-1][0] - $rgbMap[$y-$bHeight][0]) : ($rgbMap[$y][0] + $rgbMap[$y-1][0]);
    }

    for ($x = 0; $x < $width; $x++) {
        $rgbMap[0][$x] = $x >= $bWidth ? ($rgbMap[0][$x] + $rgbMap[0][$x-1] - $rgbMap[0][$y-$bWidth]) : ($rgbMap[0][$x] + $rgbMap[0][$x-1]);
    }

    $max = 0;
    $maxX = 0;
    $maxY = 0;
    for ($y = 1; $y < $height; $y++) {
        $lineSum = 0;
        for ($x = 1; $x < $width; $x++) {
            $lineSum += $rgbMap[$y][$x];
            $rgbMap[$y][$x] = $rgbMap[$y-1][$x] + $lineSum;

            if($y >= $bHeight && $x >= $bWidth){
                $sum = $rgbMap[$y][$x];

                if($y >= $bHeight){
                    $sum -= $rgbMap[$y-$bHeight][$x];
                }
                if($x >= $bWidth){
                    $sum -= $rgbMap[$y][$x - $bWidth];
                }

                $sum += $rgbMap[$y-$bHeight][$x-$bWidth];

                if($sum > $max){
                    $max = $sum;
                    $maxX = $x;
                    $maxY = $y;
                }
            }
        }
    }

    return [$maxX,$maxY];
}

list($x,$y) = findRectCoordinate("some.png");
  • 同时结合第二章的背景碰撞,可以得到更好的结果