2014年12月25日 星期四

[MATLAB] Output matrix data to a Microsoft Excel(2013) file

If you want to output your image matrix (double type) to Microsoft Excel 2013 file

You should create a excel file first in a place in C disk of your computer first

And then use the following code like this:
filename_A = ' filepath\your_excel_filename.xlsx';
xlswrite( filename_A, Matrix name, sheet ); 
filepath is the file path of your excel file in your computer


Official document of xlswrite() command official_1 and official_2

Chinese version web tutorial here

Besides, this is the sheet of excel




2014年12月16日 星期二

2014年12月14日 星期日

[MATLAB] High frequency emphasis filtering Tutorial

Tutorial  here

http://www.ee.oulu.fi/research/imag/courses/dkk/exercises/2008/matlab/2/e2_h_emphasis.html

2014年12月9日 星期二

[MATLAB] HSV

1. A little description about HSV color space and simple matlab code. ( Link here )

2. Modeling a HSV color space  (Link here)

3. Visual HSV color histogram(Link here)

2014年12月8日 星期一

[MATLAB]Common command code

This article list all common command in MATLAB

But the most useful tool in MATLAB is using "help" and finding key word.

Hope it helps!

2014年11月27日 星期四

[MATLAB] Color image processing

Color is a very attractive issue in image processing

But what if i want to show a specific color ?


Maybe we can change traditional RGB color model 
to HSV color model 

Here is a simple solution on StackOverflow


They give a detailed solution and demonstration

=> How can I convert an RGB image to grayscale but keep one color?

Other article shows demonstration

2014年11月26日 星期三

[MATLAB] Adjusting subplot size

These two article in StackOverflow mentioned that :

How to adjust the picture size and position???

1. How can I set subplot size in MATLAB figure?

2. How do I position subplots in MATLAB?


But there is one thing we need to notice, not to use "i" or "j" as variable index.

Because in matlab, "i" or "j" might be seen as imaginary number of complex number.

( i or j = sqrt(-1) , ie. complex number c = a + bj or c = a+bi, a is real number part and b is imaginary part)

I hope it helps!

2014年11月25日 星期二

[MATLAB-GUI] Building a GUI program

The following link tells you how to make a Matlab GUI program

If there is a better tutorial, i will keep updating~


[MATLAB] Fast Fourier Transform algorithm

FFT is a very powerful tool for computer scientist

Here is other people's tutorial of this topic

Everyone who need to understand this should take a look at the following documents


2014年11月24日 星期一

[Matlab] Spatial Transformation

最近在解決 Spatial Transform 的問題

1. Scaling /縮放圖像大小

主要有兩個問題,即座標點轉換 與 指定灰階值

先將座標點

其他人的做法

1.  本篇有詳盡的解說
Nearest-neighbor interpolation algorithm in MATLAB

2.  回答者有回答上一個的討論串
Resizing an Image in MATLAB




[MATLAB]Creating a 2-D rectangle window in image/在產生一個二維的矩形

最近在研究如何在圖片或是影片當中生成一個監控視窗

這個監控視窗只針對我們感興趣的部分作監控

在這篇 StackOverFlow的提問中有提及

如何在輸入的影像後,在圖片中創造一個矩形的指令

2014年11月23日 星期日

[MATLAB] 加速運算議題(MATLAB Performance Acceleration)


最近以MATLAB R2011a進行影像處理實作,發現了一個重大的問題

就是在使用兩個甚至三個以上的迴圈進行圖像的基本影像處理時

運算時間就成不可思議的的非線性正比

而且隨著圖片的像素數目越多,計算速度變越慢

該如何進行改進MATLAB 運算速度慢的問題呢?

#1如何加速Matlab 程式 (原作者為:曾正男)

在這篇博文中提到了兩個小技巧
1. Colon 運算子 (Colon operator)
使用了非迴圈式的運算子
來取代原始的For迴圈,語法指令與For迴圈相當類似。
例如,令變數 t = start_point : delta_value : end_point

