Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从图像中删除边框_Python_Opencv_Image Processing - Fatal编程技术网

Python 从图像中删除边框

Python 从图像中删除边框,python,opencv,image-processing,Python,Opencv,Image Processing,我有一组像下面这样的图像,每个图像都由实际的图像部分组成,周围有不同大小的黑色边框。我的目标是删除这些边界并提取图像,以后可以用于其他任务 我曾尝试使用canny边缘检测器来识别边界,并仅从中获取图像,但它没有按预期工作 我也尝试过下面其他帖子中提到的技巧,但这些在我的案例中也不起作用 In [1]: from PIL import Image, ImageChops In [3]: im = Image.open('iI3ZE.jpg') In [4]: def trim(im):

我有一组像下面这样的图像,每个图像都由实际的图像部分组成,周围有不同大小的黑色边框。我的目标是删除这些边界并提取图像,以后可以用于其他任务

我曾尝试使用canny边缘检测器来识别边界,并仅从中获取图像,但它没有按预期工作

我也尝试过下面其他帖子中提到的技巧,但这些在我的案例中也不起作用

In [1]: from PIL import Image, ImageChops

In [3]: im = Image.open('iI3ZE.jpg')

In [4]: def trim(im):
   ...:         bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
   ...:         diff = ImageChops.difference(im, bg)
   ...:         diff = ImageChops.add(diff, diff, 2.0, -100)
   ...:         bbox = diff.getbbox()
   ...:         if bbox:
   ...:                 return im.crop(bbox)


上述查询的任何线索都会有帮助。

这里是Python/OpenCV中的一种方法。将图像读取为灰度。然后阈值为零,因为背景是黑色的。然后将其打开,进行清洁。然后找到等高线,得到最大等高线的边界框。然后使用边界框进行裁剪

输入:


阈值图像:

形态学清理图像:

裁剪图像:


在Python/OpenCV中有一种方法。将图像读取为灰度。然后阈值为零,因为背景是黑色的。然后将其打开,进行清洁。然后找到等高线,得到最大等高线的边界框。然后使用边界框进行裁剪

输入:


阈值图像:

形态学清理图像:

裁剪图像:


如果图像始终处于相同位置,则只需使用
new_im=im[y:y+h,x:x+w]裁剪图像即可。
其中x,y是所需零件的左上角,w,h是尺寸。如果图像始终处于相同位置,则只需使用
new_im=im[y:y+h,x:x+w]裁剪图像即可。
其中x,y是您想要的零件的左上角,w,h是尺寸。非常感谢您的输入,非常感谢,这是一种在Matlab中提供类似片段的方法吗对不起,我不知道Matlab。非常感谢您的输入,非常感谢,这是一种在Matlab中提供类似片段的方法吗对不起,我不懂Matlab。
import cv2
import numpy as np

# load image
img = cv2.imread("sonar.png", cv2.IMREAD_GRAYSCALE)

# threshold
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY)[1]

# apply open morphology
#kernel = np.ones((5,5), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,15))
morph = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
 
# get bounding box coordinates from largest external contour
contours = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
big_contour = max(contours, key=cv2.contourArea)
x,y,w,h = cv2.boundingRect(big_contour)

# crop image contour image
result = img.copy()
result = result[y:y+h, x:x+w]

# write result to disk
cv2.imwrite("sonar_thresh.jpg", thresh)
cv2.imwrite("sonar_morph.jpg", morph)
cv2.imwrite("sonar_cropped.png", result)

# display results
cv2.imshow("THRESH", thresh)
cv2.imshow("MORPH", morph)
cv2.imshow("CROPPED", result)
cv2.waitKey(0)
cv2.destroyAllWindows()