什么是直方图
直方图是一种图表类型,在计算机视觉领域通常用来指反映图片的亮度,色彩,强度在整个图片里面的分布情况。直方图我们可以理解成另一种理解图片的方式。
直方图可以是彩色的图片,也可以是灰度图,直方图的X轴的范围是(0-255),Y轴则是不同像素值上,像素的数量,如果是彩色的图片Y轴则会有R,G,B三种像素展示,如果是灰度值则只有一种像素展示。
一些术语
BINS: 默认情况直方图是显示0-255范围内每个像素值的像素的数量,当然我们也可以设置一个个区间来统计这个区间内的像素值的数量,比如(0-15),(16-31),(240-255) 例子连接 这里面的16个单独的区间都可以叫做一个BIN(英文箱子的意思)
DIMS: 维度,它代表收集颜色通道的个数,如果是灰度图这个值就是1,如果一个彩色图那么DIMS就是3
RANGE: 代表你想测量亮度的范围,正常下是[0-255]代表所有的像素值
使用方法
直方图可以通过opencv的内置的函数来展示,也可以通过numpy的函数来展示,这里推荐使用numpy来打印直方图,opencv内置的方法代码比较长,所以大多数时候都建议使用numpy的函数来展示,代码如下:
#
-
*
-
coding
:
utf
-8
-
*
-
import
matplotlib
.
pyplot
as
plt
import
numpy
as
np
import
cv2
as
cv
""
" 打印一个灰度图片的直方图
""
" img
=
cv
.
imread
(
'E:\\tmp\\cat.jpg'
)
cv
.
imshow
(
"orgin"
,
img
)
def
gray_histogram
(
)
:
""
" 灰度图
:
return
:
""
" # ravel方法代表返回一个连续扁平化的数组 # hist参数:数组,bin数量,像素值范围 gray
=
cv
.
cvtColor
(
img
,
cv
.
COLOR_BGR2GRAY
)
plt
.
hist
(
gray
.
ravel
(
)
,
256
,
[
0
,
256
]
)
def
color_histogram
(
)
:
""
" 彩色图
:
return
:
""
" # 蓝 绿 红 color
=
(
'b'
,
'g'
,
'r'
)
for
i
,
col
in
enumerate
(
color
)
:
histr
=
cv
.
calcHist
(
[
img
]
,
[
i
]
,
None
,
[
256
]
,
[
0
,
256
]
)
plt
.
plot
(
histr
,
color
=
col
)
plt
.
xlim
(
[
0
,
256
]
)
gray_histogram
(
)
#
color_histogram
(
)
plt
.
show
(
)
cv
.
waitKey
(
0
)
(1)原图
(2)灰度直方图
(3)彩色直方图
直方图的意义
在计算机视觉领域,常常要处理各种各样的图片,通过观察图片的直方图,可以使我们在加工图片时更加合理的调整一些函数的参数,比如边缘检测,高斯模糊,切割,透视,二值化等等。
参考文档: