【问题标题】:Getting a 2D histogram of a grayscale image in Julia在 Julia 中获取灰度图像的二维直方图
【发布时间】:2014-12-16 20:16:18
【问题描述】:

使用 Images 包,我可以打开彩色图像,将其转换为灰度,然后:

using Images
img_gld = imread("...path to some color jpg...")
img_gld_gs = convert(Image{Gray},img_gld)
#change from floats to Array of values between 0 and 255:
img_gld_gs = reinterpret(Uint8,data(img_gld_gs))

现在我有一个 1920X1080 的 Uint8 数组:

julia> img_gld_gs 
1920x1080 Array{Uint8,2}

现在我想获得 Uint8 值的二维数组的直方图:

julia> hist(img_gld_gs)
(0.0:50.0:300.0,
6x1080 Array{Int64,2}:
 1302  1288  1293  1302  1297  1300  1257  1234  …    12    13    13    12    13    15    14
  618   632   627   618   623   620   663   686      189   187   187   188   185   183   183
    0     0     0     0     0     0     0     0        9     9     8     7     8     7     7
    0     0     0     0     0     0     0     0       10    12     9     7    13     7     9
    0     0     0     0     0     0     0     0     1238  1230  1236  1235  1230  1240  1234
    0     0     0     0     0     0     0     0  …   462   469   467   471   471   468   473)

但是,我希望直方图中的 256 个位置显示每个值出现的总次数,而不是 6x1080。我试过了:

julia> hist(img_gld_gs,256)

但这给出了:

(2.0:1.0:252.0,
250x1080 Array{Int64,2}:

所以不是 256x1080 数组,而是 250x1080。有什么方法可以强制它拥有 256 个 bin(无需编写我自己的 hist 函数)?我希望能够比较不同的图像,并且希望每个图像的直方图具有相同数量的 bin。

【问题讨论】:

    标签: image-processing julia


    【解决方案1】:

    假设您想要整个图像的直方图(而不是每行一个),您可能想要

    hist(vec(img_gld_gs), -1:255)
    

    首先将图像转换为一维向量。 (您也可以使用img_gld_gs[:],但会复制数据。)

    还要注意这里的范围:hist 函数使用左开区间,因此除非您使用小于 0 的值,否则它将省略计数零。

    【讨论】:

    • @tholy 好点。还不确定,但可能需要每行的直方图进行图像比较 - 必须尝试使用​​ EMD 来查看哪个可以提供更好的比较。另外,我想我会想要: hist(vec(img_gld_gs),0:255) 为什么上面的 -1?
    • @tholy: 哦,我明白你为什么要做-1了。
    【解决方案2】:

    hist 也接受向量(或范围)作为指定边边界的可选参数,所以

    hist(img_gld_gs, 0:256)
    

    应该可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多