Логика изменения значения логики в расчете гистограммы - PullRequest
0 голосов
/ 12 июня 2019

Я слежу за курсом в openclassroom по базовой обработке изображений, и он в основном использует OpenCV. Есть кое-что, чего я не совсем понимаю в фрагменте кода, который должен создать гистограмму, отображающую интенсивность gray на рисунке.

В какой-то момент мы создаем вектор, и значения вектора меняются без какой-либо причины, которую я сейчас могу понять.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# we upload the picture in a matrix
image = cv.imread("Lenna.png")

# change it to gray levels in this process
b,v,r = cv.split(image)         
y = 0.299*r + 0.587*v + 0.114*b 
y = y.astype(np.uint8)          

#Ou histogram vectors
hist = np.zeros(256, int)
print(hist[y[1,10]])
# hist is obviously zero here and so is hist[y[i,j] for every
# i and j in the range below

for i in range(0,image.shape[0]):
    for j in range(0,image.shape[1]):

        # When I check hist values I see that it has changed
        # And I don't know why it changed 
        print(hist[y[1,10]])
        hist[y[i,j]] = hist[y[i,j]] + 1

#print(hist)
#plt.plot(hist)
#plt.show() 

Код работает отлично, я просто хочу понять, что происходит с моим вектором hist

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Помните, что гистограмма подсчитывает, сколько раз вы видите интенсивность на изображении. Основы заключаются в том, чтобы перебрать каждый пиксель, посмотреть его значение, а затем записать, что мы видели этот пиксель, и увеличить количество.

Начните с простого примера. Предположим, у меня есть изображение, которое содержит:

0  1  2
2  2  3
4  5  1

Гистограмма подсчитывает, сколько раз мы видим конкретное значение. В этом случае наша гистограмма будет выглядеть как массив из 6 элементов, так что каждый элемент сообщает вам, сколько раз мы видим этот элемент.

Таким образом:

# 0 1 2 3 4 5 
 [1 2 3 1 1 1]

Я поместил значение интенсивности вверху массива для иллюстрации. Для каждого значения / интенсивности в гистограмме мы видим, сколько раз мы видели это число на всем изображении. Та же самая логика применяется с вышеупомянутым фрагментом кода. Мы наблюдаем интенсивность, затем увеличиваем количество видимых на 1. Это то, что делает hist[y[i,j]] = hist[y[i,j]] + 1. Получите доступ к интенсивности в местоположении y[i,j], затем увеличьте количество для этой интенсивности на 1.

0 голосов
/ 12 июня 2019

Я бы переписал ваш цикл for следующим образом:

for i in range(0,image.shape[0]):
    for j in range(0,image.shape[1]):
        pixel_value = y[i,j]
        hist[pixel_value] += 1

Это проясняет, что вторая строка цикла for изменяет значение в массиве hist, а также что этозначение представляет (счетчик, сколько раз мы видели это значение пикселя).

0 голосов
/ 12 июня 2019

В начале ваш image является массивом размером width x height x No. color channels. Изображения «Lenna» - это в основном квадратные, трехканальные («цветные») изображения, поэтому предположим, что ваш image имеет размер 200 x 200 x 3.

После этого вы выполняете ручное преобразование цвета в оттенки серого, используя специальную формулу luma . В итоге ваше y будет изображением в градациях серого (или массивом) размером width x height со значениями от 0 до 255.

Теперь для конкретных «координат изображения», таких как i = 5 и j = 6, вы можете получить доступ к значению пикселя / интенсивности в y, например: y[i,j]. Допустим, значение в этой позиции составляет 124.

Ваш hist вектор имеет 256 элементов, к которым можно получить доступ по индексам от 0 до 255, что идеально соответствует нашим значениям пикселя / интенсивности выше. И все записи y в начале 0.

Теперь мы выполняем итерацию по всему изображению:

for i in range(0, image.shape[0]):
    for j in range(0, image.shape[1]):

i идет от 0 до 199. И для каждого i, j также идет от 0 до 199, покрывая все пиксели в нашем изображении.

Внутри цикла мы получаем значение пикселя / интенсивности в позиции (i,j), как показано выше: y[i,j]. Допустим, это 124. Затем мы получаем доступ к соответствующей записи в hist, то есть hist[y[i,j]] совпадает с hist[124].

Наконец, мы увеличиваем соответствующую запись в hist на 1, поэтому раньше hist[124] было 0, а теперь hist[124] становится 1.

В конце вы подсчитываете, как часто каждый пиксель / значение интенсивности появляется на вашем изображении y. Итак, hist[124] может быть 1452, когда вся рутина завершена.

Надеюсь, это поможет!

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