裁剪图像python的边框

时间:2018-12-09 03:56:24

标签: python image opencv border crop

我有这张照片 enter image description here

我想像这样裁剪 enter image description here

我使用此代码,但不会裁剪黑色边框。所以,有人可以帮我吗?

    im = cv2.imread("Data/"+file, 0)
    retval, thresh_gray = cv2.threshold(im, thresh=100, maxval=255, type=cv2.THRESH_BINARY)
    points = np.argwhere(thresh_gray==0)
    points = np.fliplr(points)
    x, y, w, h = cv2.boundingRect(points)
    crop = im[y:y+h, x:x+w] # create a crop
    retval, thresh_crop = cv2.threshold(crop, thresh=200, maxval=255, type=cv2.THRESH_BINARY)
    path = 'D:\Picture\Camera Roll'
    cv2.imwrite(os.path.join(path , file),thresh_crop)

1 个答案:

答案 0 :(得分:0)

我认为您可以使用contours解决方案轮廓是连接相同强度的连续点的曲线/线。因此,包含书面文字的框是一个轮廓。图像中的轮廓也具有某种关系,例如一个轮廓可以是其他轮廓的父级。在您的图像中,该框可能是书面脚本的父级。

cv2.findContours查找图像中的所有轮廓,第二个参数(cv2.RETR_TREE)表示应该返回哪种关系。由于轮廓具有层次结构,因此框可能位于轮廓列表的索引0或1中。

import matplotlib.pyplot as plt
%matplotlib inline
img = cv2.imread('image.png', 0)
ret, thresh = cv2.threshold(img, 127, 255, 0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

enter image description here

虽然第一个轮廓(contours [0])将代表该框,但是由于某种原因,它是第二个轮廓。

img_copy = img.copy()
cnt= contours[1]
cv2.drawContours(img_copy, [cnt], -1, color = (255, 255, 255), thickness = 20)
plt.imshow(img_copy, 'gray')

enter image description here

绘制轮廓后,只需在轮廓上画一条粗的白线即可删除该框。这是solution,用于在图像上绘制特定的轮廓

  

不用担心这些图像中的边框。这只是matplotlib。您的图像就是坐标框中的内容。