2015-07-31 13 views
7

tôi có mã matlab này để hiển thị đối tượng hình ảnh sau khi làm siêu phổ (stft, cặp vợ chồng plca ...)Armadillo porting imagesc để lưu hình ảnh bitmap từ ma trận

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]); 

Và có được kết quả này:

enter image description here

tôi đã porting C++ thành công bằng cách sử dụng Armadillo lib và có được kết quả mat:

mat f,t,spec_t; 

Vấn đề là tôi không có ý tưởng để chuyển đổi bitmap như imagesc trong MATLAB.

tôi đã tìm kiếm và tìm thấy this answer, nhưng dường như nó không hoạt động trong trường hợp của tôi bởi vì:

  • tôi sử dụng một ma trận đôi thay vì ma trận số nguyên, mà không thể được đánh dấu như màu bitmap
  • phương pháp imagesc mất 4 thông số, trong đó có giới hạn với vectơ x và y
  • phương pháp imagesc cũng hỗ trợ quy mô (tôi thực sự không biết làm thế nào cho nó hoạt động)


Có ai có bất cứ đề nghị nào không?

Cập nhật: Đây là kết quả của phương pháp save trong Armadillo. Nó không giống như hình ảnh phổ trên. Tôi có nhớ điều gì không?

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

enter image description here

Cập nhật 2: lưu ảnh phổ với 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); 

Và kết quả:

enter image description here

+0

Đối với ma trận 'double', bạn có thể làm như' imagesc' hoặc nhiều chức năng đồ họa Matlab khác: Dự đoán phạm vi giá trị ma trận của bạn thành một bản đồ màu được làm bằng số nguyên. Xem tài liệu Matlab về [màu được lập chỉ mục] (http://uk.mathworks.com/help/releases/R2015a/matlab/ref/graphics_i12.gif), trong tài liệu 'imagesc'. Đó là một bài tập mở rộng đơn giản. – Hoki

Trả lời

4

Armadillo là một gói đại số tuyến tính, AFAIK nó không cung cấp thói quen đồ họa. Nếu bạn sử dụng một cái gì đó như opencv cho những người sau đó nó thực sự là đơn giản.

Xem this link về opencv's imshow()this link về cách sử dụng trong chương trình.

Lưu ý rằng opencv (giống như hầu hết các thư viện khác) sử dụng lập chỉ mục hàng chính (x, y) và Armadillo sử dụng chỉ mục cột (hàng, cột), như được giải thích here.

Để mở rộng quy mô, hãy an toàn nhất để tự chuyển thành ký tự chưa ký. Trong Armadillo đó sẽ là một cái gì đó như:

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

Các tf biến được để thiết lập các trục, họ không nằm trong bitmap.

Để viết một hình ảnh, bạn có thể sử dụng Armadillo. Here là mô tả về cách viết hình ảnh bản đồ màu xám di động (PGM) và bản đồ pixel di động (PPM). Xuất khẩu PGM chỉ có thể áp dụng cho ma trận 2D, chỉ xuất PPM cho ma trận 3D, trong đó thứ nguyên thứ 3 (kích thước 3) là các kênh màu đỏ, xanh lục và xanh dương.

Lý do hình matlab của bạn trông đẹp hơn là vì nó có bản đồ màu: ánh xạ của mọi giá trị 0..255 đến một véc tơ [R, G, B] chỉ định cường độ tương đối của màu đỏ, xanh lục và xanh lam. Ảnh có giá trị RGB tại mọi điểm:

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

Đó là thứ nguyên thứ 3 của hình ảnh.

Ma trận của bạn là hình ảnh 2ngày, vì vậy cách tự nhiên nhất để hiển thị nó là cấp độ xám (như đã xảy ra với quang phổ của bạn).

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

Điều này có nghĩa là cường độ R, G và B cùng tăng với các giá trị trong mat. Bạn có thể đặt bản đồ màu của các kết hợp R, G, B khác nhau trong một biến và sử dụng thay vào đó, ví dụ: y=colormap('hot');colormap(y);. Biến số y hiển thị các kết hợp R, G, B cho các giá trị hình ảnh (được thay đổi kích thước).

Nó cũng có thể làm cho bản đồ màu sắc của riêng bạn (trong matlab bạn có thể chỉ định 64 R, G và B kết hợp với các giá trị giữa 0 và 1):

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

Bây giờ để tăng giá trị hình ảnh, cường độ màu đỏ giảm (bắt đầu từ mức tối đa), cường độ xanh tăng nhanh sau đó giảm, và giá trị xanh tăng từ mức tối thiểu lên mức tối đa.

Vì PPM xuất hiện (tôi không biết định dạng) không hỗ trợ bản đồ màu, bạn cần chỉ định giá trị R, G, B trong mảng 3D. Đối với một trật tự màu sắc tương tự như z bạn sẽ neet để thực hiện một Cube<unsigned char> c(ysize, xsize, 3) và sau đó cho mỗi điểm ảnh y, x trong mat2, làm:

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) 

hoặc một cái gì đó rất giống nhau.

+0

Cảm ơn, nhưng tôi muốn lưu bitmap vào tệp png thay vì hiển thị trong cửa sổ. Opencv có hỗ trợ nó không? – R4j

+0

Ah, bạn nói bạn muốn làm giống như imagesc đang hiển thị ma trận dưới dạng bitmap. lưu nội dung của cửa sổ hình là chức năng GUI. Xem liên kết trong phần chỉnh sửa về cách viết hình ảnh P {GP} M trong Armadillo. –

+0

Tôi cập nhật câu hỏi của mình với kết quả 'lưu'. Nhưng quang phổ không giống như những gì tôi mong đợi như 'imagesc' trên MATLAB. Tôi có nhớ điều gì không? Dữ liệu kết quả của tôi phức tạp gấp đôi (vì tôi làm fft). – R4j

2

Bạn có thể sử dụng SigPack, thư viện xử lý tín hiệu trên Armadillo. Nó có hỗ trợ quang phổ và bạn có thể lưu cốt truyện vào nhiều định dạng khác nhau (png, ps, eps, tex, pdf, svg, emf, gif). SigPack sử dụng Gnuplot cho âm mưu.

Các vấn đề liên quan