从现有图像中裁剪图像

时间:2013-04-01 13:36:17

标签: c++ python opencv image-processing

我想从现有图像中裁剪出图像。我使用imagemagick拍摄了一张图像并使用阈值98%在其上应用了单色(这在openCV中是可行的吗?)

生成的图像是:

enter image description here

现在从这张图片中我想裁剪出另一张图片,以便最终图像看起来像这样:

enter image description here

问题 我怎么能在OpenCV中这样做?请注意,我想裁剪图像的唯一原因是我可以使用this answer来获取文本的一部分。如果不需要裁剪出新的图像,而只是开始专注于图像的黑色部分,那就太棒了。

2 个答案:

答案 0 :(得分:5)

如果顶部和底部的文字是您想要crop out,的区域,如果它们始终位于同一位置,则解决方案很简单:只需设置忽略这些区域的投资回报率< /强>:

#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;
}

输出图片:

如果黑色矩形的位置(您感兴趣的区域)不在固定位置,那么您可能需要查看另一种方法:使用rectangle detection technique

在上面的输出中,您感兴趣的区域将是图像中的第二个largest rectangle

旁注,如果您打算稍后隔离文字,只需一个简单的 cv::erode() 就可以删除该图片中的所有噪音,这样您就可以了使用白盒&amp;文本。另一种消除噪音的技巧是使用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.我在Extract hand bones from X-ray image上展示了一点。

答案 1 :(得分:0)

一个简单的解决方案:从上到下,从下到上,左右和左右扫描线条。当行中暗像素的数量超过行中像素总数的50%时终止。这将为您提供绑定裁剪矩形的xmin,xmax,ymin,ymax坐标。