我有一个Numpy数组(它是图像中的红色通道)。
我已经屏蔽了其中的一部分(使这些值为0),现在我想在我的非蒙面区域中找到值的模式。
我遇到的问题是,Mode命令总是带回来。我想排除0值(蒙面区域),但我不知道如何做到这一点?
这是我用来尝试获取模式的命令:
#mR is the Numpy Array of the Red channel with the values of the areas I don't want at 0
print(stats.mode(mR[:, :], axis=None))
返回0作为我的模式。如何排除0或蒙面区域?
更新-完整代码:
这是我使用来自scipy.misc的"face“的完整代码--对该图像的处理仍然很慢,结果是"107”,这对于蒙面区域(阴影)来说是很高的,所以看起来它处理的是整个图像,而不仅仅是掩码中的区域。
import cv2
import numpy as np
from scipy import stats
import scipy.misc
img = scipy.misc.face()
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
r, g, b = cv2.split(img_rgb)
img_lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l_channel ,a_channel, b_channel = cv2.split(img_lab)
mask = cv2.inRange(l_channel, 5, 10)
cv2.imshow("mask", mask)
print(stats.mode(r[mask],axis=None))
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
发布于 2020-04-26 04:13:49
您只需屏蔽数组并使用np.histogram
。
counts, bins = np.histogram(mR[mR>0], bins=np.arange(256))
# mode
modeR = np.argmax(counts)
发布于 2020-04-26 04:00:30
更新:
在OP友好地发布了它们的完整代码之后,我可以确定stats.mode()
要么非常慢,要么永远没有完成(谁知道为什么呢?)
另一方面,@Quang的解决方案既优雅又快捷--而且它在尊重面具方面也适用于我。
因此,我当然支持QH的回答。
我以前的答案是:
试一试
print(stats.mode(mR[mask],axis=None))
除了掩蔽之外,下面还详细讨论了有效计算numpy数组的模式:
https://stackoverflow.com/questions/61435595
复制相似问题