在python中裁剪多个图像的基于模式的区域

在python中裁剪多个图像的基于模式的区域,python,image-processing,Python,Image Processing,我有很多截图需要裁剪。所有图像看起来都很相似——有一个带蓝色边框的矩形窗口,其中包含一些图形元素。这个窗口包含在另一个窗口中,但我只需要裁剪内部窗口。在所有图像中,内部窗口的尺寸不同,内容也不同。在大多数情况下,内容包括矩形形式的元素,有时包括蓝色边框,与内部窗口的边框相同。我之所以提到这一点,是因为我想到了以下流程: 遍历目标目录中所有图像的脚本。对于每一项: 查找要裁剪的区域(内窗口) 种植该地区 保存文件 如何做到这一点?Python不是强制性的,也可以是任何其他的。这并不简单,但这是

我有很多截图需要裁剪。所有图像看起来都很相似——有一个带蓝色边框的矩形窗口,其中包含一些图形元素。这个窗口包含在另一个窗口中,但我只需要裁剪内部窗口。在所有图像中,内部窗口的尺寸不同,内容也不同。在大多数情况下,内容包括矩形形式的元素,有时包括蓝色边框,与内部窗口的边框相同。我之所以提到这一点,是因为我想到了以下流程:

遍历目标目录中所有图像的脚本。对于每一项:

  • 查找要裁剪的区域(内窗口)
  • 种植该地区
  • 保存文件

如何做到这一点?Python不是强制性的,也可以是任何其他的。

这并不简单,但这是一个可能的方法:

import matplotlib.pyplot as plt
import numpy as np

def synthimage():
    w,h = 300,200
    im = np.random.randint(0,255,(w,h,3))/255
    xa = np.random.randint(50,w-60)
    xb = xa + np.random.randint(50,90)
    ya = np.random.randint(50,h-60)
    yb = ya + np.random.randint(20,50)
    im[xa:xb,ya] = np.array([1,0,0])
    im[xa:xb,yb] = np.array([1,0,0])
    im[xa,ya:yb] = np.array([1,0,0])
    im[xb,ya:yb] = np.array([1,0,0])
    return im

def getRectPoints(im):
    x,y = [],[]
    for i in range(im.shape[0]):
        for j in range(im.shape[1]):
            if (im[i,j]-np.array([1,0,0])).sum()==0:
                x.append(i)
                y.append(j)
    return np.array(x),np.array(y)

def denoise(x,y):
    nx,ny = [],[]
    for i in range(x.shape[0]):
        d = np.sqrt((x[i]-x)**2+(y[i]-y)**2)
        m = d<2
        if len(m.nonzero()[0])>2:
            nx.append(x[i])
            ny.append(y[i])
    return np.array(nx),np.array(ny)

im = synthimage()    
plt.imshow(np.swapaxes(im,0,1),origin='lower',interpolation='nearest')
plt.show()

x,y = getRectPoints(im)
plt.scatter(x,y,c='red')
plt.xlim(0,300)
plt.ylim(0,200)
plt.show()

nx,ny = denoise(x,y)
plt.scatter(nx,ny,c='red')
plt.xlim(0,300)
plt.ylim(0,200)
plt.show()

#Assuming rectangle has no rotation (otherwise check Scipy ConveHull)
xmi = nx.min()
xma = nx.max()
ymi = ny.min()
yma = ny.max()

