0

私は毎週のメニューpdfを取り、それをグリッドボックスに分割してトリミングし、後で OCR をそれぞれTesseractOCRで作成しようとしました。

ここで役立つかもしれないlineJunctionsを見たことがありますが、imagemagick php ドキュメントでそれらを見つけることができませんでした。同様のstackoverflow questionでHough Linesも見ましたが、phpドキュメントでそれらを見つけることができませんでした。

//read the image
$im = new Imagick();
$im->readimage('menu.png');

図1

//resize and contrast
$im->resizeImage($im->getImageWidth()/6, $im->getImageHeight()/6 , 9, 1);
$im->thresholdImage( 0.65 * Imagick::getQuantum() );;

図2

//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();

図3

// 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);

図4

$squareKernel = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_SQUARE, "2");
$im->morphology(\Imagick::MORPHOLOGY_CLOSE, 1, $squareKernel);

図5

これを行うと、ax、y、width、height を取得できれば、座標を取得できるはずのボックスを含む画像になりますが、右下隅が欠けており、非常に面倒です。より良いアプローチが必要だと確信しています。

画像は縮小されており、次に見られるように座標を 6 倍に拡大する予定です$im->resizeImage()。これについてもっと良い方法はありますか?

4

1 に答える 1

1

ImageMagick でこれを行う 1 つの方法 (線が水平方向と垂直方向であると仮定) は、1 つの行と 1 つの列、しきい値、およびフィルター txt: 黒いピクセルの出力にスケーリングすることです。

xlist=`convert cells.png -scale x1! -auto-level -threshold 27% -negate -morphology Thinning:-1 Skeleton -negate txt:- | grep "black" | cut -d, -f1`
echo "$xlist"
38
109
180
251
322
394
465
536


ylist=`convert cells.png -scale 1x! -auto-level -threshold 27% -negate -morphology Thinning:-1 Skeleton -negate txt:- | grep "black" | cut -d: -f1 | cut -d, -f2`
echo "$ylist"
45
141
256
381

すべての x 値とすべての y 値の組み合わせにより、交点の配列が得られます。

xArr=($xlist)
yArr=($ylist)
numx=${#xArr[*]}
numy=${#yArr[*]}
pointlist=""
for ((j=0; j<numy; j++)); do
for ((i=0; i<numx; i++)); do
pointlist="$pointlist ${xArr[$i]},${yArr[$j]}"
done
done
echo "pointlist=$pointlist"
pointlist= 38,45 109,45 180,45 251,45 322,45 394,45 465,45 536,45 38,141 109,141 180,141 251,141 322,141 394,141 465,141 536,141 38,256 109,256 180,256 251,256 322,256 394,256 465,256 536,256 38,381 109,381 180,381 251,381 322,381 394,381 465,381 536,381

次の方法で視覚化できます。

convert cells.png -scale x1! -scale 550x50! -auto-level -threshold 27% tmp1.png

ここに画像の説明を入力

convert cells.png -scale 1x! -scale 50x425! -auto-level -threshold 27% tmp2.png

ここに画像の説明を入力

細線化を行わないと、上部の水平線が 1 ピクセルよりも太くなります。

于 2017-11-30T03:27:33.977 に答える