注意,图像去黑边有很多种算法设计思路,具体能否起作用要视待处理图像的质量等因素来确定。
这里给出的思路为,将图像以黑白的形式读进去,利用opencv的connectedComponentsWithStats函数求连通域。那么对于有黑边的图像来说,图像由内容和黑边组成,因此最大的连通域就是内容本身,我们将其提取出来即可。
需要注意的是,由于连通性算法本身的原理,因此下面这套去黑边算法比较适用于未被压缩的原始图像(压缩图像过程中所引入的插值会影响连通算法的效果)。
假定输入图像如下:
代码如下:文章来源:https://www.toymoban.com/news/detail-653034.html
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,即内容和黑边这两个连通域。感兴趣的读者可以自行对上述代码进行修改,例如将最大的连通域视为前景,从而提升算法的效果。
文章来源地址https://www.toymoban.com/news/detail-653034.html
到了这里,关于Python opencv 去除图像四周黑边的一种做法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!