Python opencv 去除图像四周黑边的一种做法

注意,图像去黑边有很多种算法设计思路,具体能否起作用要视待处理图像的质量等因素来确定。

这里给出的思路为,将图像以黑白的形式读进去,利用opencv的connectedComponentsWithStats函数求连通域。那么对于有黑边的图像来说,图像由内容和黑边组成,因此最大的连通域就是内容本身,我们将其提取出来即可。

需要注意的是,由于连通性算法本身的原理,因此下面这套去黑边算法比较适用于未被压缩的原始图像(压缩图像过程中所引入的插值会影响连通算法的效果)。

假定输入图像如下:
Python opencv 去除图像四周黑边的一种做法_第1张图片
代码如下:

import cv2
import numpy as np
 
image = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(image)
print('num_labels: ', num_labels)
for i, st in enumerate(stats[1:]):
    x0 = st[0]
    y0 = st[1]
    x1 = st[0] + st[2]
    y1 = st[1] + st[3]
    image_show = np.copy(image)
    cv2.rectangle(image_show, (x0, y0), (x1, y1), (255, 255, 255), 3)
    cv2.imshow('labels', image_show)
    cv2.waitKey(0)
    image = image[y0:y1, x0:x1]
    cv2.imwrite('img_crop_' + str(i) + '.png', image)

bbox结果与去黑边结果如下。注意,如果正确检出的话,上述代码输出的num_labels应为2,即内容和黑边这两个连通域。感兴趣的读者可以自行对上述代码进行修改,例如将最大的连通域视为前景,从而提升算法的效果。
Python opencv 去除图像四周黑边的一种做法_第2张图片
Python opencv 去除图像四周黑边的一种做法_第3张图片

你可能感兴趣的:(basic,划水)