为了账号安全,请及时绑定邮箱和手机立即绑定

从图像中提取 N 个补丁

从图像中提取 N 个补丁

慕的地8271018 2023-10-06 19:19:10
我有一个维度的图像155 x 240。就像下面这样:我想提取某些形状的补丁(25 x 25)。 我不想从整个图像中修补。我想从图像的非零(非背景)区域提取 N 个补丁。我怎样才能做到这一点?任何想法、建议或实施将不胜感激。您可以尝试使用 Matlab 或 Python。注意: 我生成了一个随机图像,以便您可以对其进行处理以进行修补。image_process变量是这段代码中的图像。import numpy as npfrom scipy.ndimage.filters import convolveimport matplotlib.pyplot as pltbackground = np.ones((155,240))background[78,120] = 2n_d = 50y,x = np.ogrid[-n_d: n_d+1, -n_d: n_d+1]mask = x**2+y**2 <= n_d**2mask = 254*mask.astype(float)image_process = convolve(background, mask)-sum(sum(mask))+1image_process[image_process==1] = 0image_process[image_process==255] = 1plt.imshow(image_process)
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

假设您要省略的像素值为 0。


在这种情况下,您可以做的是,首先找到非零值的索引,然后在 / 位置对图像进行切片min以max仅获得所需的区域,然后简单地应用extract_patches_2d所需的窗口大小和补丁数量。


例如,考虑到您提供的虚拟图像:


import numpy as np

from scipy.ndimage.filters import convolve

import matplotlib.pyplot as plt


background = np.ones((155,240))

background[78,120] = 2

n_d = 50

y,x = np.ogrid[-n_d: n_d+1, -n_d: n_d+1]

mask = x**2+y**2 <= n_d**2

mask = 254*mask.astype(float)



image_process = convolve(background, mask)-sum(sum(mask))+1

image_process[image_process==1] = 0

image_process[image_process==255] = 1

plt.figure()

plt.imshow(image_process)

plt.show()


from sklearn.feature_extraction.image import extract_patches_2d

x, y = np.nonzero(image_process)

xl,xr = x.min(),x.max()

yl,yr = y.min(),y.max()

only_desired_area = image_process[xl:xr+1, yl:yr+1]


window_shape = (25, 25)

B = extract_patches_2d(only_desired_area, window_shape, max_patches=100)  # B shape will be (100, 25, 25)

如果绘制它,only_desired_area您将得到以下图像:

https://img1.sycdn.imooc.com//651feda600019d8a06200457.jpg

这是主要逻辑,如果您希望更紧的边界,您应该适当调整切片。



查看完整回答
反对 回复 2023-10-06
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信