直方图的计算
图像直方图是图像中像素强度分布的图形表示。 它显示了图像有多少像素具有一定的强度值(颜色或亮度)。
为什么要计算直方图?
直方图允许您分析照明,调整图像的对比度,亮度,突出显示对象,平衡颜色并提高可视化质量。
直方图允许您估计图像的亮暗程度。:
如果像素在左侧"拥挤"(低强度),则图像太暗。
如果像素向右"拥挤"(高强度),则图像过度曝光。
我们连接处理图像所需的软件包
In [ ]:
import Pkg
Pkg.add("Images")
Pkg.add("StatsBase")
Pkg.add("Plots")
In [ ]:
using Images, StatsBase, Plots
上传图片
In [ ]:
path_to_img_1 = "$(@__DIR__)/Cozy_Autumn_Beverage_Moment.jpeg";
In [ ]:
Image_1 = load(path_to_img_1)
Out[0]:
资料处理
channelview 将图像转换为一个数组,其中每个颜色通道(红色,绿色和蓝色)成为一个单独的图层。
In [ ]:
rgb_planes = channelview(Image_1);
接下来,我们将颜色通道分解为单独的变量
In [ ]:
blue_channel = rgb_planes[3, :, :]
green_channel = rgb_planes[2, :, :]
red_channel = rgb_planes[1, :, :];
可视化一个单独的通道
In [ ]:
red_image = colorview(RGB, red_channel, zeros(size(red_channel)), zeros(size(red_channel)))
Out[0]:
直方图的计算
In [ ]:
red_channel
Out[0]:
在上面的单元格中,我们看到每个像素的图像红色通道的强度值数组。
首先,我们将强度分解为范围。 例如,对于归一化数据
[0,1],它们被表示
这里,可以使用256个等间隔。 然后我们计算有多少像素落入每个范围。
将单元格数量设置为256
In [ ]:
histSize = 256;
设置值的范围(从0到1)
In [ ]:
hist_range = 0:1/(histSize-1):1;
让我们开始计算直方图。 StatsBase.Histogram 允许您计算直方图
In [ ]:
b_hist = fit(Histogram, blue_channel[:], hist_range)
r_hist = fit(Histogram, red_channel[:], hist_range)
g_hist = fit(Histogram, green_channel[:], hist_range);
可视化
我们将计算出的直方图可视化,以便对强度分布进行视觉评估。
In [ ]:
plot(r_hist.edges[1][1:end-1], r_hist.weights, color=:red, label="Red Channel")
plot!(b_hist.edges[1][1:end-1], b_hist.weights, color=:blue, label="blue Channel")
plot!(g_hist.edges[1][1:end-1], g_hist.weights, color=:green, label="green Channel")
Out[0]:
从上图中可以看到,强度方面的大部分像素位于图的左侧,这表明图像变暗了。
结论
在这个例子中,计算像素强度的直方图来估计图像的亮度。

