Monday, May 21, 2012

Image processing & Mean square displacement (MSD) part I


ครั้งนี้ผมขอก้าวข้ามมาเขียนเรื่องที่เป็นวิชาการสักหน่อยครับ (Stochastic Process) เนื่องจากเมื่อต้นเดือน พฤษภาคม ที่ผ่านมาผมได้มีโอกาสไปร่วมงานประชุมวิชาการ และเข้าร่วมฟังการประกวดโครงงานก่อนจบของนักศึกษาระดับปริญญาตรี (Senior project) มีทั้งหมด 5 ท่านด้วยกัน รางวัลที่ 1 นั้นเป็นของมหาวิทยาลัยเชียงใหม่ครับ นำเสนอเกี่ยวกับ ผลของการไหลแบบดีนในท่อสี่เลี่ยมโค้งขนาดไมโครเมตร ศึกษาทั้งทาง ทฤษฎีและการทดลอง (หรือพูดอีกแบบหนึ่งคือ วัด Dean number และศึกษาว่ามีผลกับการเกิดปรากฎการณ์แบบ Dean อย่างไร) ซึ่งถือว่ามีประโยชน์ทั้งทางวิชาการ และการนำไปใช้ด้าน Lab-on-a Chip
                ส่วนเรื่องที่ผมจะนำมาเขียนในครั้งนี้ได้รับรางวัลรองชนะเลิศอันดับ 2 หรือ 3 ไม่แน่ใจ แต่เรื่องที่นำเสนอคือ การหาค่า Boltzmann constant จากการเคลื่อนที่แบบบราวน์ (Brownian motion) ในสองมิติ น้องเขาใช้เทคนิคที่เรียกว่า particle tracking โดยใช้ CCD camera ถ่ายภาพ micro bead ที่ล่องลอยเคลื่อนที่ไปมาในของเหลวที่เตรียมไว้ ผ่านกล้องจุลทรรศน์กำลังขยายสูง (แต่จำไม่ได้ว่ากี่ x) แต่ผมคงฟังไม่ทันในเรื่องของ algorithm ที่ใช้คำนวณ mean square displacement งงๆ เล็กน้อย  แต่ผมว่าถือเป็นงานที่ดีเลยทีเดียวครับ มีเครื่องมือที่ทันสมัย การทำความเข้าใจกับเรื่องนี้ก็ไม่ใช่เรื่องง่าย สำหรับปริญญาตรี ผมว่าดีครับ ดังนั้นเพื่อเป็นการทบทวนความรู้และสร้างความเข้าใจที่แม่นยำของตัวเอง ผมจึงเขียนบันทึกนี้ขึ้นมาเพื่อนำเสนองานที่เกี่ยวข้องกับเรื่องของ Image processing และใช้ใช้ประโยชน์ในงานด้านฟิสิกส์
                ก่อนอื่นขอแนะนำเทคนิค Particle tracking ก่อนนะครับ เทคนิคนี้โดยรวม ใช้ศึกษาพฤติกรรมของอนุภาคที่ผู้ศึกษาสนใจ ในเรื่อง dynamic ของมันครับ ข้อมูลที่ผู้ศึกษาอยากได้ก็คือ ตำแหน่งและเวลาของอนุภาคครับ ก่อนการพัฒนาโปรแกรมคอมพิวเตอร์สำหรับการ track ผู้ที่ศึกษาต้องถ่ายรูปแล้ว วัดหาตำแหน่งโดยใช้แรงงานคนนี่แหละครับ ลองคิดดูว่าถ้าเราถ่ายรูปไว้สัก 500 หรือ 1000 รูป ต้องใช้เวลาเก็บข้อมูลนานขนาดไหน (ถือเป็นเรื่องที่ต้องใช้ความบากบั่นและอดทนสูงมาก ครับ) นี่ยังไม่คิดถึงความคลาดเคลื่อนที่เกิดจากการวัดอีกนะครับ แต่เมื่อมีการพัฒนา tracking software ก็ทำให้งานในสาขานี้ ง่ายขึ้น และพัฒนาผลงานดีๆกันได้มากขึ้น มีคู่มือปฏิบัติการที่เขียนไว้ดีมากเกี่ยวกับ single particle tracking ลองดูที่นี่เลยครับ Practical Course: Single-Particle-Tracking 
Particle tracking technique แปลตรงๆ เป็นภาษาไทยว่า “เทคนิคการติดตามอนุภาค” อนุภาคในที่นี้จะเป็นอะไรก็ได้ที่มีลักษณะเป็นกลุ่มก้อนสามารถระบุได้ว่าเป็นวัตถุหนึ่งวัตถุ เช่น micro bead, cell, molecule, atom, pollen, dust particle เ็ป็นต้น (หรือแม้กระทั่งตัวบุคคล ลูกฟุตบอล ก็สามารถ ใช้เทคนิคได้เช่นกันครับ แต่จะศึกษาอะไรก็ว่ากันไปครับ) เทคนิคนี้เริ่มจาก การถ่ายภาพของอนุภาคที่เราสนใจว่ามันมีพฤติกรรมเชิงพลวัต (dynamic) อย่างไร ภาพที่ได้จะเป็น video หรือ image sequence ก็ได้ (ดังนั้นภาพจะบอก ตำแหน่งใน space ซึ่งจะเป็น 2 หรือ 3-dimension ก็แล้วแต่ว่าถ่ายภาพแบบไหน) จากนั้นใช้ Particle tracking software หาตำแหน่งของอนุภาคที่เราสนใจบันทึกออกมาเป็นพิกัดของอนุภาค ณ เวลานั้นๆ เมื่อได้ตำแหน่งจาก tracking software และเวลา จากข้อมูลการถ่ายภาพ  ข้อมูลดังกล่าว (ตำแหน่งและเวลา) จะถูกนำไปวิเคราะห์เพื่อแปลความหมายตามงานที่ผู้ศึกษาสนใจต่อไป
Mean square displacement (MSD) เป็นปริมาณสำคัญ ที่มักถูกใช้วิเคราะห์ว่า dynamic ของอนุภาคที่เราสนใจ ว่าเป็นอย่างไรและสามารถแปลผลออกมาทาง กายภาพ และ/หรือ ชีวภาพ ได้ว่าอย่างไร เช่น อนุภาคเลื่อนอย่างอิสระ เคลื่อนโดยถูกหน่วง เคลื่อนที่แบบมีจังหวะเวลาหน่วงอันเนื่องปัจจัยภายนอกหรือปฏิสัมพันธ์ของอนุภาคเอง เป็นต้น

