Для начала режим L
в Image.open(visualFilename).convert("L")
не преобразует изображение в черно-белое, а преобразует изображение в шкалу серого с использованием следующей формулы:
L = R *299/1000 + G * 587/1000 + B * 114/1000
Будучи R, G и B, красным, зеленым и синим соответственно
Эта формула распространяется на изображение иизменить 3-канальный пиксель RGB на 1-канальный пиксель (серая шкала), который наилучшим образом соответствует 3-канальной цветовой схеме.И именно поэтому в конце вы не получаете только значения 0 и 255. Вместо этого вы получаете пиксель со значениями в диапазоне от 0 до 255.
Для сравнения сначала всех черных пикселей между двумя изображениями серой шкалыВы должны определить, что на самом деле означает черный.Является ли значение, например, 10 черным достаточно или 25 уже черный для вас?Вы должны помнить, что цвет не является абсолютным, и его значение может меняться в зависимости от того, что вы делаете.
Поэтому способ обойти это - установить порог, в котором вы будете определять «что для вас черное».Использовать простую функцию Threshold.Итак, я думаю, что этот простой код может решить вашу проблему:
import numpy as np
def threshold(array, th=50, above_to_max = False):
#check type numpy
if type(array) is np.ndarray:
#Creates a copy to not mess with original
array = array.copy()
#set all values below threshold to 0
array[array<=th] = 0
if above_to_max:
#set all values above threshold to 0
array[array>th] = 255
return array
else:
raise Exception("Array must be a numpy array")
#Example images
image1 = [[ 0, 5, 10, 15, 20],
[ 25, 30, 35, 40, 45],
[ 50, 55, 60, 65, 70],
[175,180,185,190,195],
[200,210,215,240,255]]
image2 = [[ 5, 5, 110, 5, 0],
[ 25, 30, 35, 0, 15],
[150, 55, 60, 65, 70],
[275,280,285,290,295],
[ 20, 10, 15,240,255]]
#Transform to array
array1 = np.asarray(image1, dtype=np.uint8)
array2 = np.asarray(image2, dtype=np.uint8)
#Apply threshold
tsh_array1 = threshold(array1)
tsh_array2 = threshold(array2)
print(' Array1\n', array1, '\n', 'Thresholded1\n',tsh_array1,'\n' )
print(' Array2\n', array2, '\n', 'Thresholded2\n',tsh_array2,'\n' )
equals = (tsh_array1==0)[tsh_array2==0]
print("Number of pixels in the same position equal to zero: {}".format(sum(equals)))
Этот код отображает следующее:
Array1
[[ 0 5 10 15 20]
[ 25 30 35 40 45]
[ 50 55 60 65 70]
[175 180 185 190 195]
[200 210 215 240 255]]
Thresholded1
[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 55 60 65 70]
[175 180 185 190 195]
[200 210 215 240 255]]
Array2
[[ 5 5 110 5 0]
[ 25 30 35 0 15]
[150 55 60 65 70]
[ 19 24 29 34 39]
[ 20 10 15 240 255]]
Thresholded2
[[ 0 0 110 0 0]
[ 0 0 0 0 0]
[150 55 60 65 70]
[ 0 0 0 0 0]
[ 0 0 0 240 255]]
Number of pixels in the same position equal to zero: 9
РЕДАКТИРОВАТЬ:
Давайте лучше посмотрим на следующую строку: (tsh_array1==0)[tsh_array2==0]
(tsh_array1==0)
возвращает массив той же формы, что и tsh_array1
со значением True
в позиции 0значение и False
в противном случае
[tsh_array2==0]
- это то же самое, что и условие where.Он фильтрует предыдущий элемент, где tsh_array2==0
В результате получается массив, который выглядит следующим образом:
[ True True True True True True True True True False False False False False False False False]
Поскольку значение True равно 1, суммаэтого массива вернет число нулей в одной позиции в двух массивах
Надеюсь, это помогло!