0

私の目標は、スキャンした名刺画像からテキスト以外の領域を削除することですが、OpenCVを使用してそれを実行する手順がわかりません。この手順に従いましたが、これが正しいかどうかもわかりません。画像に変更があった場合(テキスト以外の領域が残っている場合)、アイデアは非常に役立ちます。ありがとうございます。

1)画像をグレースケールに変換します

2)画像のバイナリ

3)白いピクセルのテキストにするために色を反転します(cv :: bitwise_not)

4)画像を侵食する(cv :: erode)

5)キャニーを使用してエッジを検出する

6)ハフ変換を使用してテキスト行を検出します(まだ)

コード:

cv::Mat greyMat = [self.imageView.image CVGrayscaleMat];
cv::Mat bwMat;
cv::threshold(greyMat, bwMat, 128, 255, CV_THRESH_BINARY);
cv::bitwise_not(bwMat, bwMat);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 1));
cv::erode(bwMat, bwMat, element);
std::vector<cv::Point>points;
cv::Mat_<uchar>::iterator it=bwMat.begin<uchar>();
cv::Mat_<uchar>::iterator end=bwMat.end<uchar>();
for (; it!=end; ++it) 
if (*it) 
points.push_back(it.pos());
cv::RotatedRect box=cv::minAreaRect(cv::Mat(points));
plImage* smothedImage=new IplImage(bwMat); 
cvSmooth(smothedImage, smothedImage);
cvCanny(smothedImage, smothedImage, 10, 100);
4

1 に答える 1

7

ロゴを定義する1つの方法は、ロゴ部分にテキスト部分よりも太い線と大きなブロブが含まれていることです。

これが当てはまる場合は、次のようにロゴを削除できます。

(私はimagemagickを使用して次のサンプルを生成しました。opencvでも同じことができるはずです)

0)画像のしきい値(オプション)

   imagemagick: convert img0052ir.jpg -threshold 60% monochrome.png

出力:convert img0052ir.jpg -threshold 60%モノクロ.png

1)すべての文字がなくなるまで画像を拡張しますが、ロゴの一部は残ります。

 orgImg = business card image 
 cvDilate (orgImg, curImg, null, Some_Value) // find a value that erases all letters but leaves the logo

また

 imagemagick:  convert monochrome.png -morphology dilate:3 diamond dilated.png

connvertモノクロ.pngの出力-morphologydilate:3 diamond dilated.png

2)条件付き-ロゴが再び完成するまで、元の画像をマスクとして使用して、拡張した画像を侵食します。

これは、拡張された画像を侵食することを意味しますが、ピクセル値を元のソース画像の値より低く設定しないでください。元の画像をマスクとして使用して、画像の一部を変更から保護します。

これにより、シード部分が残っているすべての形状が復元されるため、ロゴのみが復元されます

 // Not sure if opencv can use a mask in morphologial operations, 
 // but you can just use erode + max in a loop to achive the same effect albeit slower
 repeat
    lastImg = curImg
    cvErode (lastImg, curImg, null ,1)
    cvMax (curImg, orgImg, curImg)
 until lastImg == curImg

また

 imagemagick: convert dilated.png -morphology erode:20 diamond -clip-mask monochrome.png eroded.png

convert dilated.png -morphology erode:20 diamond-clip-maskモノクロ.pngeroded.pngの出力

これで、ロゴのみが含まれ、テキストが含まれない画像が作成されました。この画像を使用してロゴを削除してください

 imagemagick: convert eroded.png -negate img0052ir.jpg -compose plus -composite test.png

ここに画像の説明を入力してください

ご覧のとおり、完璧にはほど遠いです。おそらく、opencvでしきい値処理、拡張カーネルなどをいじって、これを改善できるかどうかを確認してください。しかし、すべてのロゴを削除し、テキストを削除しない一般的な解決策があるとは思えません

編集:いくつかの写真が追加されました

于 2012-04-21T23:36:21.487 に答える