Cv2.CountNonZero возвращает неожиданный результат - PullRequest
0 голосов
/ 29 апреля 2020

Я использую библиотеку OpenCvSharp в C# для выполнения вычислений, связанных с OpenCV.

Учитывая некоторые изображения, я хочу сложить их аналогично в этом учебном пособии , затем подсчитать ненулевые пиксели в кадрах и результирующее изображение. Эти числа будут использоваться для обнаружения перекрытия и определения другого значения.

Я получил 3 изображения, кадр 0, кадр 1 и результат:

enter image description here

Содержимое результирующего изображения действительно является кадром 0 + кадр 1, в данном случае без наложения чего-либо, так что число ненулевых пикселей должно удовлетворять c_r = c_f0 + c_f1, где c_f0 = 356, c_f1 = 362 К сожалению, вычисленное значение c_r равно 530. В чем может быть причина?

Я использую тот же метод, чтобы показывать, сохранять, вычислять значения на изображениях:

Cv2.CvtColor(inputImage, gray, ColorConversionCodes.RGB2GRAY);
var pixels = Cv2.CountNonZero(gray);
Console.WriteLine(pixels);
Cv2.ImWrite(fileName, gray);
Cv2.ImShow("i", gray);
Cv2.WaitKey();

Начиная с gray является вновь созданным изображением, не может быть проблем с его базовой ссылкой (в противном случае я не смогу увидеть / сохранить реальные изображения). Почему Cv2.CountNonZero(gray); дал бы мне такой результат?

1 Ответ

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

Одним из возможных объяснений этого поведения может быть: Поскольку ваши изображения не являются строгими двоичными изображениями (изображения, имеющие только значения 0 и 255), возможно, что могут быть некоторые значения пикселей, которые выглядят черными, но не являются точно нулевыми. Давайте объясним это на примере. Предположим, у нас есть матрица серой шкалы 3x1 со значениями: [255, 1, 0]. Так что визуально может показаться, что у него только один белый пиксель и все остальные черные пиксели.

Теперь давайте возьмем другой пример с двумя матрицами: Matrix1: [255, 1, 0] и Matrix2: [0, 1, 255], когда мы добавим оба Матрицы получим: [255, 2, 255]. Теперь мы вычисляем ноль пикселей в приведенных выше матрицах:

cv2.countNonZero(matrix_1) = 2
cv2.countNonZero(matrix_2) = 2
cv2.countNonZero(matrix_1_2) = 3

Теперь, как вы можете видеть cv2.countNonZero(matrix_1) + cv2.countNonZero(matrix_2) != cv2.countNonZero(matrix_1_2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...