27 กรกฎาคม 2552

ไปถ่ายรูปรับปริญญาที่ ม.เกษตร

ไปถ่ายรูปรับปริญญาที่ ม.เกษตร
เจอกระแต เอม แนน 
ไปถ่ายรูปกับว่าที่บัณทิต บราวน์
แล้วปิดท้ายด้วยบังเอิญไปเจอ แฝดปวีณา นัยนา ไม่ได้เจอนานแยกไม่ออกเลยว่าใครเป็นใคร เสื้อม่วงนัยนา
เสื้อเทาปวีณา


23 กรกฎาคม 2552

Example 2 - Analyzing Images

Example 2 - Analyzing Images
เปิดรูป เมล็ดข้าว
I = imread('rice.png');
imshow(I)

สร้าง background
    strel แบบ disk จะได้ เมตริกซ์ที่บริเวณมุม เป็น ศูนย์ ตรงกลางๆ เป็น 1 คล้ายวงกลม
อยู่กลางเมตริกซ์
    imopen เป็น Erosion ตามด้วย Dilation มันจะตรงข้ามกับ closing อ้างอิง
background = imopen(I,strel('disk',15));

ลองวาดกราฟแบบ พื้นผิว ดูความขาวดำของสีพื้น
figure, surf(double(background(1:8:end,1:8:end))),zlim([0 255]);
set(gca,'ydir','reverse');

ทำให้เมล็ดข้าวกับ background สีมันแตกต่างกันมากขึ้น
I2 = I - background;
imshow(I2)
แต่มันจะทำให้ภาพเมล็ดข้าวมืดลง


เพิ่ม contrast ใช้ imadjust(I) = imadjust(I,stretchlim(I)) คือมันจะแผ่ขยายสีให้เต็มช่วงเลย
อ้างอิง
I3 = imadjust(I2);
imshow(I3);


ทำ threshold ให้เป็นภาพขาวกับดำเท่านั้น
level = graythresh(I3);
bw = im2bw(I3,level);
level หาค่าที่เหมาะสมที่จะแบ่งระหว่างสีขาวกับสีดำ ด้วย graythresh(I)
im2bw แปลง grayscale เป็น binary

จะเห็นว่ามีบางจุดที่เป็น noise อยู่ เป็นจุดขาวๆเล็กๆ ทำopenเพื่อให้หายไป
bw = bwareaopen(bw, 50);
imshow(bw)


จากใน Tutorial ให้เราใช้คำสั่ง
cc = bwconncomp(bw, 4);
??? Undefined function or method 'bwconncomp' for input arguments of type 'double'.
ซึงแปลว่า มันไม่มี M File ของ bwcommcompลองหาดูได้ใน C:\Program Files\MATLAB\R2008a\toolbox
ลองลง Image Processing Toolbox™ ดูใหม่ แต่เมื่อติดตั้งใหม่ version ล่าสุด ก็ไม่มี function bwconncomp ให้อยู่ดี
ทีนี้ลองหา function อื่นมาทดแทนที่ใช้หา CC = bwconncomp(BW) returns the connected
components CC found in BW. The
binary image BW can have any dimension. CC is
a structure with four fields.
[CC,NUM] = bwlabel(BW,4)
>> num

num =

    95
มันจะนับออกมาได้ 95 Object

Update 23 ส.ค. 2552
เพื่อให้หมดปัญหา ผมได้หา Matlab 2009a มาจาก ป้อสาธิต ต้องขอขอบคุณเลยนะครับ
ผมก็กลับมาใช้คำสั่งดังเดิมคือ
cc = bwconncomp(bw, 4);
grain = false(size(bw));
ก็จะได้ grainขนาด เท่ากับ bw ดีดำทั้งรูปมา
ต่อไปเราจะ label เมล็ดข้าวด้วยสีต่างๆ
labeled = labelmatrix(cc);
RGB_label = label2rgb(labeled,'jet', 'k', 'shuffle');
figure, imshow(RGB_label)
ซึ่งคำสั่ง label2rgb(L, map, zerocolor,
order)
ปรับแต่ง map ดังนี้

ใส่ zero color ดังนี้
ส่วน order มีแค่ 'noshuffle' กับ 'shuffle' เท่านั้น
ได้รูปที่ lable ออกมาดังนี้


