發表文章
目前顯示的是有「Matlab」標籤的文章
BMP/JPG/PNG圖檔轉換成EPS圖檔
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
下面不管哪個情況都會需要安裝Adobe Acrobat, Adobe Acrobat是要付費的版本,跟免費安裝使用的Adobe Reader功能上有很大的不同。 任意圖檔轉換成EPS圖檔 可以用Adobe Acrobat打開圖檔,然後另存成EPS圖檔 我最後是用了Matlab來做處理,因為Matlab可以開很多種圖檔,下面附上轉換程式碼,請安裝Matlab後服用,謝謝。 [file, path] = uigetfile( ... {'*.jpg;*.bmp;*.png;*.tif', 'All Image Files (*.jpg;*.bmp;*.png;*.tif)'; ... '*.*', 'All Files (*.*)'}, ... 'Select image files for process', 'MultiSelect', 'on'); if isequal(file, 0) || isequal(path, 0) disp('User pressed cancel'); return; end if iscell(file) file_num = size(file,2); else file_num = 1; end for i=1:file_num if iscell(file) imgfname = file{i}; else imgfname = file; end imgpat...
Matlab讀寫CSV檔
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
CSV檔案的全名是 Comma Separated Values 也就是以逗號分隔的資料欄位的文字檔案 因為Excel可以直接開啟CSV檔案, 輸出實驗數據很方便 用C/C++也可以很方便的處理(最方便的還是Tab分隔的文字檔) 輸出CSV csvwrite('yourpath.csv', Data); 輸入CSV rdData = csvread('yourpath.csv'); 之前做實驗時Matlab發出警告,說csvwrite的輸出精確度不足 所以就改用dlmwrite,不過副檔名還是.csv dlmwrite('output_filepath.csv', Data, 'precision', '%.4f'); 後面兩個參數就是可以用來指定精確度的, 有指定的話就不會有科學表示法或是小數點下位數長度不一的結果
Matlab畫圖後自動儲存
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
這主要是做實驗時要Matlab產生曲線或曲面看結果用的, 不過用Matlab處理數據也是滿實用的功能, 但是很不希望繪圖視窗跑出來,若能直接繪圖後就存檔就好了。 %首先用figure產生一個不顯示的新繪圖視窗 h = figure('Visible', 'off'); %然後開始繪圖,要加什麼裝飾都在這裡寫好 plot(X,Y); %最後用saveas函數將figure存檔成png saveas(h, [plot_ouput.png'], 'png'); PS. 要大量繪圖的話要記得定期close all;清除Matlab開啟的figure 如果你只是要將目前畫出來的figure存檔 利用gcf=get current figure取得目前的繪圖視窗就直接將它存檔囉! %存檔 saveas(gcf, [plot_ouput.png'], 'png');
用Maltab將jpg圖檔儲存成png無失真圖檔
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
用Maltab將jpg圖檔儲存成png無失真(lossless)圖檔,只需要一個只令呦! imwrite(img, filepath, 'Compression', 'none'); 下面給一個處裡一整個資料夾的範例,還會check是否與原圖一模一樣。 DoLosslessValidation = true; files=dir('*.jpg'); if size(files,1) <= 0 error('Cannot find any *.jpg files!'); end cnt = 0; valid_cnt = 0; for i=1:size(files,1) [pathstr, name, ext] = fileparts(files(i).name); img = imread(files(i).name); if ~isempty(img) imwrite(img, [name '_lossless.png'], 'Compression', 'none'); cnt = cnt+1; if DoLosslessValidation rec_img = imread([name '_lossless.png']); islossless = 0==sum(double(rec_img(:))-double(img(:))); ...
從命令提示字元執行Matlab的M檔程式
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
Command Line執行Matlab的M檔程式 1. 首先設定系統路徑,把Matlab的執行檔(含有matlab.exe的目錄)路徑 例如:Matlab 2011a的執行檔路徑為 C:\Program Files\MATLAB\R2011a\bin 2. 指令 matlab -nodesktop -nosplash -r M檔案的名稱(不需要含副檔名.m) 它就會run指定的.m檔囉! 這裡給一個Command line的應用,呼叫Matlab將Excel檔內的資料成圖片 for %%v in (test_videos\*.yuv) do ( matlab -nodesktop -nosplash -wait -r "xls2epsc('ExpRes_%%~nv.xlsx', 'RD_%%~nv.eps')" ) matlab的-wait選項是等待程式結束才繼續。
用Matlab計算BD-PSNR
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
%% % 這是Matlab版的BD-PSNR計算程式碼 % 與C版本的計算器avsnr4, 存在0.0x的誤差 %% clc;clear;close all; % 關閉視窗與清除先前資料 %定義區間,給空陣列 [ ] 會自動取值 range = [442.36 66612]; range = log(range); % for BD-PSNR => bitrate %我的方法 A = ... [66612 74.59 29822 46.08 6239 32.65 442 23.72]; % 比較方法A B = ... [68774 56.65 31866 41.97 7083 29.43 416 21.58]; % 比較方法B B = ... [71331 44.86 21995 38.70 3593 29.31 148 13.28]; %比較方法C B = ... [69671 45.43 23729 40.03 4384 31.59 413 24.78]; %% Ax = A(:,1); Ay = A(:,2); Axl = log(Ax); Bx = B(:,1); By = B(:, 2); Bxl = log(Bx); figure;plot(Axl,Ay,Bxl,By);title('PSNR-BR'); figure;plot(Ax,Ay,Bx,By);title('PSNR-log(BR)'); % 多項式fitting rdcA = polyfit(Axl,Ay,3); rdcB = polyfit(Bxl,By,3); %自動取值或是在限定範圍內取值 if isempty(range) maxX = min(Axl(1), Bxl(1)); minX = max(Axl(end), Bxl(end)); else maxX ...
Matlab:控制座標軸上顯示的數值標示
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
clc; % 控制要顯示的數值 xlblarr = [0:10:200]; ylblarr = [1:4:100]; % 產生新的繪圖視窗, 用handle設定繪圖視窗的一些屬性 handle = figure(); axes('Parent',handle,... 'XTick', xlblarr,... % 要標示 x 軸label的位置 'XTickLabel', int2str(xlblarr'),... % 位置所對應的 x 軸label文字 'YTick', ylblarr,... % 要標示 y 軸label的位置 'YTickLabel', int2str(ylblarr')); % 位置所對應的 y 軸label文字 box('on'); % 自動繪製圖形邊線 hold('all'); % 之後的plot指令都使用同一個視窗 % 資料點 x = [1:2:200]; y = [1:1:100]; plot(x, y); % 控制要顯示的位置 axis([-10 210 -5 100]);
程式筆記: atan2 的角度值
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
我們可以寫一個簡單的程式,產生atan2的所取得的角度概略分佈。由於我目前所使用的是工具有Dev-C++4.9.9.0、BCB 6.0與Matlab 7.5,怕每個做的都不相同,所以我都得進行測試。 Matlab Matlab結果如圖上的第一個矩陣,得到的是有正角度與負角度的矩陣。由於概念上用0~360來表示較度會比較好懂,因此就將atan2所得到的負角度+360得到0~360尖的角度值,如圖方矩陣。 於Matlab用的程式碼 x=repmat([-2:2], [5,1]); y=repmat([2:-1:-2]',[1,5]); angle=atan2(y,x)/(2*pi)*360 neg=find(angle Borland C++ Builder與Dev C++ 基本上這兩個工具得到的結果都是相同的,但是BCB就是不一樣(汗) 用Dev C++獲得的結果就如同Matlab,只是有負的角度,需將小於零的角度+360。 但是,BCB就是不太一樣,中間數值為(0,0)的時候,BCB會跳出DOMAIN Error的例外,而最後產生出來的數值則是NaN,也就是不將atan2(0,0)視為0,這也就得讓我去作額外的判斷工作,實在麻煩。
Matlab小程式:圖片選取程式
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
練習使用Matlab的對話框,並與有的沒的指令結合順便紀錄用法。 展示圖 程式碼 clc; clear; % 取得圖片所在的目錄 images_dir = uigetdir('.','Choose a directory for images'); if images_dir == 0, return; end % 檢查目錄存在否 chk_code = exist(images_dir,'dir'); if chk_code ~= 7 msg = sprintf('''%s''not exit or not a directory\n', in_dir); errordlg(msg, 'Are you sure?'); return; end % 搜尋檔案並統計 file_list = dir(fullfile(images_dir, '*.jpg')); file_list_num = size(file_list); if file_list_num(1) <= 0 msg = sprintf('Can not find any JPEG image in this directory.\n'); msgbox(msg, 'Are you kidding?'); return; end msg = sprintf('Total JPEG image number:%d\n', file_list_num(1)); uiwait(msgbox(msg, 'Scanning images finished')); % 列出檔案名稱給使用者選擇 file_list_names = {file_list.name}; pushbtn = 1; while pushbtn == 1 [selindx,pushbtn] = listdlg('SelectionMode', 'single',... 'PromptString', 'Select image to show...
Matlab小程式:圖片馬賽克化
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
利用matlab的內建指令imresize作馬賽克(mosaic)。 程式碼 % Parameters pix_grp = 20; img_fname = 'target-3.jpg'; % Processing target = imread(img_fname); height = size(target,1); width = size(target,2); mosaic = imresize(target,[floor(height/pix_grp) floor(width/pix_grp)]); mosaic = imresize(mosaic,[height width],'nearest'); imshow(mosaic); 方才靈機一動的想法,不過我自己對自己傻眼,想到三天前我還慢慢的用for, while迴圈磨了一段時間才寫出來,現在卻兩個指令打死這些心血。 2008-01-03 修正寬高的size對應寫反