你如何摆脱在opencv c ++中裁剪图像后留下的空白?
Posted
技术标签:
【中文标题】你如何摆脱在opencv c ++中裁剪图像后留下的空白?【英文标题】:How do you get rid of the blank gap left after cropping an image in opencv c++? 【发布时间】:2017-07-13 20:24:22 【问题描述】:我正在编写一个程序来分析图片并围绕图片中的对象裁剪它们。该程序可以很好地裁剪图像,但会在侧面留下一个奇怪的间隙。
我从这个问题的批准答案中复制了代码: Opencv c++ detect and crop white region on image
我开始使用的图像在更大的画布上看起来像这样。我得到了这个结果,但我想去掉左侧多余的空白,以便在手机壳附近进行裁剪。如果您在新选项卡中打开图像,效果会更好。
请帮忙。我在 Visual Studio 2015 中使用 opencv 和 c++。
【问题讨论】:
很难看出您的浏览器是否有白色背景。虽然如果您单击图像 chrome 会在黑色背景上显示它。 你不清楚。您是否复制了代码而不修改它以摆脱白色背景?它检测黑色背景 - 如果未更改,将不适用于白色。 尝试将这一行: if(in.at<:vec3b>(j,i) != cv::Vec3b(0,0,0)) 改为这一行: if(in .at<:vec3b>(j,i) != cv::Vec3b(255,255,255)) 如果您的背景是纯白色。 很抱歉给您带来了困惑。我确实像@Micka 提到的那样更改了那条线,使其具有 Vec3b(255,255,255)。背景是纯白色的,但正如 drescherjm 提到的,在新选项卡中打开图像显示图像侧面有一个大的白色条。这是运行程序后的结果。但是,我也希望栏也被剪掉。 您提供的图片是原图的裁剪图还是放大图? 【参考方案1】:由于salt-and-pepper noise,此图片未正确裁剪。要摆脱它,您可以使用median blur。您可以使用模糊图像填充 nonBlackList 并使用此列表正确裁剪原始图像。由于出现噪点后图像看起来略微放大,因此您可能应该尝试至少 5 的光圈大小以完全消除它。
cv::Mat in = cv::imread("CropWhite.jpg");
cv::Mat blurred;
cv::medianBlur(in, blurred, 5);
...
if(blurred.at<cv::Vec3b>(j,i) != cv::Vec3b(255,255,255))
nonBlackList.push_back(cv::Point(i,j));
【讨论】:
非常感谢@zteffi!图像完全按照我的要求裁剪!有没有一种方法可以让我以同样的方式裁剪图片,但在所有方面都留有边距? (也许所有边缘都是 50 像素?) bb 是一个矩形,可以修改。 bb.x -=50; bb.width += 100 等等。以上是关于你如何摆脱在opencv c ++中裁剪图像后留下的空白?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OpenCV c++ 中从图像中裁剪特定的矩形部分(ROI)
OpenCV:在opencv中调用warpPerspective后,如何计算裁剪(或修剪)以理想地适合没有空白空间?