หา พื้นที่ของแต่ละเมล็ด
ด้วยการหา property ของ พื้นที่
graindata = regionprops(cc,'basic');
สามารถเปลี่ยน 'basic' เป็น อย่างอื่นได้อีก


หาเมล็ดข้าวที่ใหญ่ที่สุด
grain_areas = [graindata.Area];
[max_area,idx] = max(grain_areas)
grain(cc.PixelIdxList{idx}) = true;
imshow(grain);

ค่า idx คือ สมาชิกที่ให้ค่าmax เช่น graindata(idx).Area จะได้ค่าคือ max_area เช่นเดียวกัน

จะเห็นได้ค่าไม่ได้เป็นเมล็ดข้าวเมล็ดข้าวที่ใหญ่ที่สุดจริงๆ เพียงแต่มันเป็น 2 เมล็ดติดกันเท่านั้นเอง
ซึ่งอาจต้องกลับไปปรับปรุงในช่วงที่ทำ opening กับ closeing
ซึ่งเราสามารถplot ความถี่ของขนาดของเมล็ดข้าวออกมาดูได้
nbins =20;
figure, hist(grain_areas,nbins)
title('Histogram of Rice Grain Area');
เราก็จะเห็น ค่าถี่ที่ผิดปกติได้

ซึ่งเมล็ดข้าวที่เต็มเมล็ด จะมีพื้นที่ประมาณ 200
ส่วนที่เล็กกว่า นั้นเป็นเมล็ดข้าวที่หัก
และส่วนที่ใหญ่กว่า ก็คือ เมล็ดข้าวที่อยู่ชิดกันเกินไป จนพื้นที่ของทั้งสองเมล็ดรวมกันเป็นอันเดียวนั่นเอง











RGB1 = imread('football.jpg');

Example 2 - Analyzing Images
เปิดรูป เมล็ดข้าว
I = imread('rice.png');
imshow(I)

สร้าง background
    strel แบบ disk จะได้ เมตริกซ์ที่บริเวณมุม เป็น ศูนย์ ตรงกลางๆ เป็น 1 คล้ายวงกลม
อยู่กลางเมตริกซ์
    imopen เป็น Erosion ตามด้วย Dilation มันจะตรงข้ามกับ closing อ้างอิง
background = imopen(I,strel('disk',15));

ลองวาดกราฟแบบ พื้นผิว ดูความขาวดำของสีพื้น
figure, surf(double(background(1:8:end,1:8:end))),zlim([0 255]);
set(gca,'ydir','reverse');

ทำให้เมล็ดข้าวกับ background สีมันแตกต่างกันมากขึ้น
I2 = I - background;
imshow(I2)
แต่มันจะทำให้ภาพเมล็ดข้าวมืดลง


เพิ่ม contrast ใช้ imadjust(I) = imadjust(I,stretchlim(I)) คือมันจะแผ่ขยายสีให้เต็มช่วงเลย
อ้างอิง
I3 = imadjust(I2);
imshow(I3);


ทำ threshold ให้เป็นภาพขาวกับดำเท่านั้น
level = graythresh(I3);
bw = im2bw(I3,level);
level หาค่าที่เหมาะสมที่จะแบ่งระหว่างสีขาวกับสีดำ ด้วย graythresh(I)
im2bw แปลง grayscale เป็น binary

จะเห็นว่ามีบางจุดที่เป็น noise อยู่ เป็นจุดขาวๆเล็กๆ ทำopenเพื่อให้หายไป
bw = bwareaopen(bw, 50);
imshow(bw)















22 กรกฎาคม 2552

หนังสือ Image Processing ด้วย MATLAB

หนังสือ Image Processing ด้วย MATLAB
Computational Colour Science Using MATLAB - Stephen Westland & Caterina Ripamonti
Digital Image Processing Using Matlab - Gonzalez Wood & Eddins
Digital Signal and Image Processing Using MATLAB - Gerard Blanchet & Maurice Charbit
Embedded Image Processing with DSP Examples in MATLAB - Shehrzed Qureshi

21 กรกฎาคม 2552

http://www.mathworks.com/access/helpd...

