2

既存の画像から画像を切り抜きたいと思います。画像を撮影し、imagemagick を使用してしきい値を指定してモノクロを適用しました98%(これは openCV で実行できますか?)

結果の画像は次のとおりです。

ここに画像の説明を入力

この画像から別の画像を切り取って、最終的な画像が次のようになるようにします。

ここに画像の説明を入力

質問 OpenCV でこれを行うにはどうすればよいですか? 画像をトリミングしたい唯一の理由は、この回答を使用してテキストの一部を取得できるようにするためです。新しい画像をトリミングする必要がなく、代わりに画像の黒い部分に集中するだけであれば、それは素晴らしいことです.

4

2 に答える 2

5

上部と下部のテキストがトリミングしたい領域である場合、それらが常に同じ場所にある場合、解決策は簡単です:それらの領域を無視する ROI を設定するだけです:

#include <cv.h>
#include <highgui.h>

int main(int argc, char* argv[])
{
    cv::Mat img = cv::imread(argv[1]);
    if (img.empty())
    {
        std::cout << "!!! imread() failed to open target image" << std::endl;
        return -1;        
    }

    /* Set Region of Interest */

    int offset_x = 129;
    int offset_y = 129;

    cv::Rect roi;
    roi.x = offset_x;
    roi.y = offset_y;
    roi.width = img.size().width - (offset_x*2);
    roi.height = img.size().height - (offset_y*2);

    /* Crop the original image to the defined ROI */

    cv::Mat crop = img(roi);
    cv::imshow("crop", crop);
    cv::waitKey(0);

    cv::imwrite("noises_cropped.png", crop);

    return 0;
}

出力画像:

関心のある領域である黒い四角形の位置が固定された場所に存在しない場合は、別のアプローチをチェックすることをお勧めします:四角形検出技術を使用します:

上記の出力では、関心のある領域は、画像内で 2番目に大きい四角形になります。

余談ですが、後でテキストを分離する予定がある場合は、単純なcv::erode()でその画像のすべてのノイズを削除できるため、白いボックスとテキストが残ります。ノイズを除去するもう 1 つの方法は、 を使用することです。そのトリックを実行するためにcv::medianBlur()探索することもできます。cv::morphologyEx()

cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7, 7), cv::Point(3, 3));
cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);    

適切な解決策は、これら 3 つの組み合わせでさえあるかもしれません。 X 線画像から手の骨を抽出する で少し説明しました。

于 2013-04-01T17:32:20.370 に答える
0

簡単な解決策: 上から下、下から上、左右、および左右からラインをスキャンします。ライン内の暗いピクセルの数が、ライン内のピクセルの合計量の 50% を超えると終了します。これにより、xmin、xmax、ymin、ymax 座標が得られ、切り取り四角形の境界が決まります。

于 2013-04-01T17:04:22.060 に答える