【问题标题】:Cropping out an image from an existing image从现有图像中裁剪图像
【发布时间】:2013-03-22 14:11:00
【问题描述】:

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

生成的图像是这样的:

现在我想从这张图片中裁剪出另一张图片,以便最终图片如下所示:

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

【问题讨论】:

  • 您似乎在尝试调整图像大小而不是裁剪它,对吗?
  • @perfanoff 小鸟想要裁剪它。 Stack Overflow 正在调整图像大小。 BeforeAfter.
  • @perfanoff 是正确的。感谢您的澄清。我不想调整图像大小。

标签: c++ python opencv image-processing


【解决方案1】:

如果顶部和底部的文本是您想要 crop out, 的区域,如果它们始终位于同一位置,则解决方案很简单:只需设置忽略这些区域的 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;
}

输出图像:

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

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

附带说明,如果您打算稍后隔离文本,一个简单的 cv::erode() 可以消除该图像中的所有噪音,因此您只剩下白框和文字。另一种消除噪音的技术是使用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 上演示了一点。

【讨论】:

  • 标题总是在同一个位置。这意味着它将始终位于图像的顶部。如何设置忽略顶部的 ROI?我是opencv的新手...是否有一个示例程序显示忽略基于颜色的图像的某些ROI...
  • 好的,谢谢。我尝试了morphologyEx 技术并得到了这个图像:imageshack.us/a/img16/5506/screenshot20130401at203.png 现在我想我需要找出大矩形开始的坐标......
  • 矩形检测技术正是我所需要的,因为矩形位置并不总是相同的。我将使用该答案提出解决方案。谢谢
  • 是否可以在 c++ 中做一些事情来避免在所有变量前面输入 cv:: 而只是输入 Mat Point 等。
  • 是的,在#include 部分之后,添加:using namespace cv;
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2016-02-06
    • 2013-04-02
    • 1970-01-01
    • 2023-03-22
    • 2023-04-02
    相关资源
    最近更新 更多