Morphology Fundamentals: Dilation and Erosion
Dilation คือการเอาค่า maximum ใน neighborhood ทำให้ภาพพองออก
Erosion คือการเอาค่า minimum ใน neigborhood ทำให้ภาพเล็กลง (โดนกัดเซาะ)

Dilating an Image
BW = zeros(9,10);
BW(4:6,4:7) = 1
BW =
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

SE = strel('square',3)
SE =

Flat STREL object containing 3 neighbors.

Neighborhood:
1 1 1
1 1 1
1 1 1


BW2 = imdilate(BW,SE)


ส่วน Erosion ทำตรงกันข้าม
BW1 = imread('circbw.tif');
SE = strel('arbitrary',eye(5));
SE=

Flat STREL object containing 5 neighbors.

Neighborhood:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
BW2 = imerode(BW1,SE);
imshow(BW1)
figure, imshow(BW2)






ดังนั้น morphological opening  คือการทำ Erosion ตามด้วย Dilation ด้วยมิติที่เท่ากัน

สรุปคำสั่ง matlab

สรุปคำสั่ง matlab Example 1 — Reading and Writing Images
close all - ปิด figure
imread() - อ่านรูป
imshow() - แสดงรูป 
imtool() - แสดงรูป + ประมวลผลเบื้องต้น
whos -ดูตัวแปรที่ใข้งานอยู่
figure, imhist() - แสดง histogram ใน figure ใหม่
histeq() - กระจาย histogram / เพิ่ม Contrast
imwrite (I2, 'pout2.png'); - เขียนรูปลงไฟล์
imfinfo('pout2.png') - ดูข้อมูลไฟล์รูป


20 กรกฎาคม 2552

กลับสู่จุดพื้นฐาน

กลับสู่จุดพื้นฐาน
ตอนนี้ เรียนTutorial Image Processing Toolbox จาก matlab
ตั้งเป้าไว้ว่า อาทิตย์นี้จะต่อกล้องกับ Open CV
ดู Image Processing Toolbox จนประมวลผลภาพ นิ้วแตะกระจกให้ได้
ที่ค้างคามาหลายอาทิตย์แล้ว ไปยืมหนังสือ Engineering Computation with Matlab
แต่มีเรื่อง image Processing แค่บทเดียวแย่จัง พรุ่งนี้คงอ่านจบจะได้เอาไปคืนซักที


15 กรกฎาคม 2552

ต่อ Iphone กับ PC ด้วย Socket Program...

ต่อ Iphone กับ PC ด้วย Socket Programming
ก็คือการเขียนโปรแกรมผ่าน TCP/IP นั่นเอง โดยแบ่งเป็น 2 ฝั่ง คือ Client กับ Server
มี 2 อย่างที่ต้องกำหนด คือ address หรือ domain ก็ได้ อีกอย่างคือ port ของ Application
แต่ตอนนี้ไม่รู้ว่า Code ส่วน iPhone ของหมอที่ได้มาใช้ port อะไร ก็เลยยังต่อกันไม่ได้
search ดูหลายภาษา
ภาษา
ชื่อ socket library
VB,C#, VC++
winsock control
Python
socket

 ซึ่งดูไปแล้วเริ่มเขียนด้วย Python จะง่ายมากกว่า
ดูได้ที่ TCP-Socket (Python)
ซึ่งเราจะใช้ PC เป็นฝั่ง server โค้ดที่สำคัญ
# Time server program

from socket import *

import time



s = socket(AF_INET, SOCK_STREAM)     # Create TCP Socket

s.bind(("",8888))                    # Bind to port 8888

s.listen(5)                          # Start listening



while 1:

    client, addr = s.accept()    # Wait for connection

    print "Got a connection from ", addr

    client.send(time.ctime(time.time()))    # Sent time back

    client.close()


ลองดู Microsoft Robotics Studio

ลองดู Microsoft Robotics Studio
พอเข้าไปอ่านแล้วรู้สึกว่า สถาปัตยกรรมมันเจ๋งมากเลย
แต่น่าจะมีข้อเสียคือเรื่องหา จากการต้องเพิ่งพาการส่งข้อมูลด้วย XML
แต่ก็ได้ข้อดีในการรันหลาย Platform มาด้วย

