Python & Numpy - Поиск режима значений в массиве, которые не равны нулю - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть массив Numpy (это красный канал изображения).

Я замаскировал его часть (делая эти значения 0), и теперь я хотел бы найти режим значения в моей немаскированной области.

Проблема, с которой я сталкиваюсь, состоит в том, что команда Mode продолжает возвращаться с [0]. Я хочу исключить 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 или замаскированную область?

Обновление - Полный код:

Вот мой полный код с использованием "face" из scipy.mis c - все еще кажется медленным с этим изображением, и в результате получается «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)

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы можете просто замаскировать массив и использовать np.histogram:

counts, bins = np.histogram(mR[mR>0], bins=np.arange(256))

# mode
modeR = np.argmax(counts)
0 голосов
/ 26 апреля 2020

Обновление:

После того, как ОП любезно разместил свой полный код, я могу подтвердить, что stats.mode() либо чрезвычайно медленный, либо никогда не завершается (кто знает почему?).

С другой стороны, решение @Quang Hoang такое же элегантное, как и быстрое, и оно также работает для меня с точки зрения соблюдения маски.

Поэтому я, конечно, бросаю свой вес за ответ QH .

Мой старый ответ:

Попробуйте

print(stats.mode(mR[mask],axis=None))

За исключением маскирования, эффективный расчет режима массива numpy покрыт здесь:

Самый эффективный способ найти режим в numpy массиве

...