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

3 comments:

  1. เข้าโหลดไฟล์ไม่ได้ค่ะ

    ReplyDelete
    Replies
    1. แก้ไขให้แล้วครับ โหลดได้เลย

      Delete
  2. วิธีเปิดรูปภาพแสดงบน GUI อยู่ที่บทความไหนหรอคะ รบกวนพี่แปะลิ้งค์ให้ได้ไหมคะ

    ReplyDelete