我有一张要在c ++中裁剪的黑色部分的图片(下面的示例)

多少

考虑到可变的结果是我想要裁剪的图片没有黑色部分这是我的代码

cv::Mat result;
result = img1.clone();
cv::warpPerspective(img1, result, H, cv::Size(img1.cols + img2.cols, img1.rows));
Mat gray;
cv::cvtColor(result, gray, COLOR_BGR2GRAY);

Mat thresh;
threshold(result, thresh, 1, 255, THRESH_BINARY);
imshow("r", thresh);
waitKey(0);
int max = 0;
int x = 0;
while (thresh.at<uchar>(x, 10) != 0) {
    x++;
    if (max < x)
        max = x;
    //enter code here
}

如何修复我的代码?

在此处输入图片说明

坏蛋

这是一般的想法:

  1. 将图像转换为灰度
  2. 0使用简单的二进制阈值对所有以上阈值进行阈值
  3. 形态清理二进制图像
  4. 使用二进制蒙版获得图像上的最大轮廓
  5. 使用最大轮廓获得边界矩形
  6. 使用边界矩形裁剪图像

这是代码,首先,读取图像并将其转换为灰度。threshold之后简单应用很简单:

//Read input image:
cv::Mat inputImage = cv::imread( "C://opencvImages//DOrOQ.png", cv::IMREAD_COLOR );
cv::Mat testImage = inputImage.clone(); //Deep copy for cropping

//Convert to greayscale:
cv::cvtColor( inputImage, inputImage, cv::COLOR_BGR2GRAY );

//Threshold everything that is above 0:
cv::Mat binaryMask;
cv::threshold( inputImage, binaryMask, 1, 255, cv::THRESH_BINARY_INV );

这是您获得的二进制掩码:

现在,检查一下幸存下来的小像素。如果可以申请Eroding我们可以摆脱这些,其次是Dilating我使用的structuring element是大小35操作迭代的矩形

//Clean the mask via Erode + Dilate:
cv::Mat SE = cv::getStructuringElement( cv::MORPH_RECT, cv::Size(3,3) );
int opIterations = 5;
cv::morphologyEx( binaryMask, binaryMask, cv::MORPH_ERODE, SE, cv::Point(-1,-1), opIterations );
cv::morphologyEx( binaryMask, binaryMask, cv::MORPH_DILATE, SE, cv::Point(-1,-1), opIterations );

生成的经过过滤的二进制掩码是这样的:

现在,反转图像,以使最大的白色斑点成为实际的滤波斑点。让我们在此图像上找到最大的轮廓:

//Invert Mask:
binaryMask = 255 - binaryMask;

//Lets get the blob contour:
std::vector< std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;

cv::findContours( binaryMask, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

int largestBlobIndex = 0;
double largestArea = 0.0;

//Find the largest blob adn get the outer contour:
for( int i = 0; i < (int)contours.size(); i++ ) {

    //Find the area of the contour
    double a = cv::contourArea( contours[i], false);
    //Store the index of largest contour:
    if( a > largestArea ){
        largestArea = a;
        largestBlobIndex = i;
    }

}

//Get the bounding box of the biggest blob:
cv::Rect boundingBox = cv::boundingRect( contours[largestBlobIndex] );

此边界框(红色矩形)包围了您要裁剪的实际区域:

现在,只需裁剪图像:

//Crop the image:
cv::Mat croppedImage = testImage( boundingBox );

然后您得到最终结果:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我在Excel 2007中有一张桌子,我想要一张图表

我需要在一张表的一部分中按规范条件选择行

我正在尝试从与 id 相关的表中获取第一张图片,但不幸的是获取所有图片而不是第一张图片

我需要在多张纸中复制特定范围并将它们粘贴到最后一张纸上

我有一张桌子,希望我的描述中显示的结果桌子

为什么我的其中一张图片没有并排显示?

我如何在 Django 中插入一张表并更新另一张表

将一张以上的表合并到一张现有的表中

为什么下面的代码只提取第一张图片的 ID 名称?

上传页面的一部分或页面中的一张图片-第一张(尽快)

我有一张图片 18F4550 如何从超声波传感器读取距离

我曾尝试使用 beautifulsoup 刮一张桌子,但表格中只有一行显示为输出

一张一张显示图片

将所有日期存储在一张表中

需要在Laravel 4的同一张表中设置1对多的关系

我有3张会旋转的图片,但它们不会回到第一张并重新开始

我想叠加两张图片,其中一张是透明的

我如何从另一张纸复制行并将其粘贴到其中有表格的纸中?

为什么我的其中一张GPU卡没有显示在传感器中?

通过从SQL Server的另一张表中选择行,将所有行一张一张地插入到空表中

我需要在下面的示例中为Spring Data JDBC项目配置Bean吗?

我可以在Redshift中从一张表复制到另一张吗

过滤一张纸A和另一张纸B,以得到一张新的纸C,其中B中不存在行

我想从Galary中挑选一张图片,并希望减小同一张图片的大小,并需要将其保存在单独的目录中?

Excel-识别一张纸中的值与另一张纸中具有不同范围的值

无法显示图像 unorderlist 中的下一张和上一张所有图像

在Jekyll中,我如何获取帖子的第一张图片?

我有2个盒子和一张照片。用户可以在2个框之间拖动图片。我如何知道图片从哪个框拖动?

如何在C#或SQL中从具有不同条件的同一张表中获取公用数据