320 likes | 332 Views
MATLIP: MATLAB-Like Language for Image Processing. Pin-Chin Huang ( ph2249@columbia.edu ) Shariar Zaber Kazi ( szk2103@columbia.edu ) Shih-Hao Liao ( sl2937@columbia.edu ) PoHsu Yeh ( py2157@columbia.edu ). Motivation. Easy to code Easy to access pixels of an image
E N D
MATLIP: MATLAB-Like Language for Image Processing Pin-Chin Huang (ph2249@columbia.edu) Shariar Zaber Kazi (szk2103@columbia.edu) Shih-Hao Liao (sl2937@columbia.edu) PoHsu Yeh (py2157@columbia.edu)
Motivation • Easy to code • Easy to access pixels of an image • Easy to do image arithmetic operation • Easy to do image convolution • Easy to assign images of any size • Easy to debug • No cost for license • Good Portability
Easy to access one pixel of an image public static void main(String[] args) { BufferedImage x = imnew(100, 100, "RGB"); x = imread("./rabbit.jpg"); System.out.println(getImagePixel(x, 1, 1, "RGB")); } static int getImagePixel(BufferedImage im, int col, int row, String channel){ ………………………… } function = main() image x; x=imread("./rabbit.jpg"); print(x[1,1,"RGB"]); end 26 lines of java code
Easy to do image arithmetic operation public static void main(String[] args){ BufferedImage x = imnew(100, 100, "RGB"); BufferedImage y = imnew(100, 100, "RGB"); x = imread("./rabbit.jpg"); x = (BufferedImage)clone((BufferedImage)doArithmetic(x, 1, OPERATION.ADD)); x = (BufferedImage)clone((BufferedImage)doArithmetic(x, 1, OPERATION.SUB)); x = (BufferedImage)clone((BufferedImage)doArithmetic(x, 1, OPERATION.MUL)); x = (BufferedImage)clone((BufferedImage)doArithmetic(x, 1, OPERATION.DIV)); x = (BufferedImage)clone((BufferedImage)doArithmetic(x, y, OPERATION.ADD)); } static Object doArithmetic(Object op1, Object op2, OPERATION op){……………} static Object clone(Object src){ ……………………} function = main() image x; image y; x=x+1; x=x-1; x=x*1; x=x/1; x=x+y; end 150 lines of java code
Easy to do image convolution public static void main(String[] args){ BufferedImage x = imnew(100, 100, "RGB"); Kernel k = kernelinit(); x = (BufferedImage)clone(convolve(x, k)); } static BufferedImage convolve(BufferedImage im, Kernel k){ …………………. } static Object clone(Object src){ ……………………. } function = main() image x; kernel k; x=x@k; end 45 lines of java code
Easy to assign image to image of different size function = main() image a; image b; a = imnew(300,300,"RGB"); b = imnew(200,200,"RGB"); a=b; end public static void main(String[] args) { BufferedImage a = imnew(100, 100, "RGB"); BufferedImage b = imnew(100, 100, "RGB"); a = imnew(300, 300, "RGB"); b = imnew(200, 200, "RGB"); a = (BufferedImage)clone(b); } static BufferedImage imnew(int width, int height, String type){ ………….. } static Object clone(Object src){ ……………………… } 50 lines of java code
Easy to debug function = main() int i; for i=0:(int y):100 x=x+1; end y=0; end function int m = test (int x) end function = main () float x; x=1.0; test(x); end syntax error in line #3 Fatal error: exception Parsing.Parse_error Fatal error: exception Failure("Type mismatch in argument passing between: 'x', type: int and 'x', type: float in function: 'test'“)
Easy to debug function int m = test () end function = main () int x; x=1; test(x); end function = main() image x; imshow(x); x = imread("./rabbit.jpg"+x); imshow(x); imsave(x,"./rabbit.jpg"); x = imnew(300,300,"RGB"); imshow(x); end Fatal error: exception Failure(“Wrong number of arguments passed to function: ‘test’”) Fatal error: exception Failure("Cannot concatenate image type with string type in function: 'main'")
No cost for license Image Processing Toolbox 6.2 (MATLAP) • Individual LicenseFor: End userActivation types: Standalone named user or designated computer • $1,000 • BuyRequest a Quote (via fax or e-mail)Contact Sales • For an end user who wants to personally install, administer, and operate the software. • Group LicenseFor: WorkgroupActivation Types: Standalone named users or designated computers • Request a Quote (via fax or e-mail)Contact Sales • For organizations who would like to designate an administrator to manage a group of Individual licenses.
Tutorial introduction • Variable declaration and assignment: int a; float b; boolean c; kernel k; image i; function = main() a=1; b=0.1; c=true; k=kernelnew(10,10); k=[0.0,0.1;0.3,0.4]; i=imnew(10,10,”RGB”); end int a=3; float b=0.3; boolean c =true; Kernel k=kernelnew(10,10); Image i=imnew(10,10,”RGB”);
Arithmetic Operation Int a; Int b; float c; float d; funciton = main() a=a+b; a=a-b; a=a*b; a=a/b; a=a^b; a=mod(a,b); c=c+d; c=c-d; c=c*d; c=c/d; end image a; image b; int c; function =main() a=a+b; a=a-b; a=a*b; a=a/b; a=a*2+b; a=a*c+b; a=a*2.0; (NOT OK) a=2*a;(NOT OK) end kernel k1; kernel k2; float a; function = main() k1=k1+k2; k1=k1-k2; k1=k1*k2; k1=k1/k2; k1=k1*2.0+k2; k1=k1*a+k2; k1=k1*2+k2;(NOT OK) k1=2.0*k1+k2;(NOT OK) end
Control Flow Statement int x; funciton=main() x=1; If x==1 x=x+1; end end int x; function=main() x=1; If x==1 x=x+1; elseifx==2 x=x+2; elseifx==3 x=x+3; else x=x+4; end end Int x; function=main() x=1; if x==1 x=x+1; else x=x+2; end Int x; function=main() x=1; if x==1 x=x+1; elseif x==2 x=x+2; end
Control Flow Statement function = main() int x; inti; for i=0:1:10 x=x+1; endend function = main() Int x; while x<3 x=x+1; end end
Function function = test() end function main() test(); end function int m= test(int x) m=d; end function main() Int d; d=test(d); end function main() Int d; d=test(); End function int m= test() end
Recursion function int m = foo (int x) if(x > 0) m=foo(x-1); else m=-1; end end function int m = bar (int x) m=x+1; end function = main() print(foo(bar(foo(5)))); end
Example (Flip the image vertically) function image ret = flip(image im) int height; int width; int i; int j; height = getheight(im); width = getwidth(im); ret=imnew(width,height,"RGB"); for j=0:height-1 for i=0:width-1 ret[i,height-j-1,"rgb"]=im[i,j,"rgb"]; end end end function = main() image x; image y; x=imread("./rabbit.jpg"); imshow(x); y=flip(x); imshow(y); end
Example (Flip the image horizontally) function image ret = flip(image im) int height; int width; int i; int j; height = getheight(im); width = getwidth(im); ret=imnew(width,height,"RGB"); for j=0:height-1 for i=0:width-1 ret[width-i-1,j,"rgb"] = im[i,j,"rgb"]; end end end function = main() image x; image y; x=imread("./rabbit.jpg"); imshow(x); y=flip(x); imshow(y); end
Example (Blur the image) function = main() image x; image y; kernel k; k= [0.25,0.0,0.25;0.0,0.0,0.0;0.25,0.0,0.25]; x=imread("./rabbit.jpg"); #x=togray(x); imshow(x); y=x@k@k@k@k@k@k@k; imshow(y); imsave(y,"./r3.gif"); end
Example (Sharpen the image) function = main() image x; image y; kernel k; k= [0.0,-1.0,0.0;-1.0,5.0,-1.0;0.0,-1.0,0.0]; x=imread("./rabbit.jpg"); imshow(x); y=x@k@k; imshow(y); imsave(y,"./r4.gif"); end
Example (Inverse the image) function = main() image x; int i; int j; int width; int height; x=imread("./rabbit.jpg"); width=getwidth(x); height=getheight(x); imshow(x); for j=0:height-1 for i=0:2:width-1 x[i,j,"R"] = 255-x[i,j,"R"]; x[i,j,"G"] = 255-x[i,j,"G"]; x[i,j,"B"] = 255-x[i,j,"B"]; end end imshow(x); end
Example (Rotate the image 900) function image ret = rotate90(image im) int height; int width; int i; int j; height = getheight(im); width = getwidth(im); ret=imnew(height,width,"RGB"); for j=0:height-1 for i=0:width-1 ret[height-j-1,i,"rgb"] = im[i,j,"rgb"]; end end end function = main() image x; image y; x=imread("./rabbit.jpg"); imshow(x); y=rotate90(x); end
Edge Detection kernel k; inti; int j; function image m=edge(image b,kernel k) imshow(b); b = b@k; for i=0:getheight(b) for j=0:getwidth(b) if b[j,i,"grey"] < 0 b[j,i,"grey"] = -b[i,j,"grey"]; end end end imshow(b); imsave(b,"./lena_edge.jpg"); end function = main() image a; image b; a = imread("./lena_color.jpg"); b = togray(a); k = [-5.0, 0.0, 0.0; 0.0, 0.0, 0.0; 0.0, 0.0, 5.0]; edge(b,k); end
Lesson learned • Whenever changes are made, do regression test immediately. • Try to come up with a complete test suite before language design • Use Version Control System • Try to finish the grammar before implementation