則往後使用到變數t的判斷式或是數學式等都會以
變數t由start_point 的值,以固定的delta值為間隔,計數(counting)到
end_point所在的值。
與數學中的等差級數的概念相當。

2. 善加利用" : "(冒號)運算子
在MATLAB中,":"號代表的是從使用者自行定義的起始點自動計數
直到所有數值數完才結束,與colon運算子不同的地方在於":"號是所有資料點

都會計數到。
而colon運算子則是以等差級數的方式進行計數資料點。

在MATLAB盡量以上述兩點技巧來達成與迴圈自動執行概念相同的替代方案
而矩陣相關的運算加速議題則留待之後討論到矩陣的時候再分享。

#2 撰寫快速的 MATLAB 程式碼

在這篇博文中則提到了一個相當不錯用的工具

由於剛接觸MATLAB的開發者,例如我
常常因為不熟悉指令而不知不覺增加程式的運算時間

它裡面提供了一項MATLAB內建的檢驗工具

判斷哪個部分的程式拖垮整體運算速度

再針對需要的部分作最佳化

它裡面也提到了何謂最佳化、是否有必要最佳化以及如何針對最佳化取捨進行討論

#3 加速matlab运行的三重境界

若想加速MATLAB運算必須遵守的規則請看此篇。



同場加映--

內文中則提到的另一篇文件,與m file轉成c/c++有關

此篇內容是更為進階,有興趣的讀者可自行研讀
-------------------------------------------------------------------------------------------------

[转帖]总结:m文件转化为c/c++语言文件,VC编译

matlab使用很方便,但有时候一些特殊的应用需要我们将matlab中m格式的

文件中的程序翻译成c/c++的形式的程序并在c/c++的编译器中进行编译,本

文总结了一般的方法。

需要分两种情况,第一种是你的m文件中不涉及到有关绘图的函数;第二种

是需要用到绘图函数。下面分别用例子来说明:



第一种情况:

1. 建一个m文件,内容为:

%%%%%%%%%%%%%%%%%%%%%%

function y=fork_1(n)

y=0;

for i=1:n

y=y+i;

end

%%%%%%%%%%%%%%%%%%%%%%

保存后在命令窗口中:

输入:(格式:mcc -t -L Cpp -h 文件名)

mcc -t -L Cpp -h fork_1

然后你会在你的工作目录下找到fork_1.cpp和fork_1.hpp两个文件。

2. 在VC中建一个基于对话框的MFC应用程序,名字为testFork1,添加一个

按钮,并添加按钮响应函数,函数内容在第五步中说明。将上面生成的

两个文件拷贝到VC工程的testFork1目录里。

3. 在VC中选择:工程--->设置,再选属性表Link选项,下拉菜单中选择Input,

在对象/库模块中加入附录A中所列出的内容,注意用空格将它们格开而在忽略

库中加入附录B中列出的内容;再选择属性表C/C++选项,下拉菜单选General,

在预处理程序定义中添加附录C中的内容,原来有的内容要保留,并注意用逗号

将它们隔开。再选择下拉菜单的Precompiled Headers选项,选择“自动使用预

补偿页眉”,在其中添加stdafx.h ,确定。

4. 选择:工具--->选择,属性页选择“目录”,在include files里面加入:

C:\MATLAB6P5\EXTERN\INCLUDE

C:\MATLAB6P5\EXTERN\INCLUDE\CPP

注意,根据你的matlab的安装位置的不同,要相应的修改上面的地址。

在Library files里面加入:

C:\MATLAB6P5\EXTERN\LIB\WIN32

C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60

注意,根据你的matlab的安装位置的不同,要相应的修改上面的地址。

5. 在按钮响应函数所在文件中添加如下的头文件:

......

#include "matlab.hpp"

#include "fork_1.hpp"

......

函数响应代码为:

int i;

mwArray n;

n=5;

n=fork_1(n);

i=n.ExtractScalar(1);

CString str;

str.Format("%d",i);

AfxMessageBox(str);

