我希望能够根据文本内容自动旋转图像,以便正确显示文本(垂直)。我更喜欢这种语言是Javascript或PHP。
错误示例
正确示例
例如,GIMP和PS在导入这样的图片时会这样做:
问
如何使用JS / PHP准确地自动旋转图像,以便正确显示文本(如果愿意,可以垂直显示)?
- 注 -
我不想根据" EXIF方向"进行轮播。数据,而是图像中文本的方向。显然,EXIF数据仅跟踪照片在地面上拍摄的方向。
答案 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%准确。