今日の使用PPT - 情報メディア学科演習室

メディアプログラミング演習
―第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)の説明