แหล่งเรียนรู้
  1. On-Demand Videos and Screen-Casts
  2. หนังสือจาก ห้องสมุด Programming microsoft Robotics Studio By Sara Morgan Microsoft Press
  3. Virtual Programming Language:VPL Tutorials Overview


สิ่งที่ทำไปแล้ว ทดลองรัน Tutorial ของ VPL กับ เจมส์
  1. รัน Tutorial 1 + ปรับแต่ง


  2. รัน Tutorial 2 + ปรับแต่ง


  3. รัน Tutorial 3

  4. รัน Tutorial 4 + ปรับแต่ง มีการ Simulation lego NXT ด้วย PhyX



02 กรกฎาคม 2552

ความรักระหว่างหุ่นยนต์ 2 เผ่าพันธ์ มอ...

ความรักระหว่างหุ่นยนต์ 2 เผ่าพันธ์ มอบดอกไม้ให้กัน
ได้โจทย์มาจาก อ.ภูดิส ว่าอยากได้หุ่นไปโชว์มอบดอกไม้ในงานแต่งงาน
อ.สยาม เลยมอบงานให้ เจมส์ กับผม ไปหาวิธีมอบดอกไม้
สุดท้ายมาได้ที่ให้หุ่น 2 ตัวมอบดอกไม้ให้กัน



เอาวีโมท(Wiimote)ควบคุม เลโก้เน็ค(Leg...

เอาวีโมท(Wiimote)ควบคุม เลโก้เน็ค(Lego NXT)
ดาวน์โหลด WiimoteControllNXT
หลักการ
    ต่อ wiimote กับคอมพิวเตอร์ผ่าน Bluetooth แล้วอ่านค่าการกดปุ่มด้วย
อีกส่วนหนึ่งคือการต่อ NXT กับ คอมพิวเตอร์ ผ่าน Bluetooth เช่นกัน แล้วควบคุมด้วย AForge.Net library
สิ่งที่ต้องการ
  1. Microsoft Visual C#
  2. AForge.Net
  3. WiimoteLib
Codeที่สำคัญ
เชื่อมต่อกับ NXT
            if (nxt.Connect("COM7"))
            {
                int power;
                nxt.GetBatteryPower(out power);
                System.Diagnostics.Debug.WriteLine(power);
                System.Diagnostics.Debug.WriteLine("Connected successfully ");
            }
            else
            {
                MessageBox.Show("Failed connecting to NXT device", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

เชื่อมต่อกับ wiimote
            wm.WiimoteChanged += new WiimoteChangedEventHandler(wm_WiimoteChanged);
            wm.WiimoteExtensionChanged += new WiimoteExtensionChangedEventHandler(wm_WiimoteExtensionChanged);
            wm.Connect();
การเช็ตค่าให้มอเตอร์ วิ่ง
            NXTBrick.MotorState motorStateGo = new NXTBrick.MotorState();
            WiimoteState ws = args.WiimoteState;
            //set motorState Go
            motorStateGo.Power = (sbyte)127;
            motorStateGo.TurnRatio = (sbyte)50;
            motorStateGo.Mode = NXTBrick.MotorMode.On;// NXTBrick.MotorMode.Brake, NXTBrick.MotorMode.None, NXTBrick.MotorMode.Regulated
            motorStateGo.RunState = runStates[2]; //0:Idle, 1:RampUp, 2:Running, 3:RampDown
การเช็คค่าให้มอเตอร์ หยุด
            NXTBrick.MotorState motorStateStop = new NXTBrick.MotorState();
            //set motorState Stop
            motorStateStop.Power = (sbyte)0;
            motorStateStop.TurnRatio = (sbyte)0;
           
motorStateStop.Mode = NXTBrick.MotorMode.None;//
NXTBrick.MotorMode.Brake, NXTBrick.MotorMode.None,
NXTBrick.MotorMode.Regulated
            motorStateStop.RunState = runStates[0]; //0:Idle, 1:RampUp, 2:Running, 3:RampDown
เมื่อกดปุ่มซ้ายให้มอเตอร์ C หมุน
            if (ws.ButtonState.Left)
            {
                // set motor's state
                if (nxt.SetMotorState(NXTBrick.Motor.C, motorStateGo) != true )
                {
                    System.Diagnostics.Debug.WriteLine("Failed setting motor state");
                }
            }