new = np.ones(im.shape)
new[xmi:xma,ymi:yma] = im[xmi:xma,ymi:yma]
plt.imshow(np.swapaxes(new,0,1),origin='lower',interpolation='nearest')
plt.show()
导入matplotlib.pyplot作为plt
将numpy作为np导入
def synthimage():
w、 h=300200
im=np.random.randint(0255,(w,h,3))/255
xa=np.random.randint(50,w-60)
xb=xa+np.random.randint(50,90)
ya=np.random.randint(50,h-60)
yb=ya+np.random.randint(20,50)
im[xa:xb,ya]=np.数组([1,0,0])
im[xa:xb,yb]=np.数组([1,0,0])
im[xa,ya:yb]=np.数组([1,0,0])
im[xb,ya:yb]=np.数组([1,0,0])
返回即时消息
def getRectPoints(im):
x、 y=[],[]
对于范围内的i(im.shape[0]):
对于范围内的j(im.形状[1]):
如果(im[i,j]-np.数组([1,0,0]).sum()==0:
x、 附加(i)
y、 附加(j)
返回np.array(x),np.array(y)
def去噪(x,y):
nx,ny=[],[]
对于范围内的i(x.shape[0]):
d=np.sqrt((x[i]-x)**2+(y[i]-y)**2)
m=d2:
追加(x[i])
附加(y[i])
返回np.array(nx),np.array(ny)
im=synthimage()
plt.imshow(np.swapaxes(im,0,1),原点='lower',插值='nearest')
plt.show()
x、 y=getRectPoints(im)
plt.散射(x,y,c='red')
plt.xlim(0300)
plt.ylim(0200)
plt.show()
nx,ny=去噪(x,y)
plt.散射(nx,ny,c='red')
plt.xlim(0300)
plt.ylim(0200)
plt.show()
#假设矩形没有旋转(否则请选中Scipy CONVOHULL)
xmi=nx.min()
xma=nx.max()
ymi=ny.min()
yma=ny.max()
新=np.ones(im.shape)
新的[xmi:xma,ymi:yma]=im[xmi:xma,ymi:yma]
plt.imshow(np.swapax(新的,0,1),原点='lower',插值='nearest')
plt.show()
,函数的名称应该是自解释的。为本次演习的目的生成了合成数据。结果如下(按顺序):


显然,这些步骤中的每一步都可以根据需求进行更改,但对于大多数案例研究来说,这是一个功能解决方案。

这并不简单,但这是一个可能的方法:

import matplotlib.pyplot as plt
import numpy as np

def synthimage():
    w,h = 300,200
    im = np.random.randint(0,255,(w,h,3))/255
    xa = np.random.randint(50,w-60)
    xb = xa + np.random.randint(50,90)
    ya = np.random.randint(50,h-60)
    yb = ya + np.random.randint(20,50)
    im[xa:xb,ya] = np.array([1,0,0])
    im[xa:xb,yb] = np.array([1,0,0])
    im[xa,ya:yb] = np.array([1,0,0])
    im[xb,ya:yb] = np.array([1,0,0])
    return im

def getRectPoints(im):
    x,y = [],[]
    for i in range(im.shape[0]):
        for j in range(im.shape[1]):
            if (im[i,j]-np.array([1,0,0])).sum()==0:
                x.append(i)
                y.append(j)
    return np.array(x),np.array(y)

def denoise(x,y):
    nx,ny = [],[]
    for i in range(x.shape[0]):
        d = np.sqrt((x[i]-x)**2+(y[i]-y)**2)
        m = d<2
        if len(m.nonzero()[0])>2:
            nx.append(x[i])
            ny.append(y[i])
    return np.array(nx),np.array(ny)

im = synthimage()    
plt.imshow(np.swapaxes(im,0,1),origin='lower',interpolation='nearest')
plt.show()

x,y = getRectPoints(im)
plt.scatter(x,y,c='red')
plt.xlim(0,300)
plt.ylim(0,200)
plt.show()

nx,ny = denoise(x,y)
plt.scatter(nx,ny,c='red')
plt.xlim(0,300)
plt.ylim(0,200)
plt.show()

#Assuming rectangle has no rotation (otherwise check Scipy ConveHull)
xmi = nx.min()
xma = nx.max()
ymi = ny.min()
yma = ny.max()

new = np.ones(im.shape)
new[xmi:xma,ymi:yma] = im[xmi:xma,ymi:yma]
plt.imshow(np.swapaxes(new,0,1),origin='lower',interpolation='nearest')
plt.show()
导入matplotlib.pyplot作为plt
将numpy作为np导入
def synthimage():
w、 h=300200
im=np.random.randint(0255,(w,h,3))/255
xa=np.random.randint(50,w-60)
xb=xa+np.random.randint(50,90)
ya=np.random.randint(50,h-60)
yb=ya+np.random.randint(20,50)
im[xa:xb,ya]=np.数组([1,0,0])
im[xa:xb,yb]=np.数组([1,0,0])
im[xa,ya:yb]=np.数组([1,0,0])
im[xb,ya:yb]=np.数组([1,0,0])
返回即时消息
def getRectPoints(im):
x、 y=[],[]
对于范围内的i(im.shape[0]):
对于范围内的j(im.形状[1]):
如果(im[i,j]-np.数组([1,0,0]).sum()==0:
x、 附加(i)
y、 附加(j)
返回np.array(x),np.array(y)
def去噪(x,y):
nx,ny=[],[]
对于范围内的i(x.shape[0]):
d=np.sqrt((x[i]-x)**2+(y[i]-y)**2)
m=d2:
追加(x[i])
附加(y[i])
返回np.array(nx),np.array(ny)
im=synthimage()
plt.imshow(np.swapaxes(im,0,1),原点='lower',插值='nearest')
plt.show()
x、 y=getRectPoints(im)
plt.散射(x,y,c='red')
plt.xlim(0300)
plt.ylim(0200)
plt.show()
nx,ny=去噪(x,y)
plt.散射(nx,ny,c='red')
plt.xlim(0300)
plt.ylim(0200)
plt.show()
#假设矩形没有旋转(否则请选中Scipy CONVOHULL)
xmi=nx.min()
xma=nx.max()
ymi=ny.min()
yma=ny.max()
新=np.ones(im.shape)
新的[xmi:xma,ymi:yma]=im[xmi:xma,ymi:yma]
plt.imshow(np.swapax(新的,0,1),原点='lower',插值='nearest')
plt.show()
,函数的名称应该是自解释的。为本次演习的目的生成了合成数据。结果如下(按顺序):


显然,每个步骤都可以根据需求进行更改,但对于大多数案例研究来说,这是一个功能解决方案。

我认为是这样。你能在这里举一些长方形图片的例子吗?不,我想是的。你能在这里举一些矩形图像的例子吗?不,它很自信:\