ขอยกตัวอย่างให้เห็นภาพโดยรวมของความแตกต่างระหว่าง Deterministic  process กับ Stochastic process ก่อนนะครับ
สำหรับ Deterministic  process เช่น สมมติเราเดิน กรุงเทพ ฯ - ปัตตานี ระยะทาง 1,000 กิโลเมตร ด้วยเครื่องโบอิง 747 บินที่อัตราเร็วเฉลี่ย 970 กิโลเมตรต่อชั่วโมง เราจะคำนวณได้ทันทีเลยว่าจะใช้เวลาเดินทางจาก กรุงเทพ ฯ ถึง ปัตตานี ประมาณ 1 ชั่วโมง
แต่ถ้าเป็น Stochastic process สมมติเราจะเดินออกจากประตูบ้านถึงประตูรั้วบ้าน แต่มีเงื่อนไขว่า จะโยนเหรียญเพื่อกำหนดทิศทางการเดิน ถ้าออกหัวเราจะเดินหน้า 1 ก้าว แต่ถ้าออกก้อยจะเดินถอยหลัง 1 ก้าว ถ้าถามว่าหลังจากโยนเหรียญไปแล้ว 10 ครั้ง เรายืน ณ จุดใด แบบนี้นี่เราตอบไม่ได้ ไม่รู้ว่าจะอยู่จุดใด และถ้าทำการเดินแบบนี้ซ้ำๆ กัน ผ่านไป 10 ครั้งรับรอง ตำแหน่งสุดท้ายที่เรายืนไม่ซ้ำกันแน่ (แต่ก็พอมีโอกาสที่จะซ้ำอยู่ครับเพราะเราสมมติเดินใน 1 มิติ แต่ถ้าเราเพิ่มเงื่อนไข ซ้าย-ขวา เข้าไปอีกโอกาสที่จะซ้ำจะน้อยลงไปอีก)
คงจะเห็นภาพความแตกต่างนะครับ ทีนี้ลองดูภาพประกอบครับ เส้นทางการเดินของ Random walker เป็นอย่างไรกันบ้างนะครับ
>>> Brownian motion

นี่เป็นการ์ตูนสำหรับ Brownian motion ครับ ในเหตุการจริง เช่น เกสรดอกไม้ที่ล่องลอยในน้ำ ถ้าจะเปรียบเทียบ ลูกบอลใหญ่สีน้ำเงินสมมติเป็นเกสรดอกไม้ ส่วนลูกบอลเล็กสีแดงสมมติเป็นโมเลกุลของน้ำครับ
 

แต่ตอนนี้ขอยกสิ่งจำเป็นต้องใช้สำหรับเรื่องนี้ก่อนครับ (จำเป็นสำหรับวิเคราะห์ dynamic ของอนุภาค)

1. Image sequence (วีดิโอ หรือ ภาพ การเคลื่อนที่ของอนุภาคที่เราสนใจ)
                      ผมขอ link ไปที่นี่เลยครับ เป็นตัวอย่าง video จาก free software ครับ
            2. Particle tracking software (Single or multiple tracking)
                     ผมใช้  Single particle tracking เป็น Plug in ของ ImageJ ซึ่งเป็น free software ครับ
            3. Mean square displacement calculation
                     เขียน source code ใน MATLAB ครับ

งานวิจัยที่น่าสนใจเกี่ยวกับ Random walk in biological system
- http://www.agnld.uni-potsdam.de/~metz/
Acknowledgements
 
References
 - David A Drubin1, Arman M. Garakani and Pamela A, Silver, "Motion as a phenotype: the use of live-cell imaging and machine visual screening to characterize transcription-dependent chromosome dynamics", BMC Cell Biology, April 2006. 1Harvard Medical School and Department of Cancer Biology, Boston, MA, USA. >>> link.
- Frank Neumann, "A study of chromatin mobility by live fluorescence microscopy in Saccharomyces cerevisiae", University of Geneva, Ph.D Thesis. 2004.
- Jakob C. Schweizer, January 26, 2007. Practical Course: Single-Particle-Tracking. >>> link.

Wednesday, May 16, 2012

Update data in edit text