6. 编译,连接,执行,一切OK!(注意的是如果你的程序中用到了许多其他函数,

matlab会为每个函数生成一个对应的hpp和cpp文件,必须将他们都拷贝你的工

程中去)



第二种情况:

1. 建一个m文件:

%%%%%%%%%%%%%%%%%%%%%

function fork_2()

x=[1 2 3];

y=[1 3 1];

plot(x,y);

%%%%%%%%%%%%%%%%%%%%%

保存后在命令窗口中:

输入:(格式:mcc -B sglcpp 文件名)

mcc -B sglcpp fork_2

2.

3.

4.

下上各步与前例相似,只是这是会多出来个fork_2_mainhg.cpp,fork_2.exe和

bin文件夹。在拷贝的时候文件fork_2_mainhg.cpp和fork_2.exe不要。但需要将

bin文件夹考到VC的工程目录中去。

5. 在按钮响应函数所在文件中添加如下的头文件:

......

#include "matlab.hpp"

#include "fork_2.hpp"

......

函数响应代码为:

libmmfileInitialize();

libmwsglmInitialize();

mlfHGInitialize(NULL,NULL);

fork_2();

mlfHGWaitForFiguresToDie();

mlfHGTerminate();

libmmfileTerminate();

libmwsglmTerminate();

6. 编译,连接,执行,一切OK!
(注意的是如果你的程序中用到了许多其他函

数, matlab会为每个函数生成一个对应的hpp和cpp文件,必须将他们都拷贝你的工 

程中去。另外fork_2()之前的三行代码和之后的四行代码必不可少,但应该保

证在你的程序的整个执行过程中他们分别只被调用一次,所以最好将分别他们

放置在程序的初始化函数与程序结束时才调用的做扫尾工作的函数里面)



附录A:链接库

libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib

sgl.lib libmwsglm.lib libmwservices.lib



附录B:忽略库

msvcrt.lib



附录C: 预处理程序定义

MSVC,IBMPC,MSWIND



附录D:进一步参考

关于mcc命令的使用参见matlab帮助文件

关于mwArray的数据读出方式参见matlab在线帮助:

http://www.mathworks.com/access/helpdesk_r12p1/help/toolbox/mathlib/cppmathug/cppmathug.shtml

“m文件转化为c/c++语言文件”很简单,但要在VC中通过编译连接却会碰到很多问题,

即使通过了编译与连接也不保证能正确执行,有时候会遇到很多棘手的麻烦,在我

的另一篇文章(站内有):“分析:解决m程序转化成cpp程序的编译问题”中就举了

一个这样的例子。在那篇文章里虽然最后靠了几招“歪门邪道”搞定了那个问题,但

还是可以看出这样的转化问题是很麻烦的。
-------------------------------------------------------------------------------------------------

#4  MathWorks 的官方說明文件

解釋如何以自家產品撰寫程式時程式效能上能夠加速

1. Accelerating MATLAB Algorithms and Applications

2. Techniques for accelerating MATLAB algorithms and applications

2014年10月13日 星期一

[影像處理]Bit plane slicing觀念解說

在眾多影像處理的中,有一個重要的主題 - 影像分割

在影像分割的主題裡面,有許多不同的影像分割方法

此篇所要介紹的方法就是位元平面(Bit plane)的影像分割概念

位元平面(Bit plane)


黑白影像 從字面上來看就是 由黑與白 兩個元素所組成的影像

如果用灰階值(數值分布為0~255)來描述該張影像的話,每個像素(pixel)裡的數值不是代表

色的 0 就是代表白色的 255

大家想像一下,如果從數學上描述,黑白影像是幾位元影像?

沒錯,就是1個位元的影像,由數位邏輯的觀點來看,下圖的空格中不是代表的0(沒輸出,黑

色) 就是 1(有輸出,發白光),也就是邏輯上非黑即白的概念。


 _ 
1st-bit

示意圖一、一位元影像

那如果是往較為複雜的方向去想,也就是2個位元以上的影像呢? 我們是不是可以想像像機或

是手機裡儲存的影像是由很多不同位元的影像疊加在一起,如同工程數學領域以及訊號與系

