Python 如何从图像中提取子图像?
在给定主映像的情况下,计算和提取所有子映像的方法是什么 样本1 输入: 输出应该是8个子图 样本2 输入: 输出应有6个子图 注:这些图像样本取自互联网。图像可以是随机尺寸 有没有办法在这些图像中画出分隔线,然后根据这些细节进行分割 e、 g:Python 如何从图像中提取子图像?,python,opencv,machine-learning,image-processing,computer-vision,Python,Opencv,Machine Learning,Image Processing,Computer Vision,在给定主映像的情况下,计算和提取所有子映像的方法是什么 样本1 输入: 输出应该是8个子图 样本2 输入: 输出应有6个子图 注:这些图像样本取自互联网。图像可以是随机尺寸 有没有办法在这些图像中画出分隔线,然后根据这些细节进行分割 e、 g: 我认为,从任意图形表中正确提取所有单个图形(如两个示例所示)不会有一个通用的解决方案——至少使用某种“简单”的图像处理技术 对于具有恒定网格布局和单个图形之间恒定颜色空间的“完美”表格(如两个示例所示),可以采用以下方法: 计算x和y方向的平均标准偏
我认为,从任意图形表中正确提取所有单个图形(如两个示例所示)不会有一个通用的解决方案——至少使用某种“简单”的图像处理技术 对于具有恒定网格布局和单个图形之间恒定颜色空间的“完美”表格(如两个示例所示),可以采用以下方法:
x
和y
方向的平均标准偏差,并使用一些自定义参数计算阈值。恒定颜色空间内的平均标准偏差应接近零。这里需要一个自定义参数,因为会有一些伪影,例如来自JPG压缩的伪影,其影响可能或多或少严重导入cv2
将numpy作为np导入
从skimage.morphology导入二进制函数
def从_表中提取_(图像、标准_thr、内核_x、内核_y):
#x和y方向上的平均标准偏差阈值
标准x=np.平均值(np.标准(图像,轴=1,轴=1)>标准thr
标准y=np.平均值(np.标准(图像,轴=0,轴=1)>标准thr
#二进制关闭以关闭小空格,例如标题周围
std_xx=二进制_关闭(std_x,np.ones(内核_x))
std_yy=二进制(std_y,np.one(kernel_y))
#查找每个子映像的开始和停止位置
start_y=np.where(np.diff(np.int8(std_xx))==1)[0]
停止y=np.where(np.diff(np.int8(std_xx))=-1)[0]
start_x=np.where(np.diff(np.int8(std_yy))==1)[0]
停止x=np.where(np.diff(np.int8(std_yy))==-1[0]
#提取子图像
返回[图像[y1:y2,x1:x2,:]
对于拉链中的y1、y2(开始、停止)
对于zip中的x1、x2(开始、停止)]
对于(['image1.jpg','image2.png'])中的文件:
img=cv2.imread(文件)
cv2.imshow(“图像”,img)
子图像=从_表中提取_(img,5,21,11)
打印(“{}找到子图像”。。格式(len(子图像)))
对于子图像中的i:
cv2.imshow(“子图像”,i)
cv2.等待键(0)
打印
输出为:
找到8个子图像。
找到6个子图像。
此外,显示每个子图像也是为了可视化
对于这两幅图像,相同的参数是合适的,但这只是一些巧合
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
NumPy:1.20.1
OpenCV:4.5.1
scikit图像:0.18.1
----------------------------------------
我只能使用简单的阵列切片技术提取子图像。我不确定这是否是你要找的。但是如果你知道表的列和行,我想你可以提取子图像
image = cv2.imread('table.jpg')
p = 2 #number of rows
q = 4 #number of columns
width, height, channels = image.shape
width_patch = width//p
height_patch = height//q
x=0
for i in range(0, width - width_patch, width_patch):
for j in range(0, height - height_patch, height_patch):
crop = image[i:i+width_patch, j:j+height_patch]
cv2.imwrite("image_{0}.jpg".format(x),crop)
x+=1
# cv2.imshow('crop', crop)
# cv2.waitKey(0)```