Python 从图像中删除边框
我有一组像下面这样的图像,每个图像都由实际的图像部分组成,周围有不同大小的黑色边框。我的目标是删除这些边界并提取图像,以后可以用于其他任务 我曾尝试使用canny边缘检测器来识别边界,并仅从中获取图像,但它没有按预期工作 我也尝试过下面其他帖子中提到的技巧,但这些在我的案例中也不起作用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):
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()