統領域中傅利葉轉換的概念呢? 也就是一個複雜的訊號是由許多簡單的訊號所疊加而成呢?

不清楚傅利葉轉換轉換的同學可以參考此文章  - 如果看了此文你還不懂傅里葉變換(Fourier+Transform),那就過來掐死我吧!

位元平面分割(Bit plane slicing)

有了上述的觀念之後,我們對於位元平面分割有了一些粗淺的認識

此時我們的思路將反過來,將一張影像如何分割成 n 個位元的影像平面來做解說

我們舉一個一張圖轉換成8位元影像的例子來做說明

其概念是若我要將影像進行位元平面分割,轉換成一張 8-bit 的位元平面

做法是將灰階值由 0~255 轉換成 2進位制來表達

10進位                  2進位

  0            →       00000000

255          →       11111111

以下為示意圖 :

                                                        2^(8-1)                               2^(1-1)

 _  _  _  _  _   _  _  _

  ↑                                   ↑
8th-bit                          1st-bit
      (第八位數,最高次方項)      (第一位數,最低次方項)


示意圖二、八位元影像
                           
因此,可以獲得8個bit plane

其中,每個位元的位置上可能出現的數字只有 1或 0這兩個可能(2的零次方或是零)

2^7 = 128 , 2^0 = 1



而第8位元的影像平面 比起 第1位元的影像平面來的清楚的原因

我個人的理解是因為灰階值差異夠大,所以最高位元的影像平面比起最低位元的影像平面來

的清晰

像是128 與 1的差距高達128-1 = 127,其中又以高頻訊號(變化較劇烈的部分)人眼辨識的能力

較好,而低頻訊號的辨識能力較差,而第8個位元平面與第1個位元平面所代表的訊號分別是

高頻訊號 以及 低頻訊號

因此可知 最高位元與最低位元 影像平面 為甚麼一張是看的清原始影像的輪廓,一張則像是充

滿雜訊


若將這八個影像位元平面進行疊合,則可以得到原始圖形

若要有更詳盡的圖文說明,請參考此篇博文

------------------------------------------------------------------------------------------------------------

同場加映 - 傅立葉轉換在影像處理中的用途 陳鍾誠 

專案#1_MATLAB的一些撰寫技巧

以下是在網路上找到的一些關於自製Histogram、矩陣數學運算的文章

DIY Histogram

http://blog.yam.com/chu24688/article/50609657


如何搜尋矩陣中最大值、最小值

http://blog.sina.com.cn/s/blog_64eb03bb0101bmek.html

2014年9月8日 星期一

[Digital image processing] MATLAB中如何擷取特定顏色?

最近在研究一個色彩學上的問題

就是如何將特定顏色 (Ex. 藍色) 擷取出來

經過一段時間的查找

在StackOverFlow上找到了一篇相似的文章

How can I convert an RGB image to grayscale but keep one color?

該文中的問題是如何將非紅色的部分變成灰階影像(Grayscale)

利用文中的方法,將藍色的圖案給試出來

先附上第一版的程式 & 圖檔作為記憶

執行結果


MATLAB 程式碼
clear all;
clc;

% Import image
prt_img = imread('C:\Users\alex Hsu\Desktop\Printer_video\20140908_test_img.jpg'); % imread can show color image
%class(prt_img);

% Color detection
for y = 1:size(prt_img,1)
    for x = 1:size(prt_img,2)
        red   = prt_img( y, x, 1 );
        green = prt_img( y, x, 2 );
        blue  = prt_img(y, x, 3);
          if (blue < (red * 1.4) || blue < (green * 1.4) )
                avg = (red + green + blue) / 3;
                for z = 1:3
                    prt_img(y, x, z) = avg;
                end
        end
    end
end

附註 :

Wiki : HSL and HSV

HSV 相對於RGB的優勢在於顏色的組成只由單一顏色,而非像 RGB 是由Red Green Blue 三種顏色混合而成,比較容易將特定顏色擷取出
/* 載入prettify的autoloader */ /* 載入JQuery */