滑块验证码原图
对图片预处理(二值化)
识别矩形黑块
以下是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");
- 同时结合第二章的背景碰撞,可以得到更好的结果