上部と下部のテキストがトリミングしたい領域である場合、それらが常に同じ場所にある場合、解決策は簡単です:それらの領域を無視する 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 線画像から手の骨を抽出する で少し説明しました。