發表文章

目前顯示的是有「Matlab」標籤的文章

Matlab從指定檔案讀取URL並下載

Matlab筆記

圖片
分享一下我研究所時使用的 matlab筆記

編譯Matlab的程式成獨立執行檔和DLL

這是之前做的一些Matlab小程式時所想用的方法,雖然Matlab官方有提供工具,但是該工具實在太大,而且作GUI程式的話很容易有跨電腦的問題,很不適合與人分享程式作品,因故作罷,僅供各位參考。 下面是我整理的處理流程投影片,如果看不到投影片請下面留言跟我說

BMP/JPG/PNG圖檔轉換成EPS圖檔

圖片
下面不管哪個情況都會需要安裝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檔

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畫圖後自動儲存

這主要是做實驗時要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無失真圖檔

用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檔程式

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

%% %  這是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:控制座標軸上顯示的數值標示

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 的角度值

圖片
我們可以寫一個簡單的程式,產生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:利用repmat簡單的矩陣重複複製

repmat 就是 rep licate(repeat) mat rics ,功能就是複製(重複)多次相同的矩陣。 先前寫過 迅速的重複貼圖 法,最近從大學長那邊得知,還可以利用repmat作簡短的重複貼圖法。 clc;clear; img = imread('img.bmp'); M = 80; N = 80; final = repmat(img,M,N).*0.2+0.8*50; imshow(final);

Matlab小程式:圖片選取程式

圖片
練習使用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小程式:圖片馬賽克化

利用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對應寫反

Matlab:迅速的重複貼圖法

Matlab 中使用迴圈容易使速度降低,轉換為向量與指令的組合可以快運行速度。 迅速的重複貼圖法 img = imread('img.bmp'); m = size(img, 1); n = size(img, 2); M = 40; N = 35; m_idx = (1:m)'*ones(1,M); n_idx = (1:n)'*ones(1,N); final = img(m_idx, n_idx, :); imshow(final); M, N 為要重複貼圖的長寬次數。 程式碼已使用 Matlab R2007a, R2007b 測試無誤。