ผมออกแบบโปรแกรมซึ่งต้องมีช่องให้ผู้ใช้กรอกข้อมูลตัวเลขบางอย่าง แล้วผมก็เขียน handles มารับค่าเก็บไว้ ซึ่งพบว่ามีปัญหากับการ update ข้อมูลตัวนั้น ดังนั้นวิธีการง่ายๆ ที่จะทำให้ข้อมูล update ทุกครั้งที่ผู้ใช้เปลี่ยนแปลง ก็คือไม่ต้องเก็บใน handles แต่มาใช้คำสั่ง get() รับค่าแล้วใช้ใน callback นั้นๆเลย ก็พอจะแก้ปัญหาเบื้องต้นได้เช่นกัน แต่อย่างไรก็ตามสำหรับการทำงานที่ซับซ้อมผมเองก็ยังแก้ไขอยู่ หากสำเร็จเสร็จแล้ว จะนำมาบอกเล่าเพิ่มเติม

ดังนั้นครั้งนี้ผมเสนอตัวอย่างเพื่อแสดงการแก้ปัญหา ดังที่เขียนถึงด้านบน ด้วยการทำเครื่องคิดเลขอย่างง่ายๆ (และอย่าง... ด้วย) แต่ก็จะเห็นตัวอย่างการใช้งาน คำสั่งต่างๆได้ง่ายครับ ขอให้สังเกตไปที่ callback ของ edittext และ ปุ่ม calculate (ดูในไฟล์ตัวอย่าง)

นี่เป็นตัวอย่าง source code ครับ สังเกตบรรทัดสีเหลืองครับ ใช้ get ไปรับค่าจาก edittext (ในที่นี้ผมตั้งชื่อเป็น firstNo กับ secondNo) จากค่อยเปลี่ยนจากตัวแปร แบบอักษรมาเป็นตัวเลข เพื่อนำไปคำนวนตามหน้าที่ของ callback นั้นๆ

