gpt4 book ai didi

c++ - Armadillo 移植 imagesc 从矩阵保存图像位图

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:41 28 4
gpt4 key购买 nike

我有这个 matlab 代码来显示 super 频谱图后的图像对象(stft,耦合 plca ...)

 t = z2 *stft_options.hop/stft_options.sr;
f = stft_options.sr*[0:size(spec_t,1)-1]/stft_options.N/1000;

max_val = max(max(db(abs(spec_t))));
imagesc(t, f, db(abs(spec_t)),[max_val-60 max_val]);

得到这个结果:

enter image description here

我使用 Armadillo 成功地移植到 C++ lib 并得到 mat 结果:

mat f,t,spec_t;

问题是我不知道如何转换像 imagesc 这样的位图在 MATLAB 中。

我搜索并找到了this answer ,但在我的情况下似乎不起作用,因为:

  • 我使用 double 矩阵而不是整型矩阵,不能标记为位图颜色
  • imagesc 方法接受 4 个参数,其边界为 vector x 和 y
  • imagesc 方法也支持缩放(我其实不知道它是如何工作的)


有人有什么建议吗?

更新:这是 Armadillo 中save方法的结果。它看起来不像上面的频谱图图像。我错过了什么吗?

spec_t.save("spec_t.png", pgm_binary); 

enter image description here

更新 2:使用 dbabs 保存频谱图

  mat spec_t_mag = db(abs(spec_t)); // where db method: m = 10 * log10(m);
mag_spec_t.save("mag_spec_t.png", pgm_binary);

结果:

enter image description here

最佳答案

Armadillo 是一个线性代数包,据我所知它不提供图形例程。如果你对这些使用类似 opencv 的东西,那么它真的很简单。

参见 this link关于 opencv 的 imshow() , 和 this link关于如何在程序中使用它。

请注意,opencv(与大多数其他库一样)使用行优先索引 (x,y),而 Armadillo 使用列优先(行、列)索引,如 here 所述。 .

对于缩放,最安全的方法是自己转换为 unsigned char。在 Armadillo 中,这将是这样的:

arma::Mat<unsigned char> mat2=255*(mat-mat.min())/(mat.max()-mat.min());

tf变量用于设置轴,它们不是位图的一部分。

如果只是写一张图片,你可以使用 Armadillo。 Here是关于如何编写可移植灰度图 (PGM) 和可移植像素图 (PPM) 图像的说明。 PGM 导出仅适用于 2D 矩阵,PPM 导出仅适用于 3D 矩阵,其中第 3 维(尺寸 3)是红色、绿色和蓝色的 channel 。

你的 matlab 图看起来更漂亮的原因是因为它有一个颜色图:每个值 0..255 到 vector [R, G, B] 的映射,指定了红色、绿色和蓝色的相对强度。一张照片在每个点都有一个 RGB 值:

colormap(gray);
x=imread('onion.png');
imagesc(x);
size(x)

这是图像的第 3 个维度。

您的矩阵是二维图像,因此最自然的显示方式是灰度级(就像您的光谱一样)。

x=mean(x,3);
imagesc(x);

这意味着 R、G 和 B 强度随着 mat 中的值共同增加。 .您可以将不同 R、G、B 组合的颜色图放在一个变量中,然后使用它来代替,即 y=colormap('hot');colormap(y); .变量 y显示(重新缩放的)图像值的 R、G、B 组合。

也可以制作您自己的颜色图(在 matlab 中您可以指定 64 个 R、G 和 B 组合,值介于 0 和 1 之间):

z[63:-1:0; 1:2:63 63:-2:0; 0:63]'/63
colormap(z);

现在,随着图像值的增加,红色强度会降低(从最高水平开始),绿色强度会迅速增加然后降低,蓝色值会从最小值增加到最大值。

因为PPM出现(不知格式)不支持色图,所以需要在3D数组中指定R,G,B值。对于类似于 z 的颜色顺序你需要做一个Cube<unsigned char> c(ysize, xsize, 3)然后对于每个像素 y, xmat2 , 做:

c(y,x,0) = 255-mat2(y,x);
c(y,x,1) = 255-abs(255-2*mat2(y,x));
x(y,x,2) = mat2(y,x)

或非常相似的东西。

关于c++ - Armadillo 移植 imagesc 从矩阵保存图像位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31745018/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com