私は毎週のメニューpdfを取り、それをグリッドボックスに分割してトリミングし、後で OCR をそれぞれTesseractOCRで作成しようとしました。
ここで役立つかもしれないlineJunctionsを見たことがありますが、imagemagick php ドキュメントでそれらを見つけることができませんでした。同様のstackoverflow questionでHough Linesも見ましたが、phpドキュメントでそれらを見つけることができませんでした。
//read the image
$im = new Imagick();
$im->readimage('menu.png');
//resize and contrast
$im->resizeImage($im->getImageWidth()/6, $im->getImageHeight()/6 , 9, 1);
$im->thresholdImage( 0.65 * Imagick::getQuantum() );;
//remove "noise"
//this is done by creating two new images where only horizontal lines, then vertical are preserved using morphology and then combined into one
$horizontalLines = clone $im;
$verticalLines = clone $im;
$horizontalLineKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_RECTANGLE, "19x1");
$horizontalLines->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $horizontalLineKernel);
$verticalLineKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_RECTANGLE, "1x15");
$verticalLines->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $verticalLineKernel);
$horizontalLines->compositeimage($verticalLines, 5, 0, 0);
$im = clone $horizontal;
$horizontalLines->clear();
$horizontalLines->destroy();
$verticalLines->clear();
$verticalLines->destroy();
// Create boxes at corners
// These are at points from which I intent to create the individual grid boxes
$plusKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_PLUS, "4");
$im->morphology(\Imagick::MORPHOLOGY_OPEN, 1, $plusKernel);
$squareKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_SQUARE, "2");
$im->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $squareKernel);
これを行うと、ax、y、width、height を取得できれば、座標を取得できるはずのボックスを含む画像になりますが、右下隅が欠けており、非常に面倒です。より良いアプローチが必要だと確信しています。
画像は縮小されており、次に見られるように座標を 6 倍に拡大する予定です$im->resizeImage()
。これについてもっと良い方法はありますか?