C++ 从现有图像裁剪出图像

C++ 从现有图像裁剪出图像,c++,python,opencv,image-processing,C++,Python,Opencv,Image Processing,我想从现有图像中裁剪出一个图像。我用imagemagick拍摄了一张图像,并在其上应用了单色,阈值98%(这在openCV中可行吗?) 生成的图像如下所示: 现在,我想从这张图片中裁剪出另一张图片,这样最终的图片如下所示: 问题 如何在OpenCV中执行此操作?请注意,我想要裁剪图像的唯一原因是,我可以使用它来获取文本的一部分。如果不需要裁剪出一张新的图像,而是只关注图像的黑色部分,那就太好了 一个简单的解决方案:从上到下、从下到上、从左到右、从右到左扫描行。当行中的暗像素数超过行中像素总数

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

生成的图像如下所示:

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

问题
如何在OpenCV中执行此操作?请注意,我想要裁剪图像的唯一原因是,我可以使用它来获取文本的一部分。如果不需要裁剪出一张新的图像,而是只关注图像的黑色部分,那就太好了

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

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

一个合适的解决方案甚至可能是这三者的组合。我已经在上面演示了一点。

似乎您正在尝试调整图像的大小,而不是对其进行裁剪,对吗?@perfanoff birdy希望对其进行裁剪。堆栈溢出正在调整图像的大小@这是正确的。谢谢你的澄清。我没有试图调整图片大小。标题将始终位于同一位置附近。这意味着它将始终位于图像的顶部。如何设置忽略顶部的ROI?我是opencv新手…是否有一个示例程序显示忽略基于颜色的图像的一些ROI…好的,谢谢。我尝试了
morphologyEx
技术,得到了这张图片:现在我想我需要找出大矩形开始的坐标……矩形检测技术正是我所需要的,因为矩形位置并不总是相同的。我将用这个答案来提出一个解决方案。感谢C++中可以做的事情,避免在所有变量前面键入<代码> cv::/c>,而只是键入<代码>垫点< /代码>等。是的,在<代码>包含< /COD>段之后,添加:<代码>使用命名空间CV;<代码>
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(7, 7), cv::Point(3, 3));
cv::morphologyEx(src, src, cv::MORPH_ELLIPSE, kernel);