import cv2
import numpy as np
def trim(frame):
#crop top
if not np.sum(frame[0]):
return trim(frame[1:])
#crop bottom
elif not np.sum(frame[-1]):
return trim(frame[:-2])
#crop left
elif not np.sum(frame[:,0]):
return trim(frame[:,1:])
#crop right
elif not np.sum(frame[:,-1]):
return trim(frame[:,:-2])
return frame
9条答案
按热度按时间t5zmwmid1#
我不知道你的照片是不是都是这样的。但是对于这张图片,下面是一个简单的python-opencv代码来裁剪它。
第一个导入库:
字符串
读取图像,将其转换为灰度,并使二值图像的阈值为1。
型
现在找到它的轮廓。只有一个对象,所以找到它的边界矩形。
型
现在裁剪图像,并将其保存到另一个文件中。
型
下面是结果:
x1c 0d1x的数据
qv7cva1a2#
我觉得这个答案更简洁:
字符串
67up9zun3#
字符串
jucafojl4#
好了,为了完整起见,我实现了上面的每一个建议,添加了递归算法的迭代版本(一旦纠正),并进行了一组性能测试。
TLDR:递归可能是最适合一般情况的(但使用下面的一个-OP有几个bug),自动裁剪是最适合您期望几乎为空的图像的。
一般调查结果:1.上面的递归算法中有几个1的错误。更正后的版本在下面。2. cv2.findContours函数在处理非矩形图像时存在问题,实际上在各种情况下甚至会修剪掉一些图像。我添加了一个使用cv2.CHAIN_APPROX_NONE的版本,看看它是否有帮助(它没有帮助)。3.自动裁剪实现对于稀疏图像是很好的,但是对于密集图像是很差的,这是递归/迭代算法的逆。
字符串
为了测试它,我做了这个简单的函数:
型
……结果……
型
jei2mxaa5#
Abid Rahman K的回答:
cv2.boundingRect
可以在不找到外部轮廓的情况下完成工作,如下所示字符串
(this功能可能添加后阿比德的答案和运行更快)
j2datikz6#
一个光滑的小递归函数怎么样?
字符串
加载图像并设置阈值,以确保暗区为黑色:
型
然后调用递归函数
型
nafvub8i7#
为了帮助任何人,我对@wordsforthewise的replacement进行了调整,以获得基于PIL的解决方案:
字符串
(It这是一个调整,因为原始代码期望裁剪掉白色背景而不是黑色背景。)
x3naxklr8#
Python 3.6版本
裁剪图像并插入到'CropedImages'文件夹
字符串
更改数字120到其他在第9行,并尝试为您的图像,它会工作
b1payxdu9#
这里用到的PIL代码适配在openCV中,也就是说比较通用。比PIL快多了
字符串