opencv 使用联合像素组的最大值调整图像遮罩大小(收缩)

s5a0g9ez  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(162)

我想调整大小,特别是缩小遮罩(1和0的2D数组),以便低分辨率遮罩中Map到高分辨率遮罩(原始)中至少包含一个值1的一组像素的任何像素本身都将被设置为1(底部的示例)。
我已经尝试使用cv2.inter_MAX来使用cv2.resize(),但它返回了一个错误:
错误代码:OpenCV(4.6.0)/io/opencv/模块/imgproc/源代码/大小调整。cpp:3927:错误:(-5:参数错误)函数“resize”中的插值方法未知
它似乎没有枕头图像或scipy有一个插值方法这样做。
我正在寻找已定义shrink_max()的解决方案

>>> orig_mask = [[1,0,0],[0,0,0],[0,0,0]]
>>> orig_mask
[[1,0,0]
,[0,0,0]
,[0,0,0]]
>>> mini_mask = shrink_max(orig_mask, (2,2))
>>> mini_mask
[[1,0]
,[0,0]]
>>> mini_mask = shrink_max(orig_mask, (1,1))
>>> mini_mask
[[1]]
gz5pxeao

gz5pxeao1#

我不知道有没有直接的方法,但可以尝试将遮罩缩小到一半大小,即每个低分辨率像素Map到4个原始像素(根据需要修改为任何比例):

import numpy as np

orig_mask = np.array([[1,0,0],[0,0,0],[0,0,0]])

# first make the original mask divisible by 2
pad_row = orig_mask.shape[0] % 2
pad_col = orig_mask.shape[1] % 2

# i.e. pad the right and bottom of the mask with zeros
orig_mask_padded = np.pad(orig_mask, ((0,pad_row), (0,pad_col)))

# get the new shape
new_rows = orig_mask_padded.shape[0] // 2
new_cols = orig_mask_padded.shape[1] // 2

# group the original pixels by fours and max each group 
shrunk_mask = orig_mask_padded.reshape(new_rows, 2, new_cols, 2).max(axis=(1,3))

print(shrunk_mask)

在此处检查使用子矩阵:Numpy: efficiently sum sub matrix m of M
以下是用于收缩到任何所需形状的完整函数:

def shrink_max(mask, shrink_to_shape):
    r, c = shrink_to_shape
    m, n = mask.shape
    padded_mask = np.pad(mask, ((0, -m % r), (0, -n % c)))
    pr, pc = padded_mask.shape
    return padded_mask.reshape(r, pr // r, c, pc // c).max(axis=(1, 3))

例如,print(shrink_max(orig_mask, (2,1)))会传回:

[[1]
 [0]]

相关问题