我正在遵循有关基本图像处理的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
发生了什么
答案 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
的灰度图像(或数组),其值在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
。
希望有帮助!
答案 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
数组中的值,以及该值表示的值(计数了我们看到该像素值的次数)。