如何在Python中使用OpenCV裁剪图像的黑色背景?

如何在Python中使用OpenCV裁剪图像的黑色背景?,python,opencv,image-processing,Python,Opencv,Image Processing,因此,我手头有一项图像处理任务,需要裁剪图像的某一部分。我以前没有OpenCV的经验。我想知道我应该走哪条路 示例输入图像: 示例输出图像: 我最初的想法是将图像转换为位图,并删除低于或高于某个阈值的像素。因为我可以自由地使用OpenCV和Python,所以我想知道是否有任何自动算法可以做到这一点,如果没有,那么解决此类问题的正确方法应该是什么。谢谢。阈值设置似乎是一个很好的方法。过度使用可能是一个神经网络,但你可能没有足够的数据来训练(:D) 您应该能够执行以下操作: import num

因此,我手头有一项图像处理任务,需要裁剪图像的某一部分。我以前没有OpenCV的经验。我想知道我应该走哪条路

示例输入图像:

示例输出图像:


我最初的想法是将图像转换为位图,并删除低于或高于某个阈值的像素。因为我可以自由地使用OpenCV和Python,所以我想知道是否有任何自动算法可以做到这一点,如果没有,那么解决此类问题的正确方法应该是什么。谢谢。

阈值设置似乎是一个很好的方法。过度使用可能是一个神经网络,但你可能没有足够的数据来训练(:D)

您应该能够执行以下操作:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('img.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU

应用一个简单的阈值应该去掉背景,前提是背景总是比前景暗。如果你使用大津阈值算法,它应该为你选择一个好的分区。使用您的示例作为输入,这将给出:

接下来,您可以计算边界框以选择前景区域。如果背景足够清晰且没有孔,则会生成矩形:

[619 x 96 from (0, 113)]
然后,可以使用此矩形裁剪原始图像,以生成所需的结果:

我编写了C++代码来解决这个问题。到Python的粗略翻译如下所示:

import cv2 as cv

img = cv.imread(sys.argv[1])

grayscale = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

thresholded = cv.threshold(grayscale, 0, 255, cv.THRESH_OTSU)

imwrite("otsu.png", thresholded)

bbox = cv.boundingRect(thresholded)

x, y, w, h = bbox

print(bbox)

foreground = img[y:y+h, x:x+w]

imwrite("foreground.png", foreground)
该方法快速简便。如果您发现您的背景中有一些白色的洞放大了边界框,请尝试应用侵蚀操作符


FWIW我非常怀疑,使用NNs后,您是否会获得可预测或可靠的结果。

NN将是一种过激行为!您可以进行边缘检测,并将极端水平线作为边界。然后仅裁剪这两条线内的roi

我有几十张这样的照片。这算不算训练神经网络的数据集?因为这对网络来说是一项很容易的任务,你也许可以做一些扩充。谢谢这确实是一个很大的帮助。这不是一个答案,请评论这些类型的声明