首页 > 解决方案 > 如何有效地识别 numpy 数组中的“类似 HSV-to-neightbours”像素?

问题描述

我的图像(np.array形状[Y] [X] [RGB]包含字形图形,形成类似 HSL 像素的区域。例如(放大):

在此处输入图像描述

我正在尝试识别文本的 HSL 值。

将所有像素扔到 scikit 中kmeans 可能会奏效,因为它会返回集群。

但是我需要效率。如果我可以首先将像素集限制为“具有 8 个相似 HSL 邻居的像素集”,这将显着提高性能。

就像是:

hsv = cv2.cvtColor(S, cv2.COLOR_RGB2HSV)
hues = hsv[:,:,0]

THRESH = 3
isclose = lambda hues_matrix_A, hues_matrix_B): \
    np.abs(hues_matrix_B - hues_matrix_A) < THRESH
mask = 
    is_close(hues, np.roll(hues,-1, axis=0)) & 
    is_close(hues, np.roll(hues,+1, axis=0)) & 
    is_close(hues, np.roll(hues,-1, axis=1)) & 
    is_close(hues, np.roll(hues,+1, axis=1)) 

那就是上/下/左/右邻居,它已经很丑了。理想情况下,我也会对对角线邻居进行测试,但这将涉及 2-axis- roll

top_left_neighbour = np.roll(np.roll(hues,-1, axis=1),-1, axis=0)

哎呀。是否有适合这项工作的工具?界面可能如下所示:

mask = proximity_mask(src=hues_matrix, kernel=np.ones((3,3)), proximity=3)

如果没有,什么是智能建筑?

标签: pythonnumpyopencvimagefilter

解决方案


从 numpy 1.20+ 你有slip_window_view

# size will be 1-pixel less on each side
hue_nbhds = np.lib.stride_tricks.sliding_window_view(
    hue, (3,3)
)

# reshape to 3D
hue_nbhds = hue_nbhds.reshape(*hue_nbhds.shape[:2], -1)

# 
mask = (np.abs(hue_nbhds - hue[1:-1,1:-1, None]) < 3).all(-1)

但是你并没有真正从面具中得到太多:

在此处输入图像描述


推荐阅读