直方图计算中的数组更改值逻辑

时间:2019-06-12 02:45:26

标签: python arrays opencv image-processing

我正在遵循有关基本图像处理的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 个答案:

答案 0 :(得分:1)

请记住,直方图会计算您在图像中看到强度的次数。基本操作是遍历每个像素,然后查看其值,然后记录下我们看到该像素并增加计数。

从一个简单的例子开始。假设我的图片包含:

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。

答案 1 :(得分:0)

开头,您的image是大小为width x height x No. color channels的数组。 “ Lenna”图像主要是正方形的三通道(“彩色”)图像,因此,假设您的image的大小为200 x 200 x 3

然后,您使用特定的luma公式执行手动的颜色到灰度转换。最后,您的y是大小为width x height的灰度图像(或数组),其值在0255之间。

现在,对于i = 5j = 6之类的特定“图像坐标”,您可以像这样y访问y[i,j]中的像素/强度值。假设该位置的值为124

您的hist向量具有256个元素,可以从0255的索引进行访问,这完全适合我们上面的像素/强度值。并且,y的所有条目都以0开头。

现在,我们要遍历整个图像:

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

i0199。对于每个ij也从0199,覆盖了图像中的所有像素。

在循环内部,我们获得位置(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

希望有帮助!

答案 2 :(得分:0)

为了便于阅读,我会像这样重写您的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数组中的值,以及该值表示的值(计数了我们看到该像素值的次数)。