% --- Executes on button press in pushPlus.
function pushPlus_Callback(hObject, eventdata, handles)
% hObject    handle to pushPlus (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
No1 = str2double(get(handles.firstNo,'String'));
No2 = str2double(get(handles.secondNo,'String'));
results=No1+No2;

set(handles.result,'String',results);

guidata(hObject, handles);

ส่วนไฟล์ที่ผมลองทำโหลดได้จากนี่เลยครับ testCal.fig, testCal.m
 

Thursday, April 26, 2012

Recall the last input parameters after exiting the program and set default input parameters

ผมพัฒนาโปรแกรมอยู่ตัวหนึ่งครับ การใช้งานผู้ใช้ต้องใส่ input parameter หลายค่าในหลายๆที่ด้วย ซึ่งอาจทำให้ผู้ใช้งานเหนื่อยใจกับเรื่องนี้ เช่น ถ้ารันโปรแกรมกับตัวอย่าง input parameter เหมือนเดิมแต่ต้องกลับมานั่งใส่ทีละตัวทุกครั้ง ผมเลยต้องพยายามหาแนวทางเพื่อแก้ปัญหานี้ อันนี้ถามจากผู้รู้จากเว็บไซต์นี้ครับ shadowwares (ขอชมว่าเป็นมืออาชีพครับสำหรับไซต์นี้)

ดังนั้นในครั้งนี้ผมนำเสนอ การเรียกข้อมูล input เก่า (ครั้งล่าสุดหลังจากปิดโปรแกรม) พร้อมด้วยการกำหนดค่า เริ่มต้นไว้ด้วย (default) โดยได้รับคำแนะนำจากไซต์ที่กล่าวข้างต้น ผมใช้คำสั่ง save และ load ครับ แต่ปัญหาการใช้ คำสั่ง load ก็คือเราต้องมีไฟล์โปรแกรมโหลดก่อนครับ ดังนั้นในที่นี้ผมจะจัดเตรียมไว้ด้วยครับ (ผมทำง่ายๆ คือ ตอนแรกอย่าพึ่งใช้คำสั่ง load สั่งให้ save ก่อน เราก็จะได้ไฟล์เพื่อโหลดละครับ)

ผมจึงจำลองการเขียนกราฟของสองฟังก์ชันขึ้นมา ได้แก่ sine and sinc functions (y=sin(x) and y=sin(x)/x) ผู้ใช้งานสามารถกำหนดค่า x จากการใส่ค่าเริ่มต้น ค่าสุดท้าย และ step size ของการเพิ่มค่า x นอกจากนี้ยังมีโหมดให้เลือกใช้ค่า default ที่โปรแกรมกำหนดมาให้ใช้ได้อีกด้วยในที่นี้กำหนดให้ x เริ่มตั้งแต่ -50 ถึง 50 โดยเพิ่มค่าทีละ 0.1 หรือ x=[-50 : 0.1 : 50]

การแก้ไข source code นั้นผมขอยกมาเฉพาะส่วนครับ รายละเอียดไปดูใน DefaultParameter.m เอา ผมสร้าง GUI ขึ้นมาและให้ชื่อว่า DefaultParameter.fig และไฟล์ที่เตรียมไว้ชื่อ parameters.mat

ปกติผมไม่ค่อยได้แก้ไขส่วนนี้ครับ แต่ถ้าเราจะจัดการให้โปรแกรมรู้จักค่าต่างๆ ตั้งแต่เปิดใช้งานต้องนำมาใส่ไว้ในส่วนนี้ครับ อธิบายประมาณนี้เลยครับ
- ก่อนอื่นโหลดไฟล์ที่เก็บ parameters ต่างๆมาก่อน (คำสั่ง load)
- กำหนดให้ edit text handles รับค่าที่โหลดมาไปใช้ (คำสั่ง set)
- รับค่าจาก  edit text handles มาไว้ใน handles ที่เราตั้งไว้ (คำสั่ง get)

% --- Executes just before DefaultParameter is made visible.
function DefaultParameter_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to DefaultParameter (see VARARGIN)
% Choose default command line output for DefaultParameter
handles.output = hObject;
%Load the last variable from file.mat
load parameters.mat;
%-------------------------------------------
set(handles.editInitial,'String',InitialValue);
set(handles.editFinal,'String',FinalValue);
set(handles.editStep,'String',StepSizeValue);
%-------------------------------------------
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;

%---set initial value for if condition in PlotOperate_Callback
handles.SincPlotCheck=0; % กำหนดค่าให้ก่อน ใช้กับปุ่มกด plot graph
handles.SinePlotCheck=0;
% Update handles structure
guidata(hObject, handles);

ส่วนนี้จะทำงานเมื่อกดปุ่ม default parameters โปรแกรมจะเรียกค่า defaults ที่กำหนดไว้มาให้ตัวแปร
นั่นคือในที่นี้ default ก็คือ x = [-50 : 0.1 : 50]

% --- Executes on button press in pushDefault.
function pushDefault_Callback(hObject, eventdata, handles)
% hObject    handle to pushDefault (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%set default parameters, when the default buttom was pressed
set(handles.editInitial,'String','-50');
set(handles.editFinal,'String','50');
set(handles.editStep,'String','0.1');
Initial_value=get(handles.editInitial,'string');
handles.InitialValue=Initial_value;
Final_value=get(handles.editFinal,'string');
handles.FinalValue=Final_value;
StepSize_value=get(handles.editStep,'string');
handles.StepSizeValue=StepSize_value;
guidata(hObject, handles);

ในส่วนนี้จะทำงาน โดยแสดงกราฟบน axes1 ได้แก่
การเขียนกราฟของ sine function และ sinc function (sinX/X)

% --- Executes on button press in PlotOperate.
function PlotOperate_Callback(hObject, eventdata, handles)
% hObject    handle to PlotOperate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles.axes1;
Initial  = str2double(handles.InitialValue); %#ok<*ST2NM>
Final    = str2double(handles.FinalValue);
Stepsize = str2double(handles.StepSizeValue);
x        = [Initial : Stepsize : Final];
y=sin(x);
yy=sinc(x);%sin(x)./x;

if handles.SinePlotCheck==1
    plot(x,y);
elseif handles.SincPlotCheck==1
    plot(x,yy);
else
    plot(x,y,'g');hold on;
    plot(x,yy,'r');hold off;
end

guidata(hObject, handles);

%save structure handles in file.mat
save parameters.mat -struct handles; % คำสั่งบันทึกพารามิเตอร์ต่างๆก่อนปิดโปรแกรม

Tuesday, April 17, 2012

Principle of RGB image

ขอกลับมาที่ภาพสีอีกครั้งครับ หลังจากที่ทำงานกับ MATLAB อยู่หลายบทความ วันนี้มาลองช่วยกันดู หลักการพื้นฐาน ทฤษฎี คำอธิบาย เพื่อให้เราได้เข้าใจเกี่ยวกับ ที่มา-ที่ไป ของภาพสี (RBG image) และมองเห็นแนวทางการจัดการกับภาพเหล่านั้นได้ดังใจเราต้องการ

Monday, April 9, 2012

How to transfer data dynamically between GUIs?‎

ในหัวข้อนี้เป็นการแก้ไขและเพิ่มเติมความสามารถจากหัวข้อ uitable in GUI MATLAB นั่นคือผมยังใช้ไฟล์ก่อนหน้านี้อยู่ แต่สร้าง GUI ขึ้นมาเพิ่มอีกหนึ่งหน้าต่างครับ

ความสามารถของโปรแกรมนี้ที่ผมต้องการมีรายละเอียดดังนี้
- GUI หน้าหลักที่มีชื่อว่า sampleTable ให้อ่านข้อมูลตัวเลขที่ถูกเก็บไว้ในไฟล์ช
นิด text file (ในที่นี้คือ dat.txt) แล้วแสดงผลเป็นกราฟและแสดงผลข้อมูลดังกล่าวในตารางที่สร้างขึ้น
- ส่งค่าข้อมูลดังกล่าวออกไปยังอีก GUI หนึ่ง ในที่นี้ให้ชื่อว่า externalTable
- สามารถบันทึกข้อมูลเป็นไฟล์ Ms. Excel ด้วย

การแลกเปลี่ยนข้อมูลระหว่าง GUI อาศัยฟังก์ชัน (คำสั่ง) ดังต่อไปนี้
- setappdata ใช้สำหรับกำหนดให้ตัวแปร (ที่เก็บข้อมูลไว้) ถูกมอง
เห็นได้จาก GUI อื่นๆ
- getappdata ใช้สำหรับรับค่าจากตัวแปรที่กำหนดโดย setappdata

ภาพด้านล่างแสดง รูปร่างหน้าโปรแกรมที่สร้างจาก GUIDE ได้แก่ sampleTable.fig และ externalTable.fig



ส่วนภาพโปรแกรมเมื่อถูกสั่งให้ทำงาน แสดงดังภาพด้านล่าง

การเพิ่มเติม source code มีดังนี้
สำหรับไฟล์ sampleTable.m มีดังนี้ครับ

% --- Executes on button press in pushDisplayDATA.
function pushDisplayDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushDisplayDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.dataShow= handles.inputDATA(:,2:5);
set(handles.tableDATA, 'data',handles.dataShow)
% ----- เตรียม ข้อมูลไว้สำหรับ GUI อื่นๆ ------------
setappdata(0, 'test_data', handles.dataShow);
% ในที่นี้เก็บข้อมูล handles.dataShow ไว้ใน test_data

externalTable; % open externalTable GUI
guidata(hObject,handles);

% --- Executes on button press in push2Excel. ส่วนนี้
% จะบันทึกข้อมูลเป็น excel file
function push2Excel_Callback(hObject, eventdata, handles)
% hObject handle to push2Excel (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
data=handles.dataShow;
StandardConFileName = uiputfile('*.xls','Save as');
xlswrite(StandardConFileName,data);

สำหรับไฟล์ externalTable.m มีดังนี้ครับ

% --- Outputs from this function are returned to the command line.
function varargout = externalTable_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

Table_data=getappdata(0, 'test_data');%รับข้อมูลจาก sampleTable ซึ่งเก็บไว้ใน %test_data
% ----- ตรงไม่ต้องกังวลครับ เราจะจัดการข้อมูลยังไงก็ได้ ตามความต้องการเลยครับ -----
Table_data1=(Table_data(:,1))./max(Table_data(:,1));
Table_data2=(Table_data(:,2))./max(Table_data(:,2));
Table_data3=(Table_data(:,3))./max(Table_data(:,3));
Table_data4=(Table_data(:,4))./max(Table_data(:,4));
Table_data=[Table_data1 Table_data2 Table_data3 Table_data4];

% ------------ แสดงข้อมูลในตาราง externalTable --------------
set(handles.uitableAcceptDAT,'data',Table_data);

% ------- ให้สร้าง figure ขึ้นมาใหม่ สำหรับการเขียนกราฟข้อมูล -------
figure()
plot(Table_data1,'-*b');hold on
plot(Table_data2,'+r-');
plot(Table_data3,'--k');
plot(Table_data4,'-og');hold off
xlabel('index');ylabel('Normalized value');title('Test interface Multi-GUIs');
varargout{1} = handles.output;

download ไฟล์ทั้งหมดที่นี่  ===> download files

References

1. http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/
2. http://www.mathworks.com/matlabcentral/answers/6831-updating-application-data-from-several-gui-s
3. http://stackoverflow.com/questions/5346635/how-to-pass-parameters-to-a-matlab-gui-file

Saturday, April 7, 2012

uitable in GUI MATLAB

วันนี้ผมขอนำเสนอ การใช้งาน uitable ใน GUIDE MATLAB เพื่อสร้างตารางมารองรับข้อมูลบางอย่างที่ต้องแสดงผลเป็นแบบตาราง

ดังนั้นตัวอย่างนี้ ผมสร้างโปรแกรมเพื่ออ่านข้อมูล ที่เก็บไว้เป็นไฟล์ text ที่มีชื่อว่า dat.txt แล้วนำมาแสดงเป็นกราฟ โดยผู้ใช้เลือกกดปุ่ม Display graph และแสดงข้อมูลดังกล่าวในตารางด้วย เมื่อผู้ใช้กดปุ่ม Display Data ในโปรแกรมนี้ยังสร้างปุ่มกดเพื่อ clear data ที่แสดงอยู่ในกราฟและตาราง ออกไม่ให้ผู้ใช้เห็นกราฟและข้อมูล ในตัวอย่างนี้ผมจะเน้น การแสดงกราฟและข้อมูลในตารางเป็นหลักครับ

ภาพด้านล่างนี้ เป็นตัวอย่าง layout ของโปรแกรมและโปรแกรมที่พร้อมทำงานครับ ส่วนไฟล์ต่างๆ เข้าไปเอาในนี้ได้เลยครับ >>> uitable


ส่วนภาพนี้เป็นหน้าตาโปรแกรม ที่กำลังทำงานอยู่ครับ



ส่วน source code ที่ต้องเพิ่มเข้าไปในไฟล์ แสดงดังด้านล่างครับ ผมยกมาเฉพาะส่วน open file, การเขียนกราฟ และ การส่งข้อมูลไปแสดงบนตารางที่เราสร้างขึ้นเท่านั้น

%--- ส่วนการ import file into matlab และจัดเก็บใน structure handle ---
% --- Executes on button press in pushImportDATA.

function pushImportDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushImportDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[F,PathName,FilterIndex] = uigetfile({'*.*','All Files(*.*)'}, 'Select your File ');
guidata(hObject,handles);
b=strcat(PathName,F);
input=importdata(b);
handles.inputDATA=input; % เก็บข้อมูลที่โหลดเข้ามาไปเก็บไว้ที่ inputDATA
%แต่ต้องเก็บใน handle
guidata(hObject,handles);

%--------- แสดงข้อมูลในรูปแบบกราฟ -------------
% --- Executes on button press in pushPlotGraph.
function pushPlotGraph_Callback(hObject, eventdata, handles)
% hObject handle to pushPlotGraph (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.showGraph); % บอกให้ GUI ทราบว่า จะแสดงกราฟใน axes ไหน
%ในที่นี้ตั้งชื่อ(tag) เป็น showGraph
plot(handles.inputDATA(:,1),handles.inputDATA(:,2),'-*b');hold on
plot(handles.inputDATA(:,1),handles.inputDATA(:,3),'+r-');
plot(handles.inputDATA(:,1),handles.inputDATA(:,4),'--k');
plot(handles.inputDATA(:,1),handles.inputDATA(:,5),'-og');hold off
guidata(hObject,handles);

% ------- ส่วน ส่งข้อมูลไปแสดงในตาราง --------------
% --- Executes on button press in pushDisplayDATA.
function pushDisplayDATA_Callback(hObject, eventdata, handles)
% hObject handle to pushDisplayDATA (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
dataShow= handles.inputDATA(:,2:5);
set(handles.tableDATA, 'data', dataShow)
guidata(hObject,handles);

% --- ส่วนการ ยกเลิกหรือลบการแสดงผล ในกราฟและตาราง ----
% --- Executes on button press in pushCLEAR.
function pushCLEAR_Callback(hObject, eventdata, handles)
% hObject handle to pushCLEAR (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
cla(handles.showGraph,'reset') % clear current data on axes หมายถึง ลบการแสดงผลในกราฟ
set(handles.tableDATA,'Data',[]) % clear current data in table

Friday, March 30, 2012

Automatically M-file Generator (GUI MATLAB)

วันนี้ผมจะนำเสนอ GUI สำหรับสร้าง m-file โดยอัตโนมัติ เพื่อประโยชน์สำหรับติดต่อกับผู้ใช้ โดยที่ผู้ใช้ต้องใส่พารามิเตอร์ต่างๆ ตัวอย่างนี้เป็นการสร้างฟังก์ชันไฟล์ หรือจะเรียกว่า library file เพื่อเรียกมาใช้ในครั้งต่อไปสำหรับโปรแกรมหนึ่งๆ ที่จำเป็นต้องใช้ ข้อมูล สมการ เดิมๆ บ่อยๆ
%------------------------------------------------------------------------
ยกตัวอย่าง function ใน MATLAB อธิบายสั้นๆ ดังนี้
function [ a , b ] = plus( x , y )

a=y+x-1;
b=y+x+1;

เมื่อต้องการบันทึกไฟล์นี้ MATLAB จะบังคับให้บันทึกเป็นชื่อ plus ครับ
การทำงานของไฟล์นี้ ผู้ใช้ต้องมีค่า x และ y ให้ฟังก์ชันนี้ เมื่อทำงานเสร็จ จะส่งค่า a และ b ออกมา
%------------------------------------------------------------------------

ผมขอยกตัวอย่างโปรแกรมขึ้นมาแสดงก่อนนะครับ รูปด้านล่างเป็นหน้าตา layout และโปรแกรมที่พร้อมทำงานครับ ไฟล์ที่สร้างขึ้นมีชื่อว่า LibraryGen.m และ LibraryGen.fig


และรูปด้านล่างเป็นหน้าต่างโปรแกรมที่ทำงานแล้วครับ


ผมขอรวบรัดนิดนึงครับ สำหรับงานนี้ ส่วนหลักๆที่เราต้องเพิ่มเติม source code มีดังนี้ครับ
- การรับค่าจาก edit text ใช้ get(handles. tag ของ edittext ที่เราตั้ง, 'string')
แล้วเก็บเป็น handles.ตัวแปรที่ใช้เก็บค่า สังเกตจากตัวอย่างด้านล่างครับ (บรรทัดสีแดง)
- การเขียนไฟล์ไปบน editor พร้อมบันทึกค่า ในที่นี้เป็น function file ครับ
คำสั่งที่ต้องใช้ครับ fopen and fprintf

function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
effectiveSignal=get(handles.edit1,'string');
handles.EffectiveSignal=effectiveSignal;
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
guidata(gcbo,handles);

% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
slope=get(handles.edit2,'string');
handles.Slope=slope;
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as a double
guidata(gcbo,handles);

% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

function edit3_Callback(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
yintercept=get(handles.edit3, 'string');
handles.Yintercept=yintercept;
% Hints: get(hObject,'String') returns contents of edit3 as text
% str2double(get(hObject,'String')) returns contents of edit3 as a double
guidata(gcbo,handles);

% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

function edit4_Callback(hObject, eventdata, handles)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
rsquare=get(handles.edit4, 'string');
handles.Rsquare=rsquare;
% Hints: get(hObject,'String') returns contents of edit4 as text
% str2double(get(hObject,'String')) returns contents of edit4 as a double
guidata(gcbo,handles);

% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

function stdError_Callback(hObject, eventdata, handles)
% hObject handle to stdError (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
standarderror=get(handles.stdError, 'string');
handles.StandarderroR=standarderror;
% Hints: get(hObject,'String') returns contents of stdError as text
% str2double(get(hObject,'String')) returns contents of stdError as a double
guidata(gcbo,handles);

% --- Executes during object creation, after setting all properties.
function stdError_CreateFcn(hObject, eventdata, handles)
% hObject handle to stdError (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

function LiBfilename_Callback(hObject, eventdata, handles)
% hObject handle to LiBfilename (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.libname=get(handles.LiBfilename,'string');
% Hints: get(hObject,'String') returns contents of LiBfilename as text
% str2double(get(hObject,'String')) returns contents of LiBfilename as a double
guidata(gcbo,handles);

% --- Executes during object creation, after setting all properties.
function LiBfilename_CreateFcn(hObject, eventdata, handles)
% hObject handle to LiBfilename (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in save.
function save_Callback(hObject, eventdata, handles)
% hObject handle to save (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
button = questdlg('Do you want to save new library?', ...
'Exit Dialog','Yes','No','No');

switch button
case 'Yes',
disp('Exit RGB SpecAnal');
%Save variables to matlab.mat


Effective=handles.EffectiveSignal;
Yintercept=handles.Yintercept;
[xbel xlabel]=size(Yintercept);
Slope=handles.Slope;
Rsquare=handles.Rsquare;
Standard_Error=handles.StandarderroR;
%-------------------------------------------------------------
functionMfilename=handles.libname;
functionname=functionMfilename;
filename = fullfile([functionMfilename,'.m']);
fid = fopen(filename,'wt');
%----- function [ccUnknown]=library(UnknownIntensity)---------
fprintf(fid,'function [ccUnknown EffectiveSignal]=');
fprintf(fid,functionname);
fprintf(fid,'(UnknownIntensity)\n');
fprintf(fid,'%%this function is used to calculate the unknown parameter ----\n');
fprintf(fid,'%%created on automatically M-file generator\n');
fprintf(fid,'%%-----------------------------------------------------------------\n');
%-------------------------------
fprintf(fid,'[mrows ncols]=size(concentration);\n');
fprintf(fid,'ccUnknown=ones(mrows,ncols);\n');
fprintf(fid,'%%----alculation of Unknown concentration----\n');

if Yintercept(1)==45
fprintf(fid,'ccUnknown=(UnknownIntensity+');
fprintf(fid,Yintercept(2:xlabel));
else
fprintf(fid,'ccUnknown=(UnknownIntensity-');
fprintf(fid,Yintercept);
end
fprintf(fid,')./');
fprintf(fid,'(');
fprintf(fid,Slope);
fprintf(fid,')');
fprintf(fid,';\n');
fprintf(fid,'%%---------------------------\n');
fprintf(fid,'EffectiveSignal = ');
fprintf(fid,Effective);
fprintf(fid,';%%1 = Red, 2 = Green, 3 = Blue \n');
fprintf(fid,'R-square = ');
fprintf(fid,Rsquare);
fprintf(fid,';%%----R square from linear regression \n\n');
fprintf(fid,'Standard-error = ');
fprintf(fid,Standard_Error);
fprintf(fid,';%% \n\n');
fprintf(fid,'return ccUnknown,EffectiveSignal');

%save
%close(ancestor(hObject,'figure'))
case 'No',
%quit cancel;

end

Thursday, March 29, 2012

Basic functions of MATLAB for image processing

กลับมาที่คำสั่งหรือฟังก์ชันพื้นฐานใน MATLAB ที่ใช้กับ การประมวลทางภาพ ผมจะแนะนำคำสั่งที่ผมใช้บ่อยๆ ส่วนที่ยังไม่เคยใช้ ผมต้องไปทดลองก่อนแล้วค่อยเอาเขียนเพิ่ม เรื่อยๆ แต่รายละเอียดคำอธิบายต้องไปอ่านใน MATLAB Help นะครับ

imread (' ชื่อไฟล์รูป . นามสกุล ');
เช่น image01=imread ('Bluesky.jpg'); % ให้เก็บภาพที่ชื่อ  Bluesky.jpg ไว้ในตัวแปลชื่อ image01

: คำสั่งนี้ใช้นำข้อมูลภาพเข้ามาใน MATLAB ซึ่งจะถูกเก็บเป็นข้อมูลตัวเลข เช่น 720x480x3, 1024x800 เป็นต้น หรือที่เราเรียกว่า array ถ้าเป็น array 2 มิติ เป็นภาพ grayscale ถ้าเป็น array 3 มิติ เป็นภาพสี

Monday, March 26, 2012

Tricks & Trips

- guidata(hObject,handles);
- guidata(gcbo,handles);
  
-Adding TeX on your blogger

put the script after <head> in html (Template--> edit html)

%---------------------------------------------------------

<script type="text/javascript" 
src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
 extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
 jax: ["input/TeX", "output/HTML-CSS"],
 tex2jax: {
     inlineMath: [ ['$','$'], ["\\(","\\)"] ],
     displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
 },
 "HTML-CSS": { availableFonts: ["TeX"] }
});
</script>
 
%--------------------------------------------- 

Thursday, March 22, 2012

RGB image display on GUI MATLAB

จากหัวข้อที่ผ่านมาพอทราบวิธีเปิดไฟล์รูปและนำมาแสดงบน GUI กันแล้ว มาคราวนี้ผมจะแยกระบบภาพสี ซึ่งประกอบไปด้วย องค์ประกอบของ สีแดง สีเขียว และสีน้ำเงิน (RGB image) MATLAB จะเก็บภาพสีเป็น matrix mxnx3 มิติครับ โดยที่ mxn คือขนาดของภาพ และ เลขสามท้ายนี่ หมายถึง แยกเก็บเป็น matrix สามชั้น (ภาษาบ้านๆเข้าใจง่ายดี) โดยที่ mxn(1)=Red, mxn(2)=Green และ mxn(3)=Blue เมื่อแสดงพร้อมกันก็จะเป็นภาพสีดังที่เรามองเห็นครับ รายละเอียดเพิ่มเติม เข้าไปดูได้ใน MATLAB help ครับ (ไม่ได้ปัดความรับผิดชอบนะครับ แต่ help นี่ช่วยเราได้เยอะ ลองอ่านๆกันดูนะครับ)

ระบบสีใน MATLAB เป็นแบบ 8 bit image คือ มีค่าสีตั้งแต่ 0-255 (2^8=256) นั่นคือในแต่ละ pixel จะมีค่าประจำ pixel ของค่าสี RGB เมื่อภาพถูกเรียกเข้ามาใน MATLAB ให้อยู่ในรูปแบบของตัวเลขแล้ว เราสามารถดำเนินการด้านคณิตศาสตร์กับ matrix ของภาพนี้ได้ตามที่ต้องการทุกอย่างภายใต้เงื่อนไขไวยากรณ์ของ MATLAB อนุญาต การแสดงผลลัพธ์ก็คือ ภาพที่ได้รับการประมวลผลแล้ว หรืออาจเป็นข้อมูลที่แปลหรือถอดความหมายออกมาจากภาพนั้นๆ เพื่ออธิบายให้มนุษย์เราเข้าใจถึงภาพหรือคุณค่าบางประการของภาพนั้น เช่น การศึกษาการเคลื่อนที่ของมนุษย์ที่มีความ ปกติหรือบกพร่อง ทางกล้ามเนื้อและกระดูก การศึกษาการเคลื่อนที่ของเม็ดเลือดแดงในหลอดเลือด หรือการวัดความเร็วของวัตถุ face detection หรือ recognition (อันนี้มักเห็นในภาพยนต์เวลาตำรวจเอารูปถ่ายผู้ต้องสงสัยมาเทียบกับใบหน้าคนร้าย หรือการเปรียบเทียบลายนิ้วมือ) จากการถ่ายภาพ เป็นต้น เรามักได้ยินคำว่า image processing ไงครับ

ผมเป็นคนพื้นๆ ครับ ก็ต้องเริ่มจากพื้นฐานกันละครับ การประยุกต์ที่ยกตัวอย่างไว้ ก็รอไปก่อนหากมีโอกาสได้ศึกษา ลงมือทำเมื่อไร ผมจะนำมาเขียนไว้ แต่ตอนนี้ได้เวลา "Let's rock the RGB image"



เรายังต้องใช้ไฟล์ OpenImage.fig และ OpenImage.m จากหัวข้อที่แล้วแต่เพิ่มเติมส่วน radio button เพื่อเป็นตัวเลือกสำหรับเลือกแสดงรูปภาพแต่ละองค์ประกอบสี ดังนั้นสิ่งที่ต้องทำเพิ่มอีกส่วนหนึ่งก็คือเราต้องไปเพิ่ม source code เพื่อให้ โปรแกรมทำงานตามที่เราต้องการ

ในตัวอย่างนี้ radio button ที่สร้างขึ้นได้แก่
- RGB image เพื่อแสดงภาพสีต้นกำเนิด
- Red component ให้แสดงภาพเฉพาะองค์ประกอบ สีแดง
- Green component ให้แสดงภาพเฉพาะองค์ประกอบ สีเขียว
- Blue component ให้แสดงภาพเฉพาะองค์ประกอบ สีน้ำเงิน
- Gray scale image ให้แสดงภาพโทนสีเทา

สำหรับเทคนิคการแสดงภาพเฉพาะองค์ประกอบสีเดียว
สมมติ เก็บภาพสีไว้ในตัวแปรชื่อ RGBimage ถ้าต้องการแสดงภาพนี้เฉพาะสีแดง เราต้องกำหนดให้องค์ประกอบสีอื่นมีค่าเป็นศูนย์ (กำหนดเป็นสีดำ) เช่น

>>RGBimage=imread('test.jpg');
>>RGBimage(:,:,2)=0;
>>RGBimage(:,:,3)=0;
>>figure();imshow(RGBimage); title('Red-component image');

สิ่งที่ทำเพิ่มเติมคือ เลือก radio button ได้ทีละปุ่มเท่านั้นเพื่อให้โปรแกรมทำงานได้อย่างถูกต้อง ส่วนนี้ต้องเขียน function เพิ่มเติมนิดหน่อย แล้วค่อยเรียกมาใช้ ซึ่งผมตั้งชื่อว่า Turn_Off ฟังก์ชันนี้ต้องการ input ที่ชื่อว่า off ซึ่งจะบรรจุไปด้วย handles ที่ไม่ต้องการให้ทำงาน หรือปิดการทำงานนั่นเอง
ตัวอย่าง source code บางส่วนที่ต้องเพิ่มเติมเข้าไปครับ ไฟล์เต็มๆ download ได้ที่นี่ครับ OpenImage.fig, OpenImage.m, Turn_Off.m สำหรับฟังก์ชัน Turn_Off นั้นจะใส่ในไฟล์เดียวกับ OpenImage.m ก็ได้ แต่ในที่นี้เพื่อกันความสับสนเลยแยกออกมาอีกไฟล์ครับ

นี่เป็นรูปร่างหน้าตาโปรแกรมที่ทำงานได้ครับ ในภาพจะเห็นว่าจากภาพสีที่เราคุ้นเคยพอแยกให้แสดงเฉพาะสีเขียวก็แปลกตาดี นึกซะว่าตาบอดสี แดงและน้ำเงินแล้วกันครับ




% --- Executes on button press in RGBsignal.
function RGBsignal_Callback(hObject, eventdata, handles)
% hObject handle to RGBsignal (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes1); %ระบุว่าให้แสดงรูปใน axes ไหน
check=get(handles.RGBsignal,'value'); %รับค่าการถูกเลือก check=1 หรือไม่เลือก check=0
if (check==1)
imshow(handles.RGBimage);title('RGB image');
hpixinfo = impixelinfo;
axis off;

end

off=[handles.Redsignal handles.Greensignal handles.Bluesignal handles.Graysignal];
% ให้ radio button, RGB image เท่านั้นที่ทำงานได้
Turn_Off(off);%เรียกใช้ฟังก์ชัน Turn_Off
%guidata(hObject,handles);
% Hint: get(hObject,'Value') returns toggle state of RGBsignal

% --- Executes on button press in Redsignal.
function Redsignal_Callback(hObject, eventdata, handles)
% hObject handle to Redsignal (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
check=get(handles.Redsignal,'value');
axes(handles.axes1);

if (check==1)
if (get(handles.Redsignal,'value')==1)
handles.RGBimage(:,:,2) = 0;
handles.RGBimage(:,:,3) = 0;
imshow(handles.RGBimage); title('Red-component image');axis equal;axis tight;
axis off;impixelinfo;
end
end

off=[handles.Greensignal handles.Bluesignal handles.Graysignal handles.RGBsignal];
Turn_Off(off);