基于文本内容自动旋转图像 - PHP / JS

时间:2015-05-21 16:37:03

标签: javascript php ocr imagick

我希望能够根据文本内容自动旋转图像,以便正确显示文本(垂直)。我更喜欢这种语言是Javascript或PHP。

错误示例

enter image description here

正确示例

enter image description here

例如,GIMP和PS在导入这样的图片时会这样做:

enter image description here

如何使用JS / PHP准确地自动旋转图像,以便正确显示文本(如果愿意,可以垂直显示)?

- 注 -

我不想根据" EXIF方向"进行轮播。数据,而是图像中文本的方向。显然,EXIF数据仅跟踪照片在地面上拍摄的方向。

3 个答案:

答案 0 :(得分:1)

我想到的一个可能的解决方案是使用OCR来检测图像中的字符并在所有4个方向上测试图像(除原始方向外还旋转90度3次)。无论哪个位置返回最高匹配字符,大多数可能是文本的正确方向。

可以使用以下PHP库:https://github.com/thiagoalessio/tesseract-ocr-for-php。与imagerotate()协调,可以根据OCR返回的字符数量找出图像的最佳方向。

理论上

require_once '/path/to/TesseractOCR/TesseractOCR.php';

$filename='path/to/some/image.jpg';
$photo = // create photo from $filename
$results = array();

for ($i=0; $i<4; $i++) {
    $new = imagerotate($photo, $i*90, 0);
    $new_path = // save the new rotated photo and get path
    $tesseract = new TesseractOCR($new_path);
    $results[$i] = strlen($tesseract->recognize());
}

/* Highest output is the best orientation for the image in respects to the text in it */
echo "Original Orientation: " . $results[0];
echo "Rotated 90 degrees: " . $results[1];
echo "Rotated 180 degrees: " . $results[2];
echo "Rotated 270 degrees: " . $results[3];

<强>赞成 - 利用现有的库(Tesseract with PHP wrapper,imagerotate php function)

<强>缺点 - 计算密集型。一张图像需要旋转3次&amp; OCR 4次

答案 1 :(得分:0)

您要求的解决方案与您的示例并不完全相同。起初我以为你想要一个检测文本的智能功能,但它比你的例子简单。

您需要查看EXIF数据。幸运的是,我多次这样做。要更正已旋转的图像,您可以使用以下功能,我用它来校正在平板电脑/手机上拍摄的图像,但将在计算机上显示。输入必须是JPG图像的文件名。

function fix_image($filename, $max_dimension = 0)
{

    $exif = exif_read_data($filename, 0, true);
    $o = $exif[IFD0][Orientation];

    // correct the image rotation
    $s = imagecreatefromjpeg($filename);
    if ($o == 1) { }
    if ($o == 3) { $s = imagerotate($s, 180, 0); }
    if ($o == 6) { $s = imagerotate($s, 270, 0); }
    if ($o == 8) { $s = imagerotate($s, 90, 0); }

    // export the image, rotated properly
    imagejpeg($s, $filename, 100);
    imagedestroy($s);


    if ($max_dimension > 0)
    {

     $i = getimagesize($filename);

     // reopen image for resizing
     // Use the known orientation to determine if it is portrait or landscape
     if ($i[0] > $i[1])
     {
      // landscape: make the width $max_dimension, adjust the height accordingly
      $new_width = $max_dimension;
      $new_height = $i[1] * ($max_dimension/$i[0]);
     } else {
      // portrait: make the height $max_dimension, adjust the width accordingly
      $new_height = $max_dimension;
      $new_width = $i[0] * ($max_dimension/$i[1]);
     }

     $s = imagecreatefromjpeg($filename);
     $n = imagecreatetruecolor($new_width, $new_height);
     imagecopyresampled($n, $s, 0, 0, 0, 0, $new_width, $new_height, $i[0], $i[1]);
     imagejpeg($n, $filename, 100);

     imagedestroy($n);
     imagedestroy($s);
    }
}

答案 2 :(得分:0)

如果exif旋转不可接受,您可能需要进行一些图像处理。这永远不会100%准确。我不确定karns提出的tessaract解决方案是否能够很好地工作,因为tessaract需要相当多的培训,而且你可能总是遇到没有经过培训的字体。此外,对how to detect orientation of a scanned document?的评论表明,tessarct会自动旋转图像以进行文本检测,因此您可能会在旋转的图像上获得类似的结果。

另一种方法是通过php包装器使用opencv,例如https://github.com/mgdm/OpenCV-for-PHP(我自己没有使用过包装器)。然后,您可以为示例图片执行线性直方图,查看word segmentation using opencv上接受的答案。这样,您可以确定图片是水平还是垂直方向。之后(并且在可能校正垂直方向的图片之后)您可以尝试确定文本是否颠倒,谷歌检测颠倒文本其中一个结果,例如,建议计算点数在一条线的上部和下部。同样,这永远不会100%准确。