将中心像素值复制到块中的多数值

Lis*_*hew 4 python numpy image-processing

我有一个大小为 9085x10852 的图像像素预测数组。我想在每个像素周围得到一个 10x10 的块。如果中心像素值与块中的多数像素值不同,则用多数值替换中心像素值。谁能帮我吗

Mar*_*ell 6

我今天正在四处scikit-image寻找其他东西,如果你深入挖掘scikit-image.filters,然后进一步挖掘rank,你就会发现modal()请参阅此处的文档。

我使用与 @Tonechas 相同的随机种子来生成可比较的结果:

import numpy as np
from skimage.morphology import rectangle   # for Structuring Elements (e.g. disk, rectangle)
from skimage.filters.rank import modal     # the puppy we want

# Same seed for directly comparable results
np.random.seed(329)

# Sample array/image
arr = np.random.randint(low=0, high=10, size=(6, 8), dtype=np.uint8)

# Run the filter with a 5x5 rectangular Structuring Element
result = modal(arr,rectangle(5,5))

print(result)

array([[9, 2, 0, 0, 0, 2, 4, 5],
       [1, 1, 0, 0, 0, 2, 5, 2],
       [1, 1, 0, 5, 5, 5, 5, 5],
       [1, 1, 1, 5, 5, 5, 4, 5],
       [1, 1, 1, 1, 5, 5, 4, 5],
       [1, 1, 5, 5, 5, 5, 4, 4]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

关键词:Python、numpy、scikit、skimage、图像处理、处理图像、中值、众数、模态、结构元素、形态、滤波器、滤波器、等级。


Mar*_*ell 5

由于您似乎对问题的细节有点不确定/不一致,我想建议一个非常简单的替代解决方案,不是用 Python 编写的,但对于评论来说太大了,它可以帮助您和其他人探索您是否真的想要这个以及什么你真正想要的——在任何人花几个小时编写 Python 代码之前。

我建议您使用ImageMagick,它安装在大多数 Linux 发行版上,并且适用于 macOS 和 Windows。因此,只需在Terminal中,您就可以制作一个黑色的示例图像,中间有一个白色方块,如下所示:

convert -size 100x100 xc:black -fill white -draw "rectangle 10,10 90,90" test.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在尝试你的过滤器,你可以看到角是圆角的:

convert test.png -statistic mode 10x10 result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在用更大的“半径”再试一次:

convert test.png -statistic mode 20x20 result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

也许你可以尝试一下,看看它是否能达到你想要的效果,然后再有人浪费太多时间编码。