我正在尝试从包文档中复制下面的示例。但是,在用“disk(2)”或“disk(10)”调整“足迹”参数(在skimage.filters.rank's熵函数中)之后,每次我都会得到一个模糊的图像。文档声明‘邻域’表示为1‘s和0’s的ndarray,但是“足迹”参数以像素和熵公式表示什么呢?
import matplotlib.pyplot as plt
import numpy as np
from skimage import data
from skimage.util import img_as_ubyte
from skimage.filters.rank import entropy
from skimage.morphology import disk
rng = np.random.default_rng()
noise_mask = np.full((128, 128), 28, dtype=np.uint8)
noise_mask[32:-32, 32:-32] = 30
noise = (noise_mask * rng.random(noise_mask.shape) - 0.5
* noise_mask).astype(np.uint8)
img = noise + 128
#entr_img = entropy(img, disk(2)) # try another 'Footprint'
#entr_img = entropy(img, disk(5)) # try another 'Footprint'
entr_img = entropy(img, disk(10))
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3, figsize=(10, 4))
img0 = ax0.imshow(noise_mask, cmap='gray')
ax0.set_title("Object")
ax1.imshow(img, cmap='gray')
ax1.set_title("Noisy image")
ax2.imshow(entr_img, cmap='viridis')
ax2.set_title("Local entropy")
fig.tight_layout()示例链接:entropy.html
Skimage.filters.rank.entropy的文档:https://scikit-image.org/docs/dev/api/skimage.filters.rank.html#skimage.filters.rank.entropy
发布于 2022-02-25 19:03:14
我现在正面临着你同样的问题。我试图查看skimage中的原始函数,但是它指向cython中的代码,而且我不擅长编码,所以只能猜测。
我的假设是:足迹是计算局部熵时相邻像素的范围。正如skimage中的这个页面所介绍的,disk(X)生成一个半径等于X+1 (包括质心)的类似磁盘的范围。
elements.html#sphx-glr-auto-examples-numpy-operations-plot-structuring-elements-py
为了检验这一假设,我们知道图像的熵被计算为:
如果只有一个像素(例如磁盘( 0 )),则pF(i)=1,log2(pF(i))=0,熵总是等于0。
所以我尝试了熵(图像,footprint=disk( 0 )),正如我所预期的,结果图像中的任何地方都等于0。
希望这能帮到你。(虽然我不能百分之百肯定这个答案。)
添加:我后来测试了占用=磁盘(1)的情况。正如我所假设的,磁盘(1)包含5个像素,最大熵是:
5* (-0.2 * log2(0.2)) = 2.32192809 (当5个像素都有不同的灰度)
正如我所预期的,得到的熵图像的最大值为2.32192809。
https://stackoverflow.com/questions/70264155
复制相似问题