メディアプログラミング演習 ―第1回(第1テーマ2日目)― 画像変換ーその2 プログラムの雛形 • Sample1の概要 ・img_inに読み込む,表示 ・全てのx,yに対して 画像img_in のピクセル(x,y) への操作 → 画像img_out ・img_outの表示,書き出し プログラムの構造 PImage img_in, img_out; void setup() { img_in = loadImage("sample1‐1.jpg"); size(img_in.width*2, img_in.height); noLoop(); } void draw() { img_out = createImage( img_in.width, img_in.height, RGB ); image(img_in,0,0); img_in.loadPixels(); img_out.updatePixels(); image(img_out,img_in.width,0); img_out.save("upd.jpg"); } for ( int y = 0; y < img_in.height; y++) { for ( int x = 0; x < img_in.width; x++) { int pos = x + y*img_in.width; color c = img_in.pixels[pos]; float r = red( c ); float g = green( c ); float b = blue( c ); float gray = 0.3 * r + 0.59 * g + 0.11 * b; img_out.pixels[pos] = color(gray,gray,gray); } } プログラムの構造 PImage img_in, img_out; void setup() { img_in = loadImage("sample1‐1.jpg"); size(img_in.width*2, img_in.height); noLoop(); } void draw() { img_out = createImage( img_in.width, img_in.height, RGB ); image(img_in,0,0); img_in.loadPixels(); img_out.updatePixels(); image(img_out,img_in.width,0); img_out.save("upd.jpg"); } for ( int y = 0; y < img_in.height; y++) { for ( int x = 0; x < img_in.width; x++) { int pos = x + y*img_in.width; float gr = gray(x,y) ; img_out.pixels[pos] = color(gr, gr, gr); } } 関数gray()を加える 実際の「処理」の記述 for ( int y = 0; y < img_in.height; y+=1) { for ( int x = 0; x < img_in.width; x+=1) { float gw=gray(x,y); int pos = x + y*img_in.width; img_out.pixels[pos] = color(gw,gw,gw); } } 2-1 関数化(RGBー>グレースケール) float gray(int x, int y){ int pos = x + img_in.width*y; color c = img.pixels[pos]; float r = red( c ); float g = green( c ); float b = blue( c ); return( 0.3 * r + 0.59 * g + 0.11 * b); } • グレースケール化(確認) サンプル画像 Sample1‐1 Sample1‐2 2-1 4階調変換 ここがキー float gw=gray(x,y); gw=int(gw/64)*64; int pos = x + y*img_in.width; img_out.pixels[pos] = color(gw,gw,gw); 2-2 4階調変換 2-3 反転画像 ここがキー float gw=gray(x,y); gw=255‐gw; int pos = x + y*img_in.width; img_out.pixels[pos] = color(gw,gw,gw); 2-3 反転画像 2-4 ミラー反転 ここがキー int pos1 = x + y*img_in.width; int pos2 = (img_in.width‐x‐1) + y*img_in.width; img_out.pixels[pos2] = img_in.pixels[pos1]; 2-4 ミラー反転 2-5 セピア化 マンセルの色立体(HLS表現) 2015/06/30 情報メディア概論 15 2-5 セピア化 colorMode(HSB,360,100,100) int pos = x + y*img_in.width; float h=hue(img_in.pixels[pos]); float s=saturation(img_in.pixels[pos]); float b=brightness(img_in.pixels[pos]); img_out.pixels[pos]=color(29,s,b); セピア化(2-5) 2-6 モザイク処理 int d=8; for ( int y = 0; y < img_in.height‐d; y+=d) { for ( int x = 0; x < img_in.width‐d; x+=d){ int pos1 = x + y*img_in.width; for(int xd=0;xd<d;xd++){ for(int yd=0;yd<d;yd++){ int pos2 = (x+xd) + (y+yd)*img_in.width; img_out.pixels[pos2] = img_in.pixels[pos1]; } } } } モザイク処理(2-6) 2-6 改良版 左上の画素値で、dxdの正方形領域を塗り潰す dxdの領域の平均値で塗り潰す (平均値:rgb各々の平均値) レポートでの課題 2-6 改良版の考え方 int d=8; for ( int y = 0; y < img_in.height‐d; y+=d) { for ( int x = 0; x < img_in.width‐d; x+=d){ int pos1 = x + y*img_in.width; : : x ~x+d, y~y+d 領域のrgb : 各々の平均値を求める ->(r,g,b) : for(int xd=0;xd<d;xd++){ for(int yd=0;yd<d;yd++){ int pos2 = (x+xd) + (y+yd)*img_in.width; img_out.pixels[pos2] = color(r,g,b) ; } } } } これからと来週 これから: 来週:画像変換 画素の微分による変換を中心に レポート(その1)の説明
© Copyright 2